SVN maintenance Modified: trunk/reactos/subsys/system/services/config.c Modified: trunk/reactos/subsys/system/services/driver.c Modified: trunk/reactos/subsys/system/services/groupdb.c _____
Modified: trunk/reactos/subsys/system/services/config.c --- trunk/reactos/subsys/system/services/config.c 2005-12-31 18:56:34 UTC (rev 20491) +++ trunk/reactos/subsys/system/services/config.c 2005-12-31 19:02:48 UTC (rev 20492) @@ -1,298 +1,298 @@
-/* - * config.c - */ - -/* INCLUDES *****************************************************************/ - -#include "services.h" - -#define NDEBUG -#include <debug.h> - -/* FUNCTIONS *****************************************************************/ - - -DWORD -ScmOpenServiceKey(LPWSTR lpServiceName, - REGSAM samDesired, - PHKEY phKey) -{ - HKEY hServicesKey = NULL; - DWORD dwError; - - *phKey = NULL; - - dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE, - L"System\CurrentControlSet\Services", - 0, - KEY_READ, - &hServicesKey); - if (dwError != ERROR_SUCCESS) - return dwError; - - dwError = RegOpenKeyExW(hServicesKey, - lpServiceName, - 0, - samDesired, - phKey); - - RegCloseKey(hServicesKey); - - return dwError; -} - - -DWORD -ScmCreateServiceKey(LPWSTR lpServiceName, - REGSAM samDesired, - PHKEY phKey) -{ - HKEY hServicesKey = NULL; - DWORD dwDisposition; - DWORD dwError; - - *phKey = NULL; - - dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE, - L"System\CurrentControlSet\Services", - 0, - KEY_READ | KEY_CREATE_SUB_KEY, - &hServicesKey); - if (dwError != ERROR_SUCCESS) - return dwError; - - dwError = RegCreateKeyExW(hServicesKey, - lpServiceName, - 0, - NULL, - REG_OPTION_NON_VOLATILE, - samDesired, - NULL, - phKey, - &dwDisposition); -#if 0 - if ((dwError == ERROR_SUCCESS) && - (dwDisposition == REG_OPENED_EXISTING_KEY)) - { - RegCloseKey(*phKey); - *phKey = NULL; - dwError = ERROR_SERVICE_EXISTS; - } -#endif - - RegCloseKey(hServicesKey); - - return dwError; -} - - - -DWORD -ScmWriteDependencies(HKEY hServiceKey, - LPWSTR lpDependencies, - DWORD dwDependenciesLength) -{ - DWORD dwError = ERROR_SUCCESS; - DWORD dwGroupLength = 0; - DWORD dwServiceLength = 0; - DWORD dwLength; - LPWSTR lpGroupDeps; - LPWSTR lpServiceDeps; - LPWSTR lpSrc; - LPWSTR lpDst; - - if (*lpDependencies == 0) - { - RegDeleteValue(hServiceKey, - L"DependOnService"); - RegDeleteValue(hServiceKey, - L"DependOnGroup"); - } - else - { - lpGroupDeps = HeapAlloc(GetProcessHeap(), - HEAP_ZERO_MEMORY, - (dwDependenciesLength + 2) * sizeof(WCHAR)); - if (lpGroupDeps == NULL) - return ERROR_NOT_ENOUGH_MEMORY; - - lpSrc = lpDependencies; - lpDst = lpGroupDeps; - while (*lpSrc != 0) - { - dwLength = wcslen(lpSrc); - if (*lpSrc == SC_GROUP_IDENTIFIERW) - { - lpSrc++; - dwGroupLength += dwLength; - wcscpy(lpDst, lpSrc); - lpDst = lpDst + dwLength; - } - - lpSrc = lpSrc + dwLength; - } - *lpDst = 0; - lpDst++; - dwGroupLength++; - - lpSrc = lpDependencies; - lpServiceDeps = lpDst; - while (*lpSrc != 0) - { - dwLength = wcslen(lpSrc) + 1; - if (*lpSrc != SC_GROUP_IDENTIFIERW) - { - dwServiceLength += dwLength; - wcscpy(lpDst, lpSrc); - lpDst = lpDst + dwLength; - } - - lpSrc = lpSrc + dwLength; - } - *lpDst = 0; - dwServiceLength++; - - dwError = RegSetValueExW(hServiceKey, - L"DependOnGroup", - 0, - REG_MULTI_SZ, - (LPBYTE)lpGroupDeps, - dwGroupLength * sizeof(WCHAR)); - - if (dwError == ERROR_SUCCESS) - { - dwError = RegSetValueExW(hServiceKey, - L"DependOnService", - 0, - REG_MULTI_SZ, - (LPBYTE)lpServiceDeps, - dwServiceLength * sizeof(WCHAR)); - } - - HeapFree(GetProcessHeap(), 0, lpGroupDeps); - } - - return dwError; -} - - -DWORD -ScmMarkServiceForDelete(PSERVICE pService) -{ - HKEY hServiceKey = NULL; - DWORD dwValue = 1; - DWORD dwError; - - DPRINT("ScmMarkServiceForDelete() called\n"); - - dwError = ScmOpenServiceKey(pService->lpServiceName, - KEY_WRITE, - &hServiceKey); - if (dwError != ERROR_SUCCESS) - return dwError; - - dwError = RegSetValueExW(hServiceKey, - L"DeleteFlag", - 0, - REG_DWORD, - (LPBYTE)&dwValue, - sizeof(DWORD)); - - RegCloseKey(hServiceKey); - - return dwError; -} - - -BOOL -ScmIsDeleteFlagSet(HKEY hServiceKey) -{ - DWORD dwError; - DWORD dwType; - DWORD dwFlag; - DWORD dwSize = sizeof(DWORD); - - dwError = RegQueryValueExW(hServiceKey, - L"DeleteFlag", - 0, - &dwType, - (LPBYTE)&dwFlag, - &dwSize); - - return (dwError == ERROR_SUCCESS); -} - - -DWORD -ScmReadString(HKEY hServiceKey, - LPWSTR lpValueName, - LPWSTR *lpValue) -{ - DWORD dwError; - DWORD dwSize; - DWORD dwType; - DWORD dwSizeNeeded; - LPWSTR expanded = NULL; - LPWSTR ptr = NULL; - - *lpValue = NULL; - - dwSize = 0; - dwError = RegQueryValueExW(hServiceKey, - lpValueName, - 0, - &dwType, - NULL, - &dwSize); - if (dwError != ERROR_SUCCESS) - return dwError; - - ptr = HeapAlloc(GetProcessHeap(), 0, dwSize); - if (ptr == NULL) - return ERROR_NOT_ENOUGH_MEMORY; - - dwError = RegQueryValueExW(hServiceKey, - lpValueName, - 0, - &dwType, - (LPBYTE)ptr, - &dwSize); - if (dwError != ERROR_SUCCESS) - goto done; - - if (dwType == REG_EXPAND_SZ) - { - /* Expand the value... */ - dwSizeNeeded = ExpandEnvironmentStringsW((LPCWSTR)ptr, NULL, 0); - if (dwSizeNeeded == 0) - { - dwError = GetLastError(); - goto done; - } - expanded = HeapAlloc(GetProcessHeap(), 0, dwSizeNeeded * sizeof(WCHAR)); - if (dwSizeNeeded < ExpandEnvironmentStringsW((LPCWSTR)ptr, expanded, dwSizeNeeded)) - { - dwError = GetLastError(); - goto done; - } - *lpValue = expanded; - HeapFree(GetProcessHeap(), 0, ptr); - dwError = ERROR_SUCCESS; - } - else - { - *lpValue = ptr; - } - -done:; - if (dwError != ERROR_SUCCESS) - { - HeapFree(GetProcessHeap(), 0, ptr); - HeapFree(GetProcessHeap(), 0, expanded); - } - - return dwError; -} - -/* EOF */ - +/* + * config.c + */ + +/* INCLUDES *****************************************************************/ + +#include "services.h" + +#define NDEBUG +#include <debug.h> + +/* FUNCTIONS *****************************************************************/ + + +DWORD +ScmOpenServiceKey(LPWSTR lpServiceName, + REGSAM samDesired, + PHKEY phKey) +{ + HKEY hServicesKey = NULL; + DWORD dwError; + + *phKey = NULL; + + dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE, + L"System\CurrentControlSet\Services", + 0, + KEY_READ, + &hServicesKey); + if (dwError != ERROR_SUCCESS) + return dwError; + + dwError = RegOpenKeyExW(hServicesKey, + lpServiceName, + 0, + samDesired, + phKey); + + RegCloseKey(hServicesKey); + + return dwError; +} + + +DWORD +ScmCreateServiceKey(LPWSTR lpServiceName, + REGSAM samDesired, + PHKEY phKey) +{ + HKEY hServicesKey = NULL; + DWORD dwDisposition; + DWORD dwError; + + *phKey = NULL; + + dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE, + L"System\CurrentControlSet\Services", + 0, + KEY_READ | KEY_CREATE_SUB_KEY, + &hServicesKey); + if (dwError != ERROR_SUCCESS) + return dwError; + + dwError = RegCreateKeyExW(hServicesKey, + lpServiceName, + 0, + NULL, + REG_OPTION_NON_VOLATILE, + samDesired, + NULL, + phKey, + &dwDisposition); +#if 0 + if ((dwError == ERROR_SUCCESS) && + (dwDisposition == REG_OPENED_EXISTING_KEY)) + { + RegCloseKey(*phKey); + *phKey = NULL; + dwError = ERROR_SERVICE_EXISTS; + } +#endif + + RegCloseKey(hServicesKey); + + return dwError; +} + + + +DWORD +ScmWriteDependencies(HKEY hServiceKey, + LPWSTR lpDependencies, + DWORD dwDependenciesLength) +{ + DWORD dwError = ERROR_SUCCESS; + DWORD dwGroupLength = 0; + DWORD dwServiceLength = 0; + DWORD dwLength; + LPWSTR lpGroupDeps; + LPWSTR lpServiceDeps; + LPWSTR lpSrc; + LPWSTR lpDst; + + if (*lpDependencies == 0) + { + RegDeleteValue(hServiceKey, + L"DependOnService"); + RegDeleteValue(hServiceKey, + L"DependOnGroup"); + } + else + { + lpGroupDeps = HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, + (dwDependenciesLength + 2) * sizeof(WCHAR)); + if (lpGroupDeps == NULL) + return ERROR_NOT_ENOUGH_MEMORY; + + lpSrc = lpDependencies; + lpDst = lpGroupDeps; + while (*lpSrc != 0) + { + dwLength = wcslen(lpSrc); + if (*lpSrc == SC_GROUP_IDENTIFIERW) + { + lpSrc++; + dwGroupLength += dwLength; + wcscpy(lpDst, lpSrc); + lpDst = lpDst + dwLength; + } + + lpSrc = lpSrc + dwLength; + } + *lpDst = 0; + lpDst++; + dwGroupLength++; + + lpSrc = lpDependencies; + lpServiceDeps = lpDst; + while (*lpSrc != 0) + { + dwLength = wcslen(lpSrc) + 1; + if (*lpSrc != SC_GROUP_IDENTIFIERW) + { + dwServiceLength += dwLength; + wcscpy(lpDst, lpSrc); + lpDst = lpDst + dwLength; + } + + lpSrc = lpSrc + dwLength; + } + *lpDst = 0; + dwServiceLength++; + + dwError = RegSetValueExW(hServiceKey, + L"DependOnGroup", + 0, + REG_MULTI_SZ, + (LPBYTE)lpGroupDeps, + dwGroupLength * sizeof(WCHAR)); + + if (dwError == ERROR_SUCCESS) + { + dwError = RegSetValueExW(hServiceKey, + L"DependOnService", + 0, + REG_MULTI_SZ, + (LPBYTE)lpServiceDeps, + dwServiceLength * sizeof(WCHAR)); + } + + HeapFree(GetProcessHeap(), 0, lpGroupDeps); + } + + return dwError; +} + + +DWORD +ScmMarkServiceForDelete(PSERVICE pService) +{ + HKEY hServiceKey = NULL; + DWORD dwValue = 1; + DWORD dwError; + + DPRINT("ScmMarkServiceForDelete() called\n"); + + dwError = ScmOpenServiceKey(pService->lpServiceName, + KEY_WRITE, + &hServiceKey); + if (dwError != ERROR_SUCCESS) + return dwError; + + dwError = RegSetValueExW(hServiceKey, + L"DeleteFlag", + 0, + REG_DWORD, + (LPBYTE)&dwValue, + sizeof(DWORD)); + + RegCloseKey(hServiceKey); + + return dwError; +} + + +BOOL +ScmIsDeleteFlagSet(HKEY hServiceKey) +{ + DWORD dwError; + DWORD dwType; + DWORD dwFlag; + DWORD dwSize = sizeof(DWORD); + + dwError = RegQueryValueExW(hServiceKey, + L"DeleteFlag", + 0, + &dwType, + (LPBYTE)&dwFlag, + &dwSize); + + return (dwError == ERROR_SUCCESS); +} + + +DWORD +ScmReadString(HKEY hServiceKey, + LPWSTR lpValueName, + LPWSTR *lpValue) +{ + DWORD dwError; + DWORD dwSize; + DWORD dwType; + DWORD dwSizeNeeded; + LPWSTR expanded = NULL; + LPWSTR ptr = NULL; + + *lpValue = NULL; + + dwSize = 0; + dwError = RegQueryValueExW(hServiceKey, + lpValueName, + 0, + &dwType, + NULL, + &dwSize); + if (dwError != ERROR_SUCCESS) + return dwError; + + ptr = HeapAlloc(GetProcessHeap(), 0, dwSize); + if (ptr == NULL) + return ERROR_NOT_ENOUGH_MEMORY; + + dwError = RegQueryValueExW(hServiceKey, + lpValueName, + 0, + &dwType, + (LPBYTE)ptr, + &dwSize); + if (dwError != ERROR_SUCCESS) + goto done; + + if (dwType == REG_EXPAND_SZ) + { + /* Expand the value... */ + dwSizeNeeded = ExpandEnvironmentStringsW((LPCWSTR)ptr, NULL, 0); + if (dwSizeNeeded == 0) + { + dwError = GetLastError(); + goto done; + } + expanded = HeapAlloc(GetProcessHeap(), 0, dwSizeNeeded * sizeof(WCHAR)); + if (dwSizeNeeded < ExpandEnvironmentStringsW((LPCWSTR)ptr, expanded, dwSizeNeeded)) + { + dwError = GetLastError(); + goto done; + } + *lpValue = expanded; + HeapFree(GetProcessHeap(), 0, ptr); + dwError = ERROR_SUCCESS; + } + else + { + *lpValue = ptr; + } + +done:; + if (dwError != ERROR_SUCCESS) + { + HeapFree(GetProcessHeap(), 0, ptr); + HeapFree(GetProcessHeap(), 0, expanded); + } + + return dwError; +} + +/* EOF */ + Property changes on: trunk/reactos/subsys/system/services/config.c ___________________________________________________________________ Name: svn:keywords + author date id revision Name: svn:eol-style + native _____
Modified: trunk/reactos/subsys/system/services/driver.c --- trunk/reactos/subsys/system/services/driver.c 2005-12-31 18:56:34 UTC (rev 20491) +++ trunk/reactos/subsys/system/services/driver.c 2005-12-31 19:02:48 UTC (rev 20492) @@ -1,253 +1,253 @@
-/* - * driver.c - */ - -/* INCLUDES *****************************************************************/ - -#include "services.h" - -#define NDEBUG -#include <debug.h> - -/* FUNCTIONS ****************************************************************/ - -NTSTATUS -ScmLoadDriver(PSERVICE lpService) -{ - WCHAR szDriverPath[MAX_PATH]; - UNICODE_STRING DriverPath; - NTSTATUS Status; - - /* Build the driver path */ - wcscpy(szDriverPath, - L"\Registry\Machine\System\CurrentControlSet\Services\"); - wcscat(szDriverPath, - lpService->lpServiceName); - - RtlInitUnicodeString(&DriverPath, - szDriverPath); - - /* FIXME: Acquire privilege */ - - DPRINT(" Path: %wZ\n", &DriverPath); - Status = NtLoadDriver(&DriverPath); - - /* FIXME: Release privilege */ - - return Status; -} - - -DWORD -ScmUnloadDriver(PSERVICE lpService) -{ - WCHAR szDriverPath[MAX_PATH]; - UNICODE_STRING DriverPath; - NTSTATUS Status; - DWORD dwError = ERROR_SUCCESS; - - /* Build the driver path */ - wcscpy(szDriverPath, - L"\Registry\Machine\System\CurrentControlSet\Services\"); - wcscat(szDriverPath, - lpService->lpServiceName); - - RtlInitUnicodeString(&DriverPath, - szDriverPath); - - /* FIXME: Acquire privilege */ - - Status = NtUnloadDriver(&DriverPath); - - /* FIXME: Release privilege */ - - if (!NT_SUCCESS(Status)) - { - dwError = RtlNtStatusToDosError(Status); - } - - return dwError; -} - - -DWORD -ScmGetDriverStatus(PSERVICE lpService, - LPSERVICE_STATUS lpServiceStatus) -{ - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING DirName; - HANDLE DirHandle; - NTSTATUS Status = STATUS_SUCCESS; - POBJECT_DIRECTORY_INFORMATION DirInfo; - ULONG BufferLength; - ULONG DataLength; - ULONG Index; - DWORD dwError = ERROR_SUCCESS; - BOOLEAN bFound = FALSE; - - DPRINT1("ScmGetDriverStatus() called\n"); - - memset(lpServiceStatus, 0, sizeof(SERVICE_STATUS)); - - if (lpService->Status.dwServiceType == SERVICE_KERNEL_DRIVER) - { - RtlInitUnicodeString(&DirName, - L"\Driver"); - } - else - { - RtlInitUnicodeString(&DirName, - L"\FileSystem"); - } - - InitializeObjectAttributes(&ObjectAttributes, - &DirName, - 0, - NULL, - NULL); - - Status = NtOpenDirectoryObject(&DirHandle, - DIRECTORY_QUERY | DIRECTORY_TRAVERSE, - &ObjectAttributes); - if (!NT_SUCCESS(Status)) - { - DPRINT1("NtOpenDirectoryObject() failed!\n"); - return RtlNtStatusToDosError(Status); - } - - BufferLength = sizeof(OBJECT_DIRECTORY_INFORMATION) + - 2 * MAX_PATH * sizeof(WCHAR); - DirInfo = HeapAlloc(GetProcessHeap(), - HEAP_ZERO_MEMORY, - BufferLength); - - Index = 0; - while (TRUE) - { - Status = NtQueryDirectoryObject(DirHandle, - DirInfo, - BufferLength, - TRUE, - FALSE, - &Index, - &DataLength); - if (Status == STATUS_NO_MORE_ENTRIES) - { - DPRINT("No more services\n"); - break; - } - - if (!NT_SUCCESS(Status)) - break; - - DPRINT("Comparing: '%S' '%wZ'\n", lpService->lpServiceName, &DirInfo->ObjectName); - - if (_wcsicmp(lpService->lpServiceName, DirInfo->ObjectName.Buffer) == 0) - { - DPRINT1("Found: '%S' '%wZ'\n", - lpService->lpServiceName, &DirInfo->ObjectName); - bFound = TRUE; - - break; - } - } - - HeapFree(GetProcessHeap(), - 0, - DirInfo); - NtClose(DirHandle); - - if (!NT_SUCCESS(Status)) - { - DPRINT1("Status: %lx\n", Status); - return RtlNtStatusToDosError(Status); - } - - if ((bFound == TRUE) && - (lpService->Status.dwCurrentState != SERVICE_STOP_PENDING)) - { - if (lpService->Status.dwCurrentState == SERVICE_STOPPED) - { - lpService->Status.dwWin32ExitCode = ERROR_SUCCESS; - lpService->Status.dwServiceSpecificExitCode = ERROR_SUCCESS; - lpService->Status.dwCheckPoint = 0; - lpService->Status.dwWaitHint = 0; - lpService->Status.dwControlsAccepted = 0; - } - else - { - lpService->Status.dwCurrentState = SERVICE_RUNNING; - lpService->Status.dwControlsAccepted = SERVICE_ACCEPT_STOP; - - if (lpService->Status.dwWin32ExitCode == ERROR_SERVICE_NEVER_STARTED) - lpService->Status.dwWin32ExitCode = ERROR_SUCCESS; - } - } - else - { - lpService->Status.dwCurrentState = SERVICE_STOPPED; - lpService->Status.dwControlsAccepted = 0; - lpService->Status.dwCheckPoint = 0; - lpService->Status.dwWaitHint = 0; - - if (lpService->Status.dwCurrentState == SERVICE_STOP_PENDING) - lpService->Status.dwWin32ExitCode = ERROR_SUCCESS; - else - lpService->Status.dwWin32ExitCode = ERROR_GEN_FAILURE; - } - - if (lpServiceStatus != NULL) - { - memcpy(lpServiceStatus, - &lpService->Status, - sizeof(SERVICE_STATUS)); - } - - DPRINT1("ScmGetDriverStatus() done (Error: %lu)\n", dwError); - - return ERROR_SUCCESS; -} - - -DWORD -ScmControlDriver(PSERVICE lpService, - DWORD dwControl, - LPSERVICE_STATUS lpServiceStatus) -{ - DWORD dwError; - - DPRINT("ScmControlDriver() called\n"); - - switch (dwControl) - { - case SERVICE_CONTROL_STOP: - if (lpService->Status.dwCurrentState != SERVICE_RUNNING) - { - dwError = ERROR_INVALID_SERVICE_CONTROL; - goto done; - } - - dwError = ScmUnloadDriver(lpService); - if (dwError == ERROR_SUCCESS) - { - lpService->Status.dwControlsAccepted = 0; - lpService->Status.dwCurrentState = SERVICE_STOPPED; - } - break; - - case SERVICE_CONTROL_INTERROGATE: - dwError = ScmGetDriverStatus(lpService, - lpServiceStatus); - break; - - default: - dwError = ERROR_INVALID_SERVICE_CONTROL; - } - -done:; - DPRINT("ScmControlDriver() done (Erorr: %lu)\n", dwError); - - return dwError; -} - -/* EOF */ +/* + * driver.c + */ + +/* INCLUDES *****************************************************************/ + +#include "services.h" + +#define NDEBUG +#include <debug.h> + +/* FUNCTIONS ****************************************************************/ + +NTSTATUS +ScmLoadDriver(PSERVICE lpService) +{ + WCHAR szDriverPath[MAX_PATH]; + UNICODE_STRING DriverPath; + NTSTATUS Status; + + /* Build the driver path */ + wcscpy(szDriverPath, + L"\Registry\Machine\System\CurrentControlSet\Services\"); + wcscat(szDriverPath, + lpService->lpServiceName); + + RtlInitUnicodeString(&DriverPath, + szDriverPath); + + /* FIXME: Acquire privilege */ + + DPRINT(" Path: %wZ\n", &DriverPath); + Status = NtLoadDriver(&DriverPath); + + /* FIXME: Release privilege */ + + return Status; +} + + +DWORD +ScmUnloadDriver(PSERVICE lpService) +{ + WCHAR szDriverPath[MAX_PATH]; + UNICODE_STRING DriverPath; + NTSTATUS Status; + DWORD dwError = ERROR_SUCCESS; + + /* Build the driver path */ + wcscpy(szDriverPath, + L"\Registry\Machine\System\CurrentControlSet\Services\"); + wcscat(szDriverPath, + lpService->lpServiceName); + + RtlInitUnicodeString(&DriverPath, + szDriverPath); + + /* FIXME: Acquire privilege */ + + Status = NtUnloadDriver(&DriverPath); + + /* FIXME: Release privilege */ + + if (!NT_SUCCESS(Status)) + { + dwError = RtlNtStatusToDosError(Status); + } + + return dwError; +} + + +DWORD +ScmGetDriverStatus(PSERVICE lpService, + LPSERVICE_STATUS lpServiceStatus) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING DirName; + HANDLE DirHandle; + NTSTATUS Status = STATUS_SUCCESS; + POBJECT_DIRECTORY_INFORMATION DirInfo; + ULONG BufferLength; + ULONG DataLength; + ULONG Index; + DWORD dwError = ERROR_SUCCESS; + BOOLEAN bFound = FALSE; + + DPRINT1("ScmGetDriverStatus() called\n"); + + memset(lpServiceStatus, 0, sizeof(SERVICE_STATUS)); + + if (lpService->Status.dwServiceType == SERVICE_KERNEL_DRIVER) + { + RtlInitUnicodeString(&DirName, + L"\Driver"); + } + else + { + RtlInitUnicodeString(&DirName, + L"\FileSystem"); + } + + InitializeObjectAttributes(&ObjectAttributes, + &DirName, + 0, + NULL, + NULL); + + Status = NtOpenDirectoryObject(&DirHandle, + DIRECTORY_QUERY | DIRECTORY_TRAVERSE, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT1("NtOpenDirectoryObject() failed!\n"); + return RtlNtStatusToDosError(Status); + } + + BufferLength = sizeof(OBJECT_DIRECTORY_INFORMATION) + + 2 * MAX_PATH * sizeof(WCHAR); + DirInfo = HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, + BufferLength); + + Index = 0; + while (TRUE) + { + Status = NtQueryDirectoryObject(DirHandle, + DirInfo, + BufferLength, + TRUE, + FALSE, + &Index, + &DataLength); + if (Status == STATUS_NO_MORE_ENTRIES) + { [truncated at 1000 lines; 419 more skipped]