mirror of
https://github.com/reactos/reactos.git
synced 2024-09-10 04:42:00 +00:00
163 lines
3.7 KiB
C
163 lines
3.7 KiB
C
#include "DriverTester.h"
|
|
|
|
|
|
BOOL
|
|
RegisterDriver(LPCWSTR lpDriverName,
|
|
LPCWSTR lpPathName)
|
|
{
|
|
SC_HANDLE hSCManager;
|
|
SC_HANDLE hService;
|
|
|
|
hSCManager = OpenSCManagerW(NULL,
|
|
NULL,
|
|
SC_MANAGER_ALL_ACCESS);
|
|
if (!hSCManager)
|
|
return FALSE;
|
|
|
|
retry:
|
|
hService = CreateServiceW(hSCManager,
|
|
lpDriverName,
|
|
lpDriverName,
|
|
SERVICE_ALL_ACCESS,
|
|
SERVICE_KERNEL_DRIVER,
|
|
SERVICE_DEMAND_START,
|
|
SERVICE_ERROR_NORMAL,
|
|
lpPathName,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL);
|
|
|
|
if (hService)
|
|
{
|
|
CloseServiceHandle(hService);
|
|
CloseServiceHandle(hSCManager);
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
DWORD err = GetLastError();
|
|
|
|
if (err == ERROR_SERVICE_MARKED_FOR_DELETE)
|
|
{
|
|
StopDriver(DRIVER_NAME);
|
|
goto retry;
|
|
}
|
|
|
|
CloseServiceHandle(hSCManager);
|
|
|
|
// return TRUE if the driver is already registered
|
|
return (err == ERROR_SERVICE_EXISTS);
|
|
}
|
|
}
|
|
|
|
BOOL
|
|
StartDriver(LPCWSTR lpDriverName)
|
|
{
|
|
SC_HANDLE hSCManager;
|
|
SC_HANDLE hService;
|
|
BOOL bRet;
|
|
|
|
hSCManager = OpenSCManagerW(NULL,
|
|
NULL,
|
|
SC_MANAGER_ALL_ACCESS);
|
|
if (!hSCManager)
|
|
return FALSE;
|
|
|
|
hService = OpenServiceW(hSCManager,
|
|
lpDriverName,
|
|
SERVICE_ALL_ACCESS);
|
|
if (!hService)
|
|
{
|
|
CloseServiceHandle(hSCManager);
|
|
return FALSE;
|
|
}
|
|
|
|
bRet = StartServiceW(hService, 0, NULL);
|
|
if (!bRet)
|
|
{
|
|
if (GetLastError() == ERROR_SERVICE_ALREADY_RUNNING)
|
|
{
|
|
wprintf(L"%s.sys already running\n", DRIVER_NAME);
|
|
bRet = TRUE;
|
|
}
|
|
}
|
|
|
|
CloseServiceHandle(hService);
|
|
CloseServiceHandle(hSCManager);
|
|
|
|
return bRet;
|
|
}
|
|
|
|
BOOL
|
|
StopDriver(LPCWSTR lpDriverName)
|
|
{
|
|
SC_HANDLE hSCManager;
|
|
SC_HANDLE hService;
|
|
SERVICE_STATUS serviceStatus;
|
|
BOOL bRet;
|
|
|
|
hSCManager = OpenSCManagerW(NULL,
|
|
NULL,
|
|
SC_MANAGER_ALL_ACCESS);
|
|
if (!hSCManager)
|
|
return FALSE;
|
|
|
|
hService = OpenServiceW(hSCManager,
|
|
lpDriverName,
|
|
SERVICE_ALL_ACCESS);
|
|
if (!hService)
|
|
{
|
|
CloseServiceHandle(hSCManager);
|
|
return FALSE;
|
|
}
|
|
|
|
bRet = ControlService(hService,
|
|
SERVICE_CONTROL_STOP,
|
|
&serviceStatus);
|
|
if (!bRet)
|
|
{
|
|
if (GetLastError() == ERROR_SERVICE_NOT_ACTIVE)
|
|
{
|
|
wprintf(L"%s.sys wasn't running\n", DRIVER_NAME);
|
|
bRet = TRUE;
|
|
}
|
|
}
|
|
|
|
CloseServiceHandle(hService);
|
|
CloseServiceHandle(hSCManager);
|
|
|
|
return bRet;
|
|
}
|
|
|
|
BOOL
|
|
UnregisterDriver(LPCWSTR lpDriverName)
|
|
{
|
|
SC_HANDLE hService;
|
|
SC_HANDLE hSCManager;
|
|
BOOL bRet;
|
|
|
|
hSCManager = OpenSCManagerW(NULL,
|
|
NULL,
|
|
SC_MANAGER_ALL_ACCESS);
|
|
if (!hSCManager)
|
|
return FALSE;
|
|
|
|
hService = OpenServiceW(hSCManager,
|
|
lpDriverName,
|
|
SERVICE_ALL_ACCESS);
|
|
if (!hService)
|
|
{
|
|
CloseServiceHandle(hSCManager);
|
|
return FALSE;
|
|
}
|
|
|
|
bRet = DeleteService(hService);
|
|
|
|
CloseServiceHandle(hService);
|
|
CloseServiceHandle(hSCManager);
|
|
|
|
return bRet;
|
|
}
|