Quick actions

cmd+k|ctrl+k

Navigation

Languages

Untitled

Snippet info

Language

Nim

Visibility

unlisted

Author

legacy-anonymous

Created

2019-04-09T14:41:44Z

Updated

2019-04-09T14:41:44Z

import winim/lean,strformat

proc main =
    let hSCManager = OpenSCManagerW(
        nil,
        nil,
        SC_MANAGER_ENUMERATE_SERVICE
        )
    let errSCManager = GetLastError()
    echo fmt"OpenSCManager err: {errSCManager}"

    var
        dwServiceType: DWORD = SERVICE_WIN32
        dwServiceState: DWORD = SERVICE_STATE_ALL
        cbBufSize: DWORD = 43453
        lpServices = addr cbBufSize 
        pcbBytesNeeded: DWORD
        lpServicesReturned: DWORD
        resumeHandle: DWORD


    let retVal = EnumServicesStatusW(
    hSCManager,
    dwServiceType,
    dwServiceState,
    cast [LPENUM_SERVICE_STATUSW](&lpServices),
    cbBufSize,   
    cast [ptr DWORD](&pcbBytesNeeded),
    cast [ptr DWORD](&lpServicesReturned),
    cast [ptr DWORD](&resumeHandle)
    )
    let errEnumServicesStatus = GetLastError()
    echo fmt"EnumServicesStatus: {errEnumServicesStatus} {pcbBytesNeeded}"

    if retVal == FALSE or errEnumServicesStatus == ERROR_MORE_DATA:
        var dwBytes: DWORD = cbBufSize + int32(sizeof(ENUM_SERVICE_STATUS))
        # ???????
        # var lpServices = newSeq[ENUM_SERVICE_STATUS](dwBytes)
        EnumServicesStatusW(
            hSCManager,
            dwServiceType,
            dwServiceState,
            cast [LPENUM_SERVICE_STATUSW](&lpServices),
            cbBufSize,   
            cast [LPDWORD](&pcbBytesNeeded),
            cast [LPDWORD](&lpServicesReturned),
            cast [LPDWORD](&resumeHandle)
        )
    # ?????
    # for i in 0..<cast[DWORD](lpServicesReturned):
    #     echo lpServices[i].lpDisplayName

when isMainModule:
    main()
INFO