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