Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygendriver.c
Go to the documentation of this file.
00001 /* 00002 * PROJECT: ReactOS Service Control Manager 00003 * LICENSE: GPL - See COPYING in the top level directory 00004 * FILE: base/system/services/driver.c 00005 * PURPOSE: Driver control interface 00006 * COPYRIGHT: Copyright 2005-2006 Eric Kohl 00007 * 00008 */ 00009 00010 /* INCLUDES *****************************************************************/ 00011 00012 #include "services.h" 00013 00014 #define NDEBUG 00015 #include <debug.h> 00016 00017 /* FUNCTIONS ****************************************************************/ 00018 00019 DWORD 00020 ScmLoadDriver(PSERVICE lpService) 00021 { 00022 WCHAR szDriverPath[MAX_PATH]; 00023 UNICODE_STRING DriverPath; 00024 NTSTATUS Status; 00025 DWORD dwError = ERROR_SUCCESS; 00026 00027 /* Build the driver path */ 00028 wcscpy(szDriverPath, 00029 L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\"); 00030 wcscat(szDriverPath, 00031 lpService->lpServiceName); 00032 00033 RtlInitUnicodeString(&DriverPath, 00034 szDriverPath); 00035 00036 /* FIXME: Acquire privilege */ 00037 00038 DPRINT(" Path: %wZ\n", &DriverPath); 00039 Status = NtLoadDriver(&DriverPath); 00040 00041 /* FIXME: Release privilege */ 00042 00043 if (!NT_SUCCESS(Status)) 00044 { 00045 dwError = RtlNtStatusToDosError(Status); 00046 } 00047 00048 return dwError; 00049 } 00050 00051 00052 DWORD 00053 ScmUnloadDriver(PSERVICE lpService) 00054 { 00055 WCHAR szDriverPath[MAX_PATH]; 00056 UNICODE_STRING DriverPath; 00057 NTSTATUS Status; 00058 DWORD dwError = ERROR_SUCCESS; 00059 00060 /* Build the driver path */ 00061 wcscpy(szDriverPath, 00062 L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\"); 00063 wcscat(szDriverPath, 00064 lpService->lpServiceName); 00065 00066 RtlInitUnicodeString(&DriverPath, 00067 szDriverPath); 00068 00069 /* FIXME: Acquire privilege */ 00070 00071 Status = NtUnloadDriver(&DriverPath); 00072 00073 /* FIXME: Release privilege */ 00074 00075 if (!NT_SUCCESS(Status)) 00076 { 00077 dwError = RtlNtStatusToDosError(Status); 00078 } 00079 00080 return dwError; 00081 } 00082 00083 00084 DWORD 00085 ScmGetDriverStatus(PSERVICE lpService, 00086 LPSERVICE_STATUS lpServiceStatus) 00087 { 00088 OBJECT_ATTRIBUTES ObjectAttributes; 00089 UNICODE_STRING DirName; 00090 HANDLE DirHandle; 00091 NTSTATUS Status = STATUS_SUCCESS; 00092 POBJECT_DIRECTORY_INFORMATION DirInfo; 00093 ULONG BufferLength; 00094 ULONG DataLength; 00095 ULONG Index; 00096 DWORD dwError = ERROR_SUCCESS; 00097 BOOLEAN bFound = FALSE; 00098 00099 DPRINT1("ScmGetDriverStatus() called\n"); 00100 00101 memset(lpServiceStatus, 0, sizeof(SERVICE_STATUS)); 00102 00103 if (lpService->Status.dwServiceType == SERVICE_KERNEL_DRIVER) 00104 { 00105 RtlInitUnicodeString(&DirName, 00106 L"\\Driver"); 00107 } 00108 else 00109 { 00110 RtlInitUnicodeString(&DirName, 00111 L"\\FileSystem"); 00112 } 00113 00114 InitializeObjectAttributes(&ObjectAttributes, 00115 &DirName, 00116 0, 00117 NULL, 00118 NULL); 00119 00120 Status = NtOpenDirectoryObject(&DirHandle, 00121 DIRECTORY_QUERY | DIRECTORY_TRAVERSE, 00122 &ObjectAttributes); 00123 if (!NT_SUCCESS(Status)) 00124 { 00125 DPRINT1("NtOpenDirectoryObject() failed!\n"); 00126 return RtlNtStatusToDosError(Status); 00127 } 00128 00129 BufferLength = sizeof(OBJECT_DIRECTORY_INFORMATION) + 00130 2 * MAX_PATH * sizeof(WCHAR); 00131 DirInfo = (OBJECT_DIRECTORY_INFORMATION*) HeapAlloc(GetProcessHeap(), 00132 HEAP_ZERO_MEMORY, 00133 BufferLength); 00134 00135 Index = 0; 00136 while (TRUE) 00137 { 00138 Status = NtQueryDirectoryObject(DirHandle, 00139 DirInfo, 00140 BufferLength, 00141 TRUE, 00142 FALSE, 00143 &Index, 00144 &DataLength); 00145 if (Status == STATUS_NO_MORE_ENTRIES) 00146 { 00147 DPRINT("No more services\n"); 00148 break; 00149 } 00150 00151 if (!NT_SUCCESS(Status)) 00152 break; 00153 00154 DPRINT("Comparing: '%S' '%wZ'\n", lpService->lpServiceName, &DirInfo->Name); 00155 00156 if (_wcsicmp(lpService->lpServiceName, DirInfo->Name.Buffer) == 0) 00157 { 00158 DPRINT1("Found: '%S' '%wZ'\n", 00159 lpService->lpServiceName, &DirInfo->Name); 00160 bFound = TRUE; 00161 00162 break; 00163 } 00164 } 00165 00166 HeapFree(GetProcessHeap(), 00167 0, 00168 DirInfo); 00169 NtClose(DirHandle); 00170 00171 if (!NT_SUCCESS(Status)) 00172 { 00173 DPRINT1("Status: %lx\n", Status); 00174 return RtlNtStatusToDosError(Status); 00175 } 00176 00177 if ((bFound == TRUE) && 00178 (lpService->Status.dwCurrentState != SERVICE_STOP_PENDING)) 00179 { 00180 if (lpService->Status.dwCurrentState == SERVICE_STOPPED) 00181 { 00182 lpService->Status.dwWin32ExitCode = ERROR_SUCCESS; 00183 lpService->Status.dwServiceSpecificExitCode = ERROR_SUCCESS; 00184 lpService->Status.dwCheckPoint = 0; 00185 lpService->Status.dwWaitHint = 0; 00186 lpService->Status.dwControlsAccepted = 0; 00187 } 00188 else 00189 { 00190 lpService->Status.dwCurrentState = SERVICE_RUNNING; 00191 lpService->Status.dwControlsAccepted = SERVICE_ACCEPT_STOP; 00192 00193 if (lpService->Status.dwWin32ExitCode == ERROR_SERVICE_NEVER_STARTED) 00194 lpService->Status.dwWin32ExitCode = ERROR_SUCCESS; 00195 } 00196 } 00197 else 00198 { 00199 lpService->Status.dwCurrentState = SERVICE_STOPPED; 00200 lpService->Status.dwControlsAccepted = 0; 00201 lpService->Status.dwCheckPoint = 0; 00202 lpService->Status.dwWaitHint = 0; 00203 00204 if (lpService->Status.dwCurrentState == SERVICE_STOP_PENDING) 00205 lpService->Status.dwWin32ExitCode = ERROR_SUCCESS; 00206 else 00207 lpService->Status.dwWin32ExitCode = ERROR_GEN_FAILURE; 00208 } 00209 00210 if (lpServiceStatus != NULL) 00211 { 00212 memcpy(lpServiceStatus, 00213 &lpService->Status, 00214 sizeof(SERVICE_STATUS)); 00215 } 00216 00217 DPRINT1("ScmGetDriverStatus() done (Error: %lu)\n", dwError); 00218 00219 return ERROR_SUCCESS; 00220 } 00221 00222 00223 DWORD 00224 ScmControlDriver(PSERVICE lpService, 00225 DWORD dwControl, 00226 LPSERVICE_STATUS lpServiceStatus) 00227 { 00228 DWORD dwError; 00229 00230 DPRINT("ScmControlDriver() called\n"); 00231 00232 switch (dwControl) 00233 { 00234 case SERVICE_CONTROL_STOP: 00235 if (lpService->Status.dwCurrentState != SERVICE_RUNNING) 00236 { 00237 dwError = ERROR_INVALID_SERVICE_CONTROL; 00238 goto done; 00239 } 00240 00241 dwError = ScmUnloadDriver(lpService); 00242 if (dwError == ERROR_SUCCESS) 00243 { 00244 lpService->Status.dwControlsAccepted = 0; 00245 lpService->Status.dwCurrentState = SERVICE_STOPPED; 00246 } 00247 break; 00248 00249 case SERVICE_CONTROL_INTERROGATE: 00250 dwError = ScmGetDriverStatus(lpService, 00251 lpServiceStatus); 00252 break; 00253 00254 default: 00255 dwError = ERROR_INVALID_SERVICE_CONTROL; 00256 } 00257 00258 done:; 00259 DPRINT("ScmControlDriver() done (Erorr: %lu)\n", dwError); 00260 00261 return dwError; 00262 } 00263 00264 /* EOF */ Generated on Sat May 26 2012 04:17:43 for ReactOS by
1.7.6.1
|