ReactOS 0.4.16-dev-334-g4d9f67c
support.c File Reference
#include <kmt_test.h>
#include "kmtest.h"
#include <kmt_public.h>
#include <assert.h>
#include <debug.h>
Include dependency graph for support.c:

Go to the source code of this file.

Functions

KmtUserCallbackThread

Thread routine which awaits callback requests from kernel-mode

Returns
Win32 error code
DWORD WINAPI KmtUserCallbackThread (PVOID Parameter)
 
KmtLoadDriver

Load the specified special-purpose driver (create/start the service)

Parameters
ServiceNameName of the driver service (Kmtest- prefix will be added automatically)
RestartIfRunningTRUE to stop and restart the service if it is already running
DWORD KmtLoadDriver (IN PCWSTR ServiceName, IN BOOLEAN RestartIfRunning)
 
KmtUnloadDriverKeepService

Unload special-purpose driver (stop the service only)

VOID KmtUnloadDriverKeepService (VOID)
 
KmtUnloadDriver

Unload special-purpose driver (stop and delete the service)

VOID KmtUnloadDriver (VOID)
 
KmtOpenDriver

Load and open special-purpose driver (acquire a device handle)

DWORD KmtOpenDriver (VOID)
 
DWORD KmtLoadAndOpenDriver (IN PCWSTR ServiceName, IN BOOLEAN RestartIfRunning)
 
KmtCloseDriver

Close special-purpose driver (close device handle)

VOID KmtCloseDriver (VOID)
 
KmtSendToDriver

Send an I/O control message with no arguments to the driver opened with KmtOpenDriver

Parameters
ControlCode
Returns
Win32 error code as returned by DeviceIoControl
DWORD KmtSendToDriver (IN DWORD ControlCode)
 
KmtSendStringToDriver

Send an I/O control message with a string argument to the driver opened with KmtOpenDriver

Parameters
ControlCode
String
Returns
Win32 error code as returned by DeviceIoControl
DWORD KmtSendStringToDriver (IN DWORD ControlCode, IN PCSTR String)
 
KmtSendWStringToDriver

Send an I/O control message with a wide string argument to the driver opened with KmtOpenDriver

Parameters
ControlCode
String
Returns
Win32 error code as returned by DeviceIoControl
DWORD KmtSendWStringToDriver (IN DWORD ControlCode, IN PCWSTR String)
 
KmtSendUlongToDriver

Send an I/O control message with an integer argument to the driver opened with KmtOpenDriver

Parameters
ControlCode
Value
Returns
Win32 error code as returned by DeviceIoControl
DWORD KmtSendUlongToDriver (IN DWORD ControlCode, IN DWORD Value)
 
KmtSendBufferToDriver

Send an I/O control message with the specified arguments to the driver opened with KmtOpenDriver

Parameters
ControlCode
Buffer
InLength
OutLength
Returns
Win32 error code as returned by DeviceIoControl
DWORD KmtSendBufferToDriver (IN DWORD ControlCode, IN OUT PVOID Buffer OPTIONAL, IN DWORD InLength, IN OUT PDWORD OutLength)
 

Variables

HANDLE KmtestHandle
 

KmtRunKernelTest

Run the specified kernel-mode test part

Parameters
TestNameName of the test to run
Returns
Win32 error code as returned by DeviceIoControl
static WCHAR TestServiceName [MAX_PATH]
 
static SC_HANDLE TestServiceHandle
 
static HANDLE TestDeviceHandle
 
DWORD KmtRunKernelTest (IN PCSTR TestName)
 

Function Documentation

◆ KmtCloseDriver()

VOID KmtCloseDriver ( VOID  )

Definition at line 236 of file support.c.

237{
239
241 error(Error);
242
243 if (Error)
244 {
245 DPRINT1("CloseHandle failed: 0x%lx\n", Error);
246 }
247}
#define DPRINT1
Definition: precomp.h:8
BOOL Error
Definition: chkdsk.c:66
#define ERROR_SUCCESS
Definition: deptool.c:10
#define CloseHandle
Definition: compat.h:739
unsigned long DWORD
Definition: ntddk_ex.h:95
#define error(str)
Definition: mkdosfs.c:1605
static HANDLE TestDeviceHandle
Definition: support.c:115

