diff options
Diffstat (limited to 'pyparallel/src/win32/loaddrv.c')
-rw-r--r-- | pyparallel/src/win32/loaddrv.c | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/pyparallel/src/win32/loaddrv.c b/pyparallel/src/win32/loaddrv.c new file mode 100644 index 0000000..5149877 --- /dev/null +++ b/pyparallel/src/win32/loaddrv.c @@ -0,0 +1,103 @@ +// loaddrv.c - Dynamic driver install/start/stop/remove +// original by Paula Tomlinson + +#include <windows.h> +#include "loaddrv.h" + +SC_HANDLE hSCMan = NULL; + +DWORD LoadDriverInit(void) { + // connect to local service control manager + if ((hSCMan = OpenSCManager(NULL, NULL, + SC_MANAGER_ALL_ACCESS)) == NULL) { + return -1; + } + return OKAY; +} + +void LoadDriverCleanup(void) { + if (hSCMan != NULL) CloseServiceHandle(hSCMan); +} + +DWORD DriverInstall(LPSTR lpPath, LPSTR lpDriver) { + BOOL dwStatus = OKAY; + SC_HANDLE hService = NULL; + + // add to service control manager's database + if ((hService = CreateService(hSCMan, lpDriver, + lpDriver, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, + SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, lpPath, + NULL, NULL, NULL, NULL, NULL)) == NULL) + { + dwStatus = GetLastError(); + } else { + CloseServiceHandle(hService); + } + + return dwStatus; +} + +DWORD DriverStart(LPSTR lpDriver) { + BOOL dwStatus = OKAY; + SC_HANDLE hService = NULL; + + // get a handle to the service + if ((hService = OpenService(hSCMan, lpDriver, + SERVICE_ALL_ACCESS)) != NULL) + { + // start the driver + if (!StartService(hService, 0, NULL)) + dwStatus = GetLastError(); + } else { + dwStatus = GetLastError(); + } + + if (hService != NULL) { + CloseServiceHandle(hService); + } + return dwStatus; +} + +DWORD DriverStop(LPSTR lpDriver) { + BOOL dwStatus = OKAY; + SC_HANDLE hService = NULL; + SERVICE_STATUS serviceStatus; + + // get a handle to the service + if ((hService = OpenService(hSCMan, lpDriver, + SERVICE_ALL_ACCESS)) != NULL) + { + // stop the driver + if (!ControlService(hService, SERVICE_CONTROL_STOP, + &serviceStatus)) + dwStatus = GetLastError(); + } else { + dwStatus = GetLastError(); + } + + if (hService != NULL) { + CloseServiceHandle(hService); + } + return dwStatus; +} + +DWORD DriverRemove(LPSTR lpDriver) { + BOOL dwStatus = OKAY; + SC_HANDLE hService = NULL; + + // get a handle to the service + if ((hService = OpenService(hSCMan, lpDriver, + SERVICE_ALL_ACCESS)) != NULL) + { + // remove the driver + if (!DeleteService(hService)) + dwStatus = GetLastError(); + } else { + dwStatus = GetLastError(); + } + + if (hService != NULL) { + CloseServiceHandle(hService); + } + return dwStatus; +} |