Navigation:  Examples >

List active services

Previous pageReturn to chapter overviewNext page

http://news.xbwin.com/ot4xb.examples/2/

 

function aGetActiveServices()

   local hSc :=  @advapi32:OpenSCManagerA(0,0,SC_MANAGER_ENUMERATE_SERVICE)

   local lResult

   local pData,cbData

   local nRH      := 0  // Resume Handle

   local cbNeeded := 0

   local nSvcCnt  := 0

   local lLoop    := .T.

   local aSvc     := {}

   local n,ns

 

   if( hSc == 0 )

      return {} 

   end

 

   cbData := 0x10000

   pData  := _xgrab(cbData)

 

   while lLoop

      nSvcCnt  := 0

      lResult := ( @advapi32:EnumServicesStatusExA( hSc,SC_ENUM_PROCESS_INFO,;

                   nOr(SERVICE_DRIVER,SERVICE_WIN32),SERVICE_ACTIVE,pData,cbData,;

                   @cbNeeded,@nSvcCnt,@nRH,0) != 0 )

                

      lLoop := (nFpGetLastError() == ERROR_MORE_DATA)

      if( lResult .or. lLoop )

         ns := 0

         for n := 1 to nSvcCnt

            aadd( aSvc , PeekDWord(pData,@ns, 11) )

            aSvc[-1][1] := PeekStr(aSvc[-1][1],,-1)

            aSvc[-1][2] := PeekStr(aSvc[-1][2],,-1)

         next

      end

      if lLoop .and. ( cbNeeded > cbData )

          _xfree( pData ); cbData := cbNeeded ; pData  := _xgrab(cbData)

      end

   end

   _xfree( pData )

   @advapi32:CloseServiceHandle(hSc)

return aSvc