Referenced by START_TEST(), and UnloadTcpIpTestDriver().

◆ KmtLoadAndOpenDriver()

DWORD KmtLoadAndOpenDriver ( IN PCWSTR  ServiceName,
IN BOOLEAN  RestartIfRunning 
)

Definition at line 213 of file support.c.

216{
217 DWORD Error;
218
219 Error = KmtLoadDriver(ServiceName, RestartIfRunning);
220 if (Error)
221 return Error;
222
224 if (Error)
225 return Error;
226
227 return ERROR_SUCCESS;
228}
static WCHAR ServiceName[]
Definition: browser.c:19
DWORD KmtOpenDriver(VOID)
Definition: support.c:192
DWORD KmtLoadDriver(IN PCWSTR ServiceName, IN BOOLEAN RestartIfRunning)
Definition: support.c:128

Referenced by LoadTcpIpTestDriver(), and START_TEST().

◆ KmtLoadDriver()

DWORD KmtLoadDriver ( IN PCWSTR  ServiceName,
IN BOOLEAN  RestartIfRunning 
)

Definition at line 128 of file support.c.

131{
132 WCHAR ServicePath[MAX_PATH];
133
134 StringCbCopyW(ServicePath, sizeof(ServicePath), ServiceName);
135 StringCbCatW(ServicePath, sizeof(ServicePath), L"_drv.sys");
136
139
140 return KmtCreateAndStartService(TestServiceName, ServicePath, NULL, &TestServiceHandle, RestartIfRunning);
141}
#define NULL
Definition: types.h:112
#define MAX_PATH
Definition: compat.h:34
DWORD KmtCreateAndStartService(IN PCWSTR ServiceName, IN PCWSTR ServicePath, IN PCWSTR DisplayName OPTIONAL, OUT SC_HANDLE *ServiceHandle, IN BOOLEAN RestartIfRunning)
Definition: service.c:262
#define L(x)
Definition: ntvdm.h:50
STRSAFEAPI StringCbCopyW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:166
STRSAFEAPI StringCbCatW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:342
static WCHAR TestServiceName[MAX_PATH]
Definition: support.c:113
static SC_HANDLE TestServiceHandle
Definition: support.c:114
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by KmtLoadAndOpenDriver(), and START_TEST().

◆ KmtOpenDriver()

DWORD KmtOpenDriver ( VOID  )

Definition at line 192 of file support.c.

193{
195 WCHAR DevicePath[MAX_PATH];
196
197 StringCbCopyW(DevicePath, sizeof(DevicePath), L"\\\\.\\Global\\GLOBALROOT\\Device\\");
198 StringCbCatW(DevicePath, sizeof(DevicePath), TestServiceName);
199
202 error(Error);
203
204 return Error;
205}
#define OPEN_EXISTING
Definition: compat.h:775
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define GENERIC_READ
Definition: compat.h:135
#define GENERIC_WRITE
Definition: nt_native.h:90
#define CreateFile
Definition: winbase.h:3774

Referenced by KmtLoadAndOpenDriver().

◆ KmtRunKernelTest()

DWORD KmtRunKernelTest ( IN PCSTR  TestName)

Definition at line 95 of file support.c.

