H
Du kannst mittels EnumServicesStatus und QueryServiceConfig eine QUERY_SERVICE_CONFIG Struktur füllen, in der auch der binary name des Treibers enthalten ist. Wie sich das ganze verhält, wenn zu dem Treiber mehrere Dateien gehören, kann ich dir jetzt auch nicht sagen.
Gruß
SC_HANDLE scman = OpenSCManager(NULL,NULL,SC_MANAGER_ENUMERATE_SERVICE);
if (scman) {
ENUM_SERVICE_STATUS service, *lpservice;
BOOL rc;
DWORD bytesNeeded,servicesReturned,resumeHandle = 0;
rc = EnumServicesStatus(scman,SERVICE_DRIVER,SERVICE_STATE_ALL,&service,sizeof(service),
&bytesNeeded,&servicesReturned,&resumeHandle);
if ((rc == FALSE) && (GetLastError() == ERROR_MORE_DATA)) {
DWORD bytes = bytesNeeded + sizeof(ENUM_SERVICE_STATUS);
lpservice = new ENUM_SERVICE_STATUS [bytes];
EnumServicesStatus(scman,SERVICE_DRIVER,SERVICE_STATE_ALL,lpservice,bytes,
&bytesNeeded,&servicesReturned,&resumeHandle);
TCHAR Buffer[1024]; // Should be enough for service info
QUERY_SERVICE_CONFIG *lpqch = (QUERY_SERVICE_CONFIG*)Buffer;
for (DWORD ndx = 0; ndx < servicesReturned; ndx++) {
SC_HANDLE sh = OpenService(scman,lpservice[ndx].lpServiceName,SERVICE_QUERY_CONFIG);
if (QueryServiceConfig(sh,lpqch,sizeof(Buffer),&bytesNeeded)) {
CString strPath = lpqch->lpBinaryPathName;
}
CloseServiceHandle(sh);
} // foreach service
delete [] lpservice;
}
CloseServiceHandle(scman);
}