ReactOS 0.4.15-dev-7788-g1ad9096
DriverTester.h File Reference
#include <windows.h>
#include <stdio.h>
#include <winternl.h>
Include dependency graph for DriverTester.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  _SYSTEM_GDI_DRIVER_INFORMATION
 
struct  _OBJECT_NAME_INFORMATION
 

Macros

#define _WIN32_WINNT   0x0500
 
#define DRIVER_NAME   L"TestDriver"
 
#define STATUS_SUCCESS   ((NTSTATUS)0x00000000L)
 
#define STATUS_PRIVILEGE_NOT_HELD   ((NTSTATUS)0xC0000061L)
 
#define SystemLoadGdiDriverInformation   26
 
#define SystemExtendServiceTableInformation   38
 

Typedefs

typedef LONG NTSTATUS
 
typedef struct _SYSTEM_GDI_DRIVER_INFORMATION SYSTEM_GDI_DRIVER_INFORMATION
 
typedef struct _SYSTEM_GDI_DRIVER_INFORMATIONPSYSTEM_GDI_DRIVER_INFORMATION
 
typedef enum _OBJECT_INFORMATION_CLASS OBJECT_INFO_CLASS
 
typedef struct _OBJECT_NAME_INFORMATION OBJECT_NAME_INFORMATION
 
typedef struct _OBJECT_NAME_INFORMATIONPOBJECT_NAME_INFORMATION
 

Enumerations

enum  _OBJECT_INFORMATION_CLASS {
  ObjectBasicInformation , ObjectNameInformation , ObjectTypeInformation , ObjectAllTypesInformation ,
  ObjectHandleInformation , ObjectBasicInformation = 0 , ObjectTypeInformation = 2 , ObjectBasicInformation ,
  ObjectNameInformation , ObjectTypeInformation , ObjectTypesInformation , ObjectDataInformation
}
 

Functions

BOOL RegisterDriver (LPCWSTR lpDriverName, LPCWSTR lpPathName)
 
BOOL StartDriver (LPCWSTR lpDriverName)
 
BOOL StopDriver (LPCWSTR lpDriverName)
 
BOOL UnregisterDriver (LPCWSTR lpDriverName)
 
BOOL ConvertPath (LPCWSTR lpPath, LPWSTR lpDevice)
 
BOOL LoadVia_SystemLoadGdiDriverInformation (LPWSTR lpDriverPath)
 
BOOL LoadVia_SystemExtendServiceTableInformation (LPWSTR lpDriverPath)
 
BOOL NtStartDriver (LPCWSTR lpService)
 
BOOL NtStopDriver (LPCWSTR lpService)
 
NTSYSAPI NTSTATUS NTAPI NtSetSystemInformation (IN INT SystemInformationClass, IN PVOID SystemInformation, IN ULONG SystemInformationLength)
 
NTSTATUS NtUnloadDriver (IN PUNICODE_STRING DriverServiceName)
 
NTSTATUS NtQueryObject (IN HANDLE Handle, IN OBJECT_INFO_CLASS ObjectInformationClass, OUT PVOID ObjectInformation, IN ULONG ObjectInformationLength, OUT PULONG ReturnLength)
 

Macro Definition Documentation

◆ _WIN32_WINNT

#define _WIN32_WINNT   0x0500

Definition at line 1 of file DriverTester.h.

◆ DRIVER_NAME

#define DRIVER_NAME   L"TestDriver"

Definition at line 6 of file DriverTester.h.

◆ STATUS_PRIVILEGE_NOT_HELD

#define STATUS_PRIVILEGE_NOT_HELD   ((NTSTATUS)0xC0000061L)

Definition at line 9 of file DriverTester.h.

◆ STATUS_SUCCESS

#define STATUS_SUCCESS   ((NTSTATUS)0x00000000L)

Definition at line 8 of file DriverTester.h.

◆ SystemExtendServiceTableInformation

#define SystemExtendServiceTableInformation   38

Definition at line 35 of file DriverTester.h.

◆ SystemLoadGdiDriverInformation

#define SystemLoadGdiDriverInformation   26

Definition at line 34 of file DriverTester.h.

Typedef Documentation

◆ NTSTATUS