97{
98 HANDLE CallbackThread;
101
102 CallbackThread = CreateThread(NULL, 0, KmtUserCallbackThread, NULL, 0, NULL);
103
105 error(Error);
106
107 if (CallbackThread != NULL)
108 CloseHandle(CallbackThread);
109
110 return Error;
111}
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
BOOL WINAPI DeviceIoControl(IN HANDLE hDevice, IN DWORD dwIoControlCode, IN LPVOID lpInBuffer OPTIONAL, IN DWORD nInBufferSize OPTIONAL, OUT LPVOID lpOutBuffer OPTIONAL, IN DWORD nOutBufferSize OPTIONAL, OUT LPDWORD lpBytesReturned OPTIONAL, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: deviceio.c:136
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:137
#define IOCTL_KMTEST_RUN_TEST
Definition: kmt_public.h:16
DWORD WINAPI KmtUserCallbackThread(PVOID Parameter)
Definition: support.c:29
HANDLE KmtestHandle
Definition: kmtest.c:32
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PLONGLONG _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_opt_ PULONG_PTR BytesRead
Definition: wdfiotarget.h:870

Referenced by RunTest(), and START_TEST().

◆ KmtSendBufferToDriver()

DWORD KmtSendBufferToDriver ( IN DWORD  ControlCode,
IN OUT PVOID Buffer  OPTIONAL,
IN DWORD  InLength,
IN OUT PDWORD  OutLength 
)

Definition at line 360 of file support.c.

365{
366 assert(OutLength);
367 assert(Buffer || (!InLength && !*OutLength));
368 assert(ControlCode < 0x400);
369
370 if (!DeviceIoControl(TestDeviceHandle, KMT_MAKE_CODE(ControlCode), Buffer, InLength, Buffer, *OutLength, OutLength, NULL))
371 return GetLastError();
372
373 return ERROR_SUCCESS;
374}
Definition: bufpool.h:45
#define assert(x)
Definition: debug.h:53
#define KMT_MAKE_CODE(ControlCode)
Definition: kmt_test.h:270
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_IRQL_requires_same_ typedef _In_ ULONG ControlCode
Definition: wmitypes.h:55

Referenced by START_TEST().

◆ KmtSendStringToDriver()

DWORD KmtSendStringToDriver ( IN DWORD  ControlCode,
IN PCSTR  String 
)

Definition at line 283 of file support.c.

286{
288
289 assert(ControlCode < 0x400);
290
292 return GetLastError();
293
294 return ERROR_SUCCESS;
295}
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
Definition: wdfdevice.h:2433

Referenced by START_TEST().

◆ KmtSendToDriver()

DWORD KmtSendToDriver ( IN DWORD  ControlCode)

Definition at line 259 of file support.c.

261{
263
264 assert(ControlCode < 0x400);
265
267 return GetLastError();
268
269 return ERROR_SUCCESS;
270}

Referenced by START_TEST().

◆ KmtSendUlongToDriver()

DWORD KmtSendUlongToDriver ( IN DWORD  ControlCode,
IN DWORD  Value 
)

Definition at line 333 of file support.c.

336{
338
339 assert(ControlCode < 0x400);
340
342 return GetLastError();
343
344 return ERROR_SUCCESS;
345}
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413

Referenced by START_TEST().

◆ KmtSendWStringToDriver()

DWORD KmtSendWStringToDriver ( IN DWORD  ControlCode,
IN PCWSTR  String 
)

Definition at line 308 of file support.c.

311{
313
314 assert(ControlCode < 0x400);
315
317 return GetLastError();
318
319 return ERROR_SUCCESS;
320}
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)

Referenced by START_TEST().

◆ KmtUnloadDriver()

VOID KmtUnloadDriver ( VOID  )

Definition at line 167 of file support.c.

168{
169 DWORD Error;
170
172
173 if (Error)
174 {
175 fprintf(stderr, "Failed to stop %ls service with error 0x%lx\n", TestServiceName, Error);
176 }
177
179
180 if (Error)
181 {
182 fprintf(stderr, "Failed to delete %ls service with error 0x%lx\n", TestServiceName, Error);
183 }
184}
#define stderr
Definition: stdio.h:100
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
DWORD KmtDeleteService(IN PCWSTR ServiceName OPTIONAL, IN OUT SC_HANDLE *ServiceHandle)
Definition: service.c:356
DWORD KmtStopService(IN PCWSTR ServiceName OPTIONAL, IN OUT SC_HANDLE *ServiceHandle)
Definition: service.c:315

Referenced by START_TEST(), and UnloadTcpIpTestDriver().

◆ KmtUnloadDriverKeepService()

VOID KmtUnloadDriverKeepService ( VOID  )

Definition at line 149 of file support.c.

150{
151 DWORD Error;
152
154
155 if (Error)
156 {
157 fprintf(stderr, "Failed to stop %ls service with error 0x%lx\n", TestServiceName, Error);
158 }
159}

Referenced by START_TEST().

◆ KmtUserCallbackThread()

DWORD WINAPI KmtUserCallbackThread ( PVOID  Parameter)

Definition at line 29 of file support.c.

31{
33 /* TODO: RequestPacket? */
34 KMT_CALLBACK_REQUEST_PACKET RequestPacket;
37 HANDLE LocalKmtHandle;
38
40
41 /* concurrent IoCtls on the same (non-overlapped) handle aren't possible,
42 * so open a separate one.
43 * For more info http://www.osronline.com/showthread.cfm?link=230782 */
45 if (LocalKmtHandle == INVALID_HANDLE_VALUE)
47
48 while (1)
49 {
50 if (!DeviceIoControl(LocalKmtHandle, IOCTL_KMTEST_USERMODE_AWAIT_REQ, NULL, 0, &RequestPacket, sizeof(RequestPacket), &BytesReturned, NULL))
52 ASSERT(BytesReturned == sizeof(RequestPacket));
53
54 switch (RequestPacket.OperationClass)
55 {
57 {
58 SIZE_T InfoBufferSize = VirtualQuery(RequestPacket.Parameters, &Response.MemInfo, sizeof(Response.MemInfo));
59 /* FIXME: an error is a valid result. That should go as a response to kernel mode instead of terminating the thread */
60 if (InfoBufferSize == 0)
62
63 if (!DeviceIoControl(LocalKmtHandle, IOCTL_KMTEST_USERMODE_SEND_RESPONSE, &RequestPacket.RequestId, sizeof(RequestPacket.RequestId), &Response, sizeof(Response), &BytesReturned, NULL))
66
67 break;
68 }
69 default:
70 DPRINT1("Unrecognized user-mode callback request\n");
71 break;
72 }
73 }
74
76 if (LocalKmtHandle != INVALID_HANDLE_VALUE)
77 CloseHandle(LocalKmtHandle);
78
79 DPRINT("Callback handler dying! Error code %lu", Error);
80 return Error;
81}
static void cleanup(void)
Definition: main.c:1335
#define KMTEST_DEVICE_PATH
Definition: kmt_public.h:35
#define IOCTL_KMTEST_USERMODE_AWAIT_REQ
Definition: kmt_public.h:25
#define IOCTL_KMTEST_USERMODE_SEND_RESPONSE
Definition: kmt_public.h:22
@ QueryVirtualMemory
Definition: kmt_test.h:51
#define error_goto(Error, label)
Definition: kmtest.h:21
#define ASSERT(a)
Definition: mode.c:44
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:325
#define DPRINT
Definition: sndvol32.h:73
Definition: ncftp.h:89
KMT_CALLBACK_INFORMATION_CLASS OperationClass
Definition: kmt_test.h:64
ULONG_PTR SIZE_T
Definition: typedefs.h:80
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_ ULONG _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_opt_ PULONG_PTR BytesReturned
Definition: wdfiotarget.h:1052
SIZE_T NTAPI VirtualQuery(IN LPCVOID lpAddress, OUT PMEMORY_BASIC_INFORMATION lpBuffer, IN SIZE_T dwLength)
Definition: virtmem.c:211
_Inout_opt_ PVOID Parameter
Definition: rtltypes.h:336

Referenced by KmtRunKernelTest().

Variable Documentation

◆ KmtestHandle

HANDLE KmtestHandle
extern

Definition at line 32 of file kmtest.c.

Referenced by KmtRunKernelTest(), ListTests(), main(), and RunTest().

◆ TestDeviceHandle

◆ TestServiceHandle

SC_HANDLE TestServiceHandle
static

Definition at line 114 of file support.c.

Referenced by KmtLoadDriver(), KmtUnloadDriver(), and KmtUnloadDriverKeepService().

◆ TestServiceName

WCHAR TestServiceName[MAX_PATH]
static