Getting Service Path to Executable

后端 未结 1 1589
心在旅途
心在旅途 2021-01-21 20:52

Consider following figure.

\"Path

I have written following code that is supposed to get th

1条回答
  •  北恋
    北恋 (楼主)
    2021-01-21 21:16

    QueryServiceConfig requires a pointer that points to allocated memory as the second parameter if you specify a size with the third parameter. You specify the size, but the pointer is NULL, which causes the crash.

    lpServiceConfig [out, optional]

    A pointer to a buffer that receives the service configuration information. The format of the data is a QUERY_SERVICE_CONFIG structure.

    The maximum size of this array is 8K bytes. To determine the required size, specify NULL for this parameter and 0 for the cbBufSize parameter. The function will fail and GetLastError will return ERROR_INSUFFICIENT_BUFFER. The pcbBytesNeeded parameter will receive the required size.*

    You will have to allocate memory for lpServiceConfig parameter.

    Here is an official example:

    Querying a Service's Configuration

    //
    // Purpose: 
    //   Retrieves and displays the current service configuration.
    //
    // Parameters:
    //   None
    // 
    // Return value:
    //   None
    //
    VOID __stdcall DoQuerySvc()
    {
        SC_HANDLE schSCManager;
        SC_HANDLE schService;
        LPQUERY_SERVICE_CONFIG lpsc; 
        LPSERVICE_DESCRIPTION lpsd;
        DWORD dwBytesNeeded, cbBufSize, dwError; 
    
        // Get a handle to the SCM database. 
    
        schSCManager = OpenSCManager( 
            NULL,                    // local computer
            NULL,                    // ServicesActive database 
            SC_MANAGER_ALL_ACCESS);  // full access rights 
    
        if (NULL == schSCManager) 
        {
            printf("OpenSCManager failed (%d)\n", GetLastError());
            return;
        }
    
        // Get a handle to the service.
    
        schService = OpenService( 
            schSCManager,          // SCM database 
            szSvcName,             // name of service 
            SERVICE_QUERY_CONFIG); // need query config access 
    
        if (schService == NULL)
        { 
            printf("OpenService failed (%d)\n", GetLastError()); 
            CloseServiceHandle(schSCManager);
            return;
        }
    
        // Get the configuration information.
    
        if( !QueryServiceConfig( 
            schService, 
            NULL, 
            0, 
            &dwBytesNeeded))
        {
            dwError = GetLastError();
            if( ERROR_INSUFFICIENT_BUFFER == dwError )
            {
                cbBufSize = dwBytesNeeded;
                lpsc = (LPQUERY_SERVICE_CONFIG) LocalAlloc(LMEM_FIXED, cbBufSize);
            }
            else
            {
                printf("QueryServiceConfig failed (%d)", dwError);
                goto cleanup; 
            }
        }
    
        if( !QueryServiceConfig( 
            schService, 
            lpsc, 
            cbBufSize, 
            &dwBytesNeeded) ) 
        {
            printf("QueryServiceConfig failed (%d)", GetLastError());
            goto cleanup;
        }
    
        if( !QueryServiceConfig2( 
            schService, 
            SERVICE_CONFIG_DESCRIPTION,
            NULL, 
            0, 
            &dwBytesNeeded))
        {
            dwError = GetLastError();
            if( ERROR_INSUFFICIENT_BUFFER == dwError )
            {
                cbBufSize = dwBytesNeeded;
                lpsd = (LPSERVICE_DESCRIPTION) LocalAlloc(LMEM_FIXED, cbBufSize);
            }
            else
            {
                printf("QueryServiceConfig2 failed (%d)", dwError);
                goto cleanup; 
            }
        }
    
        if (! QueryServiceConfig2( 
            schService, 
            SERVICE_CONFIG_DESCRIPTION,
            (LPBYTE) lpsd, 
            cbBufSize, 
            &dwBytesNeeded) ) 
        {
            printf("QueryServiceConfig2 failed (%d)", GetLastError());
            goto cleanup;
        }
    
        // Print the configuration information.
    
        _tprintf(TEXT("%s configuration: \n"), szSvcName);
        _tprintf(TEXT("  Type: 0x%x\n"), lpsc->dwServiceType);
        _tprintf(TEXT("  Start Type: 0x%x\n"), lpsc->dwStartType);
        _tprintf(TEXT("  Error Control: 0x%x\n"), lpsc->dwErrorControl);
        _tprintf(TEXT("  Binary path: %s\n"), lpsc->lpBinaryPathName);
        _tprintf(TEXT("  Account: %s\n"), lpsc->lpServiceStartName);
    
        if (lpsd->lpDescription != NULL && lstrcmp(lpsd->lpDescription, TEXT("")) != 0)
            _tprintf(TEXT("  Description: %s\n"), lpsd->lpDescription);
        if (lpsc->lpLoadOrderGroup != NULL && lstrcmp(lpsc->lpLoadOrderGroup, TEXT("")) != 0)
            _tprintf(TEXT("  Load order group: %s\n"), lpsc->lpLoadOrderGroup);
        if (lpsc->dwTagId != 0)
            _tprintf(TEXT("  Tag ID: %d\n"), lpsc->dwTagId);
        if (lpsc->lpDependencies != NULL && lstrcmp(lpsc->lpDependencies, TEXT("")) != 0)
            _tprintf(TEXT("  Dependencies: %s\n"), lpsc->lpDependencies);
    
        LocalFree(lpsc); 
        LocalFree(lpsd);
    
    cleanup:
        CloseServiceHandle(schService); 
        CloseServiceHandle(schSCManager);
    }
    

    0 讨论(0)
提交回复
热议问题