typedef LONG NTSTATUS

Definition at line 11 of file DriverTester.h.

◆ OBJECT_INFO_CLASS

◆ OBJECT_NAME_INFORMATION

◆ POBJECT_NAME_INFORMATION

◆ PSYSTEM_GDI_DRIVER_INFORMATION

◆ SYSTEM_GDI_DRIVER_INFORMATION

Enumeration Type Documentation

◆ _OBJECT_INFORMATION_CLASS

Enumerator
ObjectBasicInformation 
ObjectNameInformation 
ObjectTypeInformation 
ObjectAllTypesInformation 
ObjectHandleInformation 
ObjectBasicInformation 
ObjectTypeInformation 
ObjectBasicInformation 
ObjectNameInformation 
ObjectTypeInformation 
ObjectTypesInformation 
ObjectDataInformation 

Definition at line 53 of file DriverTester.h.

53 {
@ ObjectTypeInformation
Definition: DriverTester.h:56
@ ObjectAllTypesInformation
Definition: DriverTester.h:57
@ ObjectHandleInformation
Definition: DriverTester.h:58
@ ObjectBasicInformation
Definition: DriverTester.h:54
@ ObjectNameInformation
Definition: DriverTester.h:55
enum _OBJECT_INFORMATION_CLASS OBJECT_INFO_CLASS

Function Documentation

◆ ConvertPath()

BOOL ConvertPath ( LPCWSTR  lpPath,
LPWSTR  lpDevice 
)

Definition at line 56 of file undoc.c.

58{
59 LPWSTR lpFullPath = NULL;
60 DWORD size;
61
62 if (lpPath)
63 {
64 size = GetLongPathNameW(lpPath,
65 0,
66 0);
67 if (!size)
68 return FALSE;
69
70 size = (size + 1) * sizeof(WCHAR);
71
72 lpFullPath = HeapAlloc(GetProcessHeap(),
73 0,
74 size);
75 if (!lpFullPath)
76 return FALSE;
77
78 if (GetLongPathNameW(lpPath,
79 lpFullPath,
80 size))
81 {
82 HANDLE hDevice;
85 DWORD len;
86
87 hDevice = CreateFileW(lpFullPath,
89 0,
90 NULL,
93 NULL);
94
95 HeapFree(GetProcessHeap(), 0, lpFullPath);
96
97 if(hDevice == INVALID_HANDLE_VALUE)
98 {
99 wprintf(L"[%x] Failed to open %s\n", GetLastError(), DRIVER_NAME);
100 return FALSE;
101 }
102
103 size = MAX_PATH * sizeof(WCHAR);
105 if (!pObjName)
106 return FALSE;
107
108 Status = NtQueryObject(hDevice,
110 pObjName,
111 size,
112 &size);
113 if (Status == STATUS_SUCCESS)
114 {
115 len = pObjName->Name.Length / sizeof(WCHAR);
116 wcsncpy(lpDevice, pObjName->Name.Buffer, len);
117 lpDevice[len] = UNICODE_NULL;
118
120
121 return TRUE;
122 }
123
125 }
126 }
127
128 return FALSE;
129}
NTSTATUS NtQueryObject(IN HANDLE Handle, IN OBJECT_INFO_CLASS ObjectInformationClass, OUT PVOID ObjectInformation, IN ULONG ObjectInformationLength, OUT PULONG ReturnLength)
LONG NTSTATUS
Definition: precomp.h:26
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define GetProcessHeap()
Definition: compat.h:736
#define OPEN_EXISTING
Definition: compat.h:775
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define HeapAlloc
Definition: compat.h:733
#define GENERIC_READ
Definition: compat.h:135
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define CreateFileW
Definition: compat.h:741
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
DWORD WINAPI GetLongPathNameW(IN LPCWSTR lpszShortPath, OUT LPWSTR lpszLongPath, IN DWORD cchBuffer)
Definition: path.c:1456
#define DRIVER_NAME
Definition: ext2fs.h:136
unsigned long DWORD
Definition: ntddk_ex.h:95
Status
Definition: gdiplustypes.h:25
GLsizeiptr size
Definition: glext.h:5919
GLenum GLsizei len
Definition: glext.h:6722
static POBJECTS_AND_NAME_A pObjName
Definition: security.c:77
#define GENERIC_WRITE
Definition: nt_native.h:90
#define UNICODE_NULL
#define L(x)
Definition: ntvdm.h:50
_CRTIMP wchar_t *__cdecl wcsncpy(wchar_t *_Dest, const wchar_t *_Source, size_t _Count)
#define STATUS_SUCCESS
Definition: shellext.h:65
#define wprintf(...)
Definition: whoami.c:18
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by SneakyUndocumentedMethods().

◆ LoadVia_SystemExtendServiceTableInformation()

BOOL LoadVia_SystemExtendServiceTableInformation ( LPWSTR  lpDriverPath)

Definition at line 240 of file undoc.c.

241{
245
246 RtlInitUnicodeString(&Buffer, lpDriverPath);
247 bufSize = sizeof(UNICODE_STRING);
248
249 if (SetPrivilege(TRUE))
250 {
252 &Buffer,
253 bufSize);
255 {
256 wprintf(L"SystemExtendServiceTableInformation can only be used in kmode.\n");
257 }
258 else if (Status == STATUS_SUCCESS)
259 {
260 wprintf(L"SystemExtendServiceTableInformation incorrectly loaded the driver\n");
262
263 return TRUE;
264 }
265 else
266 {
268 wprintf(L"LoadVia_SystemExtendServiceTableInformation failed [%lu] - 0x%x\n", err, Status);
269 }
270
272 }
273
274 return FALSE;
275}
NTSYSAPI NTSTATUS NTAPI NtSetSystemInformation(IN INT SystemInformationClass, IN PVOID SystemInformation, IN ULONG SystemInformationLength)
NTSTATUS NtUnloadDriver(IN PUNICODE_STRING DriverServiceName)
Definition: driver.c:2208
#define STATUS_PRIVILEGE_NOT_HELD
Definition: DriverTester.h:9
#define SystemExtendServiceTableInformation
Definition: DriverTester.h:35
Definition: bufpool.h:45
struct _UNICODE_STRING UNICODE_STRING
GLuint GLsizei bufSize
Definition: glext.h:6040
NTSYSAPI ULONG WINAPI RtlNtStatusToDosError(NTSTATUS)
static BOOL SetPrivilege(BOOL bSet)
Definition: undoc.c:4
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define err(...)

