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.

VOID GetSampleServiceConfig() 
{ 
    LPQUERY_SERVICE_CONFIG lpqscBuf; 
    DWORD dwBytesNeeded; 
 
    // 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) 
        MyErrorExit("OpenService"); 
 
    // Allocate a buffer for the information configuration. 
 
    lpqscBuf = (LPQUERY_SERVICE_CONFIG) LocalAlloc( 
        LPTR, 4096); 
    if (lpqscBuf == NULL) 
        MyErrorExit("LocalAlloc"); 
 
    // Get and print the information configuration. 
 
    if (! QueryServiceConfig( 
        schService, 
        lpqscBuf, 
        4096, 
        &dwBytesNeeded) ) 
    {
        MyErrorExit("QueryServiceConfig"); 
    }
 
    printf("\nSample_Srv configuration: \n"); 
    printf("  Type: 0x%x\n", lpqscBuf->dwServiceType); 
    printf("  Start Type: 0x%x\n", lpqscBuf->dwStartType); 
    printf("  Err 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); 
 
    LocalFree(lpqscBuf); 
}