- Prepare to delete marked services upon startup.
[reactos.git] / reactos / subsys / system / services / driver.c
1 /*
2 * driver.c
3 */
4
5 /* INCLUDES *****************************************************************/
6
7 #include "services.h"
8
9 #define NDEBUG
10 #include <debug.h>
11
12 /* FUNCTIONS ****************************************************************/
13
14 NTSTATUS
15 ScmLoadDriver(PSERVICE lpService)
16 {
17 WCHAR szDriverPath[MAX_PATH];
18 UNICODE_STRING DriverPath;
19 NTSTATUS Status;
20
21 /* Build the driver path */
22 wcscpy(szDriverPath,
23 L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\");
24 wcscat(szDriverPath,
25 lpService->lpServiceName);
26
27 RtlInitUnicodeString(&DriverPath,
28 szDriverPath);
29
30 /* FIXME: Acquire privilege */
31
32 DPRINT(" Path: %wZ\n", &DriverPath);
33 Status = NtLoadDriver(&DriverPath);
34
35 /* FIXME: Release privilege */
36
37 return Status;
38 }
39
40
41 DWORD
42 ScmUnloadDriver(PSERVICE lpService)
43 {
44 WCHAR szDriverPath[MAX_PATH];
45 UNICODE_STRING DriverPath;
46 NTSTATUS Status;
47 DWORD dwError = ERROR_SUCCESS;
48
49 /* Build the driver path */
50 wcscpy(szDriverPath,
51 L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\");
52 wcscat(szDriverPath,
53 lpService->lpServiceName);
54
55 RtlInitUnicodeString(&DriverPath,
56 szDriverPath);
57
58 /* FIXME: Acquire privilege */
59
60 Status = NtUnloadDriver(&DriverPath);
61
62 /* FIXME: Release privilege */
63
64 if (!NT_SUCCESS(Status))
65 {
66 dwError = RtlNtStatusToDosError(Status);
67 }
68
69 return dwError;
70 }
71
72
73 DWORD
74 ScmControlDriver(PSERVICE lpService,
75 DWORD dwControl,
76 LPSERVICE_STATUS lpServiceStatus)
77 {
78 DWORD dwError;
79
80 DPRINT("ScmControlDriver() called\n");
81
82 switch (dwControl)
83 {
84 case SERVICE_CONTROL_STOP:
85 if (lpService->Status.dwCurrentState != SERVICE_RUNNING)
86 {
87 dwError = ERROR_INVALID_SERVICE_CONTROL;
88 goto done;
89 }
90
91 dwError = ScmUnloadDriver(lpService);
92 if (dwError == ERROR_SUCCESS)
93 {
94 lpService->Status.dwControlsAccepted = 0;
95 lpService->Status.dwCurrentState = SERVICE_STOPPED;
96 }
97 break;
98
99 case SERVICE_CONTROL_INTERROGATE:
100 dwError = ERROR_INVALID_SERVICE_CONTROL;
101 break;
102
103 default:
104 dwError = ERROR_INVALID_SERVICE_CONTROL;
105 }
106
107 done:;
108 DPRINT("ScmControlDriver() done (Erorr: %lu)\n", dwError);
109
110 return dwError;
111 }
112
113 /* EOF */