Referenced by SneakyUndocumentedMethods().

◆ LoadVia_SystemLoadGdiDriverInformation()

BOOL LoadVia_SystemLoadGdiDriverInformation ( LPWSTR  lpDriverPath)

Definition at line 199 of file undoc.c.

200{
204
206
208 RtlInitUnicodeString(&Buffer.DriverName, lpDriverPath);
209
210 if (SetPrivilege(TRUE))
211 {
213 &Buffer,
214 bufSize);
216 {
217 wprintf(L"SystemLoadGdiDriverInformation can only be used in kmode.\n");
218 }
219 else if (Status == STATUS_SUCCESS)
220 {
221 wprintf(L"SystemLoadGdiDriverInformation incorrectly loaded the driver\n");
222 NtUnloadDriver(&Buffer.DriverName);
223
224 return TRUE;
225 }
226 else
227 {
229 wprintf(L"LoadVia_SystemLoadGdiDriverInformation failed [%lu]\n", err);
230 }
231
233 }
234
235 return FALSE;
236}
struct _SYSTEM_GDI_DRIVER_INFORMATION SYSTEM_GDI_DRIVER_INFORMATION
#define SystemLoadGdiDriverInformation
Definition: DriverTester.h:34
#define ZeroMemory
Definition: winbase.h:1712

Referenced by SneakyUndocumentedMethods().

◆ NtQueryObject()

NTSTATUS NtQueryObject ( IN HANDLE  Handle,
IN OBJECT_INFO_CLASS  ObjectInformationClass,
OUT PVOID  ObjectInformation,
IN ULONG  ObjectInformationLength,
OUT PULONG  ReturnLength 
)

◆ NtSetSystemInformation()

◆ NtStartDriver()

BOOL NtStartDriver ( LPCWSTR  lpService)

Definition at line 133 of file undoc.c.

