ReactOS 0.4.17-dev-650-gd0e71de
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 , ObjectNameInformation , ObjectTypeInformation ,
  ObjectTypesInformation , ObjectHandleFlagInformation , ObjectSessionInformation , ObjectSessionObjectInformation ,
  ObjectSetRefTraceInformation , MaxObjectInfoClass , ObjectBasicInformation = 0 , ObjectTypeInformation = 2 ,
  ObjectBasicInformation , ObjectNameInformation , ObjectTypeInformation , ObjectTypesInformation ,
  ObjectHandleFlagInformation , ObjectSessionInformation , ObjectSessionObjectInformation
}
 

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 
ObjectNameInformation 
ObjectTypeInformation 
ObjectTypesInformation 
ObjectHandleFlagInformation 
ObjectSessionInformation 
ObjectSessionObjectInformation 
ObjectSetRefTraceInformation 
MaxObjectInfoClass 
ObjectBasicInformation 
ObjectTypeInformation 
ObjectBasicInformation 
ObjectNameInformation 
ObjectTypeInformation 
ObjectTypesInformation 
ObjectHandleFlagInformation 
ObjectSessionInformation 
ObjectSessionObjectInformation 

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}
LONG NTSTATUS
Definition: precomp.h:26
EXTERN_C NTSTATUS WINAPI NtQueryObject(HANDLE, OBJECT_INFORMATION_CLASS, PVOID, ULONG, PULONG)
#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 L(x)
Definition: resources.c:13
#define DRIVER_NAME
Definition: ext2fs.h:136
unsigned long DWORD
Definition: ntddk_ex.h:95
Status
Definition: gdiplustypes.h:24
GLsizeiptr size
Definition: glext.h:5919
GLenum GLsizei len
Definition: glext.h:6722
static POBJECTS_AND_NAME_A pObjName
Definition: security.c:88
#define GENERIC_WRITE
Definition: nt_native.h:90
#define UNICODE_NULL
short WCHAR
Definition: pedump.c:58
wcsncpy
#define STATUS_SUCCESS
Definition: shellext.h:65
uint16_t * LPWSTR
Definition: typedefs.h:56
#define wprintf(...)
Definition: whoami.c:18
DWORD WINAPI GetLastError(void)
Definition: except.c:1042

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:2226
#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
static BOOL SetPrivilege(BOOL bSet)
Definition: undoc.c:4
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define err(...)
NTSYSAPI ULONG WINAPI RtlNtStatusToDosError(NTSTATUS)

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: minwinbase.h:31

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:2165
wcscat
wcscpy

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 2226 of file driver.c.

2227{
2228 return IopUnloadDriver(DriverServiceName, FALSE);
2229}
NTSTATUS NTAPI IopUnloadDriver(PUNICODE_STRING DriverServiceName, BOOLEAN UnloadPnpDrivers)
Definition: driver.c:1281

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}
#define SERVICE_ALL_ACCESS
Definition: winsvc.h:68
#define SC_MANAGER_ALL_ACCESS
Definition: winsvc.h:13
SC_HANDLE hSCManager
Definition: sc.c:12
SC_HANDLE WINAPI OpenSCManagerW(LPCWSTR lpMachineName, LPCWSTR lpDatabaseName, DWORD dwDesiredAccess)
Definition: scm.c:2107
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:947
#define ERROR_SERVICE_EXISTS
Definition: winerror.h:948
#define SERVICE_DEMAND_START
Definition: cmtypes.h:979
#define SERVICE_KERNEL_DRIVER
Definition: cmtypes.h:954
#define SERVICE_ERROR_NORMAL
Definition: cmtypes.h:983

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:2199
BOOL WINAPI StartServiceW(SC_HANDLE hService, DWORD dwNumServiceArgs, LPCWSTR *lpServiceArgVectors)
Definition: scm.c:3019
#define ERROR_SERVICE_ALREADY_RUNNING
Definition: winerror.h:931

◆ 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}
#define SERVICE_CONTROL_STOP
Definition: winsvc.h:42
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:937

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().