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()