134{
135 WCHAR szDriverPath[MAX_PATH];
136 UNICODE_STRING DriverPath;
137 NTSTATUS Status = -1;
138
139 wcscpy(szDriverPath,
140 L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\");
141 wcscat(szDriverPath,
142 lpService);
143
144 RtlInitUnicodeString(&DriverPath,
145 szDriverPath);
146
147 if (SetPrivilege(TRUE))
148 {
149 Status = NtLoadDriver(&DriverPath);
150 if (Status != STATUS_SUCCESS)
151 {
153 wprintf(L"NtUnloadDriver failed [%lu]\n", err);
154 }
155
157 }
158
159 return (Status == STATUS_SUCCESS);
160}
NTSTATUS NTAPI NtLoadDriver(IN PUNICODE_STRING DriverServiceName)
Definition: driver.c:2147
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
_CRTIMP wchar_t *__cdecl wcscat(_Inout_updates_z_(_String_length_(_Dest)+_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)

Referenced by UndocumentedMethod().

◆ NtStopDriver()

BOOL NtStopDriver ( LPCWSTR  lpService)

Definition at line 164 of file undoc.c.

165{
166 WCHAR szDriverPath[MAX_PATH];
167 UNICODE_STRING DriverPath;
168 NTSTATUS Status = -1;
169
170 wcscpy(szDriverPath,
171 L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\");
172 wcscat(szDriverPath,
173 lpService);
174
175 RtlInitUnicodeString(&DriverPath,
176 szDriverPath);
177
178 if (SetPrivilege(TRUE))
179 {
180 Status = NtUnloadDriver(&DriverPath);
181 if (Status != STATUS_SUCCESS)
182 {
184 wprintf(L"NtUnloadDriver failed [%lu]\n", err);
185 }
186
188 }
189
190 return (Status == STATUS_SUCCESS);
191}

Referenced by SneakyUndocumentedMethods(), and UndocumentedMethod().

◆ NtUnloadDriver()

NTSTATUS NtUnloadDriver ( IN PUNICODE_STRING  DriverServiceName)

Definition at line 2208 of file driver.c.

2209{
2210 return IopUnloadDriver(DriverServiceName, FALSE);
2211}
NTSTATUS NTAPI IopUnloadDriver(PUNICODE_STRING DriverServiceName, BOOLEAN UnloadPnpDrivers)
Definition: driver.c:1269

Referenced by LoadVia_SystemExtendServiceTableInformation(), LoadVia_SystemLoadGdiDriverInformation(), NtStopDriver(), ScmUnloadDriver(), START_TEST(), and wmain().

◆ RegisterDriver()

BOOL RegisterDriver ( LPCWSTR  lpDriverName,
LPCWSTR  lpPathName 
)

Definition at line 5 of file umode.c.

7{
8 SC_HANDLE hSCManager;
9 SC_HANDLE hService;
10
12 NULL,
14 if (!hSCManager)
15 return FALSE;
16
17retry:
18 hService = CreateServiceW(hSCManager,
19 lpDriverName,
20 lpDriverName,
25 lpPathName,
26 NULL,
27 NULL,
28 NULL,
29 NULL,
30 NULL);
31
32 if (hService)
33 {
34 CloseServiceHandle(hService);
36 return TRUE;
37 }
38 else
39 {
41
43 {
45 goto retry;
46 }
47
49
50 // return TRUE if the driver is already registered
51 return (err == ERROR_SERVICE_EXISTS);
52 }
53}
SC_HANDLE hSCManager
Definition: sc.c:12
SC_HANDLE WINAPI OpenSCManagerW(LPCWSTR lpMachineName, LPCWSTR lpDatabaseName, DWORD dwDesiredAccess)
Definition: scm.c:2068
SC_HANDLE WINAPI CreateServiceW(SC_HANDLE hSCManager, LPCWSTR lpServiceName, LPCWSTR lpDisplayName, DWORD dwDesiredAccess, DWORD dwServiceType, DWORD dwStartType, DWORD dwErrorControl, LPCWSTR lpBinaryPathName, LPCWSTR lpLoadOrderGroup, LPDWORD lpdwTagId, LPCWSTR lpDependencies, LPCWSTR lpServiceStartName, LPCWSTR lpPassword)
Definition: scm.c:812
BOOL WINAPI CloseServiceHandle(SC_HANDLE hSCObject)
Definition: scm.c:580
BOOL StopDriver(LPCWSTR lpDriverName)
Definition: umode.c:94
#define ERROR_SERVICE_MARKED_FOR_DELETE
Definition: winerror.h:623
#define ERROR_SERVICE_EXISTS
Definition: winerror.h:624
#define SERVICE_ALL_ACCESS
Definition: winsvc.h:62
#define SC_MANAGER_ALL_ACCESS
Definition: winsvc.h:13
#define SERVICE_DEMAND_START
Definition: cmtypes.h:978
#define SERVICE_KERNEL_DRIVER
Definition: cmtypes.h:953
#define SERVICE_ERROR_NORMAL
Definition: cmtypes.h:982

Referenced by Initialize().

◆ StartDriver()

BOOL StartDriver ( LPCWSTR  lpDriverName)

Definition at line 56 of file umode.c.

57{
58 SC_HANDLE hSCManager;
59 SC_HANDLE hService;
60 BOOL bRet;
61
63 NULL,
65 if (!hSCManager)
66 return FALSE;
67
68 hService = OpenServiceW(hSCManager,
69 lpDriverName,
71 if (!hService)
72 {
74 return FALSE;
75 }
76
77 bRet = StartServiceW(hService, 0, NULL);
78 if (!bRet)
79 {
81 {
82 wprintf(L"%s.sys already running\n", DRIVER_NAME);
83 bRet = TRUE;
84 }
85 }
86
87 CloseServiceHandle(hService);
89
90 return bRet;
91}
unsigned int BOOL
Definition: ntddk_ex.h:94
SC_HANDLE WINAPI OpenServiceW(SC_HANDLE hSCManager, LPCWSTR lpServiceName, DWORD dwDesiredAccess)
Definition: scm.c:2160
BOOL WINAPI StartServiceW(SC_HANDLE hService, DWORD dwNumServiceArgs, LPCWSTR *lpServiceArgVectors)
Definition: scm.c:2980
#define ERROR_SERVICE_ALREADY_RUNNING
Definition: winerror.h:607

◆ StopDriver()

BOOL StopDriver ( LPCWSTR  lpDriverName)

Definition at line 94 of file umode.c.

95{
96 SC_HANDLE hSCManager;
97 SC_HANDLE hService;
99 BOOL bRet;
100
102 NULL,
104 if (!hSCManager)
105 return FALSE;
106
107 hService = OpenServiceW(hSCManager,
108 lpDriverName,
110 if (!hService)
111 {
113 return FALSE;
114 }
115
116 bRet = ControlService(hService,
119 if (!bRet)
120 {
122 {
123 wprintf(L"%s.sys wasn't running\n", DRIVER_NAME);
124 bRet = TRUE;
125 }
126 }
127
128 CloseServiceHandle(hService);
130
131 return bRet;
132}
BOOL WINAPI ControlService(SC_HANDLE hService, DWORD dwControl, LPSERVICE_STATUS lpServiceStatus)
Definition: scm.c:622
SERVICE_STATUS serviceStatus
Definition: tftpd.cpp:63
#define ERROR_SERVICE_NOT_ACTIVE
Definition: winerror.h:613
#define SERVICE_CONTROL_STOP
Definition: winsvc.h:36

Referenced by RegisterDriver().

◆ UnregisterDriver()

BOOL UnregisterDriver ( LPCWSTR  lpDriverName)

Definition at line 135 of file umode.c.

136{
137 SC_HANDLE hService;
138 SC_HANDLE hSCManager;
139 BOOL bRet;
140
142 NULL,
144 if (!hSCManager)
145 return FALSE;
146
147 hService = OpenServiceW(hSCManager,
148 lpDriverName,
150 if (!hService)
151 {
153 return FALSE;
154 }
155
156 bRet = DeleteService(hService);
157
158 CloseServiceHandle(hService);
160
161 return bRet;
162}
BOOL WINAPI DeleteService(SC_HANDLE hService)
Definition: scm.c:921

Referenced by UndocumentedMethod(), Uninitialize(), and UsermodeMethod().