cliechti | 8864126 | 2002-07-29 02:09:04 +0000 | [diff] [blame^] | 1 | // loaddrv.c - Dynamic driver install/start/stop/remove |
| 2 | // original by Paula Tomlinson |
| 3 | |
| 4 | #include <windows.h> |
| 5 | #include "loaddrv.h" |
| 6 | |
| 7 | SC_HANDLE hSCMan = NULL; |
| 8 | |
| 9 | DWORD 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 | |
| 18 | void LoadDriverCleanup(void) { |
| 19 | if (hSCMan != NULL) CloseServiceHandle(hSCMan); |
| 20 | } |
| 21 | |
| 22 | DWORD 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 | |
| 40 | DWORD 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 | |
| 61 | DWORD 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 | |
| 84 | DWORD 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 | } |