Querying a Service's Configuration
In the following example, a service configuration program uses the OpenService function to get a handle with SERVICE_QUERY_CONFIG access to an installed service object. Then the program uses the service object handle in the QueryServiceConfig function to retrieve the current configuration of the service.
#include <windows.h> #include <stdio.h> BOOL GetSampleServiceConfig() { LPQUERY_SERVICE_CONFIG lpqscBuf; LPSERVICE_DESCRIPTION lpqscBuf2; DWORD dwBytesNeeded; BOOL bSuccess=TRUE; // Open a handle to the service. schService = OpenService( schSCManager, // SCManager database TEXT("Sample_Srv"), // name of service SERVICE_QUERY_CONFIG); // need QUERY access if (schService == NULL) { printf("OpenService failed (%d)", GetLastError()); return FALSE; } // Allocate a buffer for the configuration information. lpqscBuf = (LPQUERY_SERVICE_CONFIG) LocalAlloc( LPTR, 4096); if (lpqscBuf == NULL) { return FALSE; } lpqscBuf2 = (LPSERVICE_DESCRIPTION) LocalAlloc( LPTR, 4096); if (lpqscBuf2 == NULL) { return FALSE; } // Get the configuration information. if (! QueryServiceConfig( schService, lpqscBuf, 4096, &dwBytesNeeded) ) { printf("QueryServiceConfig failed (%d)", GetLastError()); bSuccess = FALSE; } if (! QueryServiceConfig2( schService, SERVICE_CONFIG_DESCRIPTION, lpqscBuf2, 4096, &dwBytesNeeded) ) { printf("QueryServiceConfig2 failed (%d)", GetLastError()); bSuccess = FALSE; } // Print the configuration information. printf("/nSample_Srv configuration: /n"); printf(" Type: 0x%x/n", lpqscBuf->dwServiceType); printf(" Start Type: 0x%x/n", lpqscBuf->dwStartType); printf(" Error Control: 0x%x/n", lpqscBuf->dwErrorControl); printf(" Binary path: %s/n", lpqscBuf->lpBinaryPathName); if (lpqscBuf->lpLoadOrderGroup != NULL) printf(" Load order group: %s/n", lpqscBuf->lpLoadOrderGroup); if (lpqscBuf->dwTagId != 0) printf(" Tag ID: %d/n", lpqscBuf->dwTagId); if (lpqscBuf->lpDependencies != NULL) printf(" Dependencies: %s/n", lpqscBuf->lpDependencies); if (lpqscBuf->lpServiceStartName != NULL) printf(" Start Name: %s/n", lpqscBuf->lpServiceStartName); if (lpqscBuf2->lpDescription != NULL) printf(" Description: %s/n", lpqscBuf2->lpDescription); LocalFree(lpqscBuf); LocalFree(lpqscBuf2); return bSuccess; }