Quick actions

cmd+k|ctrl+k

Navigation

Languages

Untitled

Snippet info

Language

Nim

Visibility

unlisted

Author

legacy-anonymous

Created

2019-04-09T11:20:43Z

Updated

2019-04-09T11:20:43Z

import winim/lean

proc main =
    let hSCManager = OpenSCManagerW(
        nil,
        nil,
        SC_MANAGER_ALL_ACCESS
        )

    var
        dwServiceType: DWORD = SERVICE_WIN32
        dwServiceState: DWORD = SERVICE_STATE_ALL
        lpServices:  ptr ENUM_SERVICE_STATUS
        cbBufSize: DWORD
        pcbBytesNeeded: DWORD
        lpServicesReturned: DWORD
        resumeHandle: DWORD

    let retVal = EnumServicesStatus(
    hSCManager,
    dwServiceType,
    dwServiceState,
    lpServices,
    cbBufSize,
    cast [ptr DWORD](pcbBytesNeeded),
    cast [ptr DWORD](lpServicesReturned),
    cast [ptr DWORD](resumeHandle)
    )

    let err = GetLastError()

    if retVal == FALSE or err == ERROR_MORE_DATA:
        var dwBytes: DWORD = cbBufSize + int32(sizeof(ENUM_SERVICE_STATUS))
        let lpServices = newSeq[ENUM_SERVICE_STATUS](dwBytes)
        EnumServicesStatus(
        hSCManager,
        dwServiceType,
        dwServiceState,
        cast [ptr ENUM_SERVICE_STATUS](lpServices),
        dwBytes,
        cast [ptr DWORD](pcbBytesNeeded),
        cast [ptr DWORD](lpServicesReturned),
        cast [ptr DWORD](resumeHandle)
        )

    for i in 0..<lpServicesReturned:
    #   echo lpservices[i].lpDisplayName 
    
    CloseServiceHandle(hSCManager)

when isMainModule:
    main()
INFO