blob: 51498775c1b959c2f79451dc3a769c212ef1d410 [file] [log] [blame]
cliechti88641262002-07-29 02:09:04 +00001// loaddrv.c - Dynamic driver install/start/stop/remove
2// original by Paula Tomlinson
3
4#include <windows.h>
5#include "loaddrv.h"
6
7SC_HANDLE hSCMan = NULL;
8
9DWORD LoadDriverInit(void) {
10 // connect to local service control manager
11 if ((hSCMan = OpenSCManager(NULL, NULL,
12 SC_MANAGER_ALL_ACCESS)) == NULL) {
13 return -1;
14 }
15 return OKAY;
16}
17
18void LoadDriverCleanup(void) {
19 if (hSCMan != NULL) CloseServiceHandle(hSCMan);
20}
21
22DWORD DriverInstall(LPSTR lpPath, LPSTR lpDriver) {
23 BOOL dwStatus = OKAY;
24 SC_HANDLE hService = NULL;
25
26 // add to service control manager's database
27 if ((hService = CreateService(hSCMan, lpDriver,
28 lpDriver, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER,
29 SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, lpPath,
30 NULL, NULL, NULL, NULL, NULL)) == NULL)
31 {
32 dwStatus = GetLastError();
33 } else {
34 CloseServiceHandle(hService);
35 }
36
37 return dwStatus;
38}
39
40DWORD DriverStart(LPSTR lpDriver) {
41 BOOL dwStatus = OKAY;
42 SC_HANDLE hService = NULL;
43
44 // get a handle to the service
45 if ((hService = OpenService(hSCMan, lpDriver,
46 SERVICE_ALL_ACCESS)) != NULL)
47 {
48 // start the driver
49 if (!StartService(hService, 0, NULL))
50 dwStatus = GetLastError();
51 } else {
52 dwStatus = GetLastError();
53 }
54
55 if (hService != NULL) {
56 CloseServiceHandle(hService);
57 }
58 return dwStatus;
59}
60
61DWORD DriverStop(LPSTR lpDriver) {
62 BOOL dwStatus = OKAY;
63 SC_HANDLE hService = NULL;
64 SERVICE_STATUS serviceStatus;
65
66 // get a handle to the service
67 if ((hService = OpenService(hSCMan, lpDriver,
68 SERVICE_ALL_ACCESS)) != NULL)
69 {
70 // stop the driver
71 if (!ControlService(hService, SERVICE_CONTROL_STOP,
72 &serviceStatus))
73 dwStatus = GetLastError();
74 } else {
75 dwStatus = GetLastError();
76 }
77
78 if (hService != NULL) {
79 CloseServiceHandle(hService);
80 }
81 return dwStatus;
82}
83
84DWORD DriverRemove(LPSTR lpDriver) {
85 BOOL dwStatus = OKAY;
86 SC_HANDLE hService = NULL;
87
88 // get a handle to the service
89 if ((hService = OpenService(hSCMan, lpDriver,
90 SERVICE_ALL_ACCESS)) != NULL)
91 {
92 // remove the driver
93 if (!DeleteService(hService))
94 dwStatus = GetLastError();
95 } else {
96 dwStatus = GetLastError();
97 }
98
99 if (hService != NULL) {
100 CloseServiceHandle(hService);
101 }
102 return dwStatus;
103}