Platform SDK: DLLs, Processes, and Threads

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; 
    LPSERVICE_DESCRIPTION lpqscBuf2;
    DWORD dwBytesNeeded; 
 
    // Open a handle to the service. 
 
    schService = OpenService( 
        schSCManager,           // SCManager database 
        "Sample_Srv",           // name of service 
        SERVICE_QUERY_CONFIG);  // need QUERY access 
    if (schService == NULL) 
        MyErrorExit("OpenService"); 
 
    // Allocate a buffer for the configuration information. 
 
    lpqscBuf = (LPQUERY_SERVICE_CONFIG) LocalAlloc( 
        LPTR, 4096); 
    if (lpqscBuf == NULL) 
        MyErrorExit("LocalAlloc"); 
 
    lpqscBuf2 = (LPSERVICE_DESCRIPTION) LocalAlloc( 
        LPTR, 4096); 
    if (lpqscBuf2 == NULL) 
        MyErrorExit("LocalAlloc"); 
 
    // Get the configuration information. 
 
    if (! QueryServiceConfig( 
        schService, 
        lpqscBuf, 
        4096, 
        &dwBytesNeeded) ) 
    {
        MyErrorExit("QueryServiceConfig"); 
    }
 
    if (! QueryServiceConfig2( 
        schService, 
        SERVICE_CONFIG_DESCRIPTION,
        lpqscBuf2, 
        4096, 
        &dwBytesNeeded) ) 
    {
        MyErrorExit("QueryServiceConfig2"); 
    }
 
    // 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); 
}