ReactOS  0.4.13-dev-66-gc714b7f
support.c
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS kernel-mode tests
3  * LICENSE: LGPL-2.1+ (https://spdx.org/licenses/LGPL-2.1+)
4  * PURPOSE: Kernel-Mode Test Suite user-mode support routines
5  * COPYRIGHT: Copyright 2011-2018 Thomas Faber <thomas.faber@reactos.org>
6  * Copyright 2013 Nikolay Borisov <nib9@aber.ac.uk>
7  */
8 
9 #include <kmt_test.h>
10 
11 #include "kmtest.h"
12 #include <kmt_public.h>
13 
14 #include <assert.h>
15 #include <debug.h>
16 
17 extern HANDLE KmtestHandle;
18 
26 DWORD
27 WINAPI
30 {
32  /* TODO: RequestPacket? */
33  KMT_CALLBACK_REQUEST_PACKET RequestPacket;
36  HANDLE LocalKmtHandle;
37 
39 
40  /* concurrent IoCtls on the same (non-overlapped) handle aren't possible,
41  * so open a separate one.
42  * For more info http://www.osronline.com/showthread.cfm?link=230782 */
44  if (LocalKmtHandle == INVALID_HANDLE_VALUE)
46 
47  while (1)
48  {
49  if (!DeviceIoControl(LocalKmtHandle, IOCTL_KMTEST_USERMODE_AWAIT_REQ, NULL, 0, &RequestPacket, sizeof(RequestPacket), &BytesReturned, NULL))
51  ASSERT(BytesReturned == sizeof(RequestPacket));
52 
53  switch (RequestPacket.OperationClass)
54  {
55  case QueryVirtualMemory:
56  {
57  SIZE_T InfoBufferSize = VirtualQuery(RequestPacket.Parameters, &Response.MemInfo, sizeof(Response.MemInfo));
58  /* FIXME: an error is a valid result. That should go as a response to kernel mode instead of terminating the thread */
59  if (InfoBufferSize == 0)
61 
62  if (!DeviceIoControl(LocalKmtHandle, IOCTL_KMTEST_USERMODE_SEND_RESPONSE, &RequestPacket.RequestId, sizeof(RequestPacket.RequestId), &Response, sizeof(Response), &BytesReturned, NULL))
64  ASSERT(BytesReturned == 0);
65 
66  break;
67  }
68  default:
69  DPRINT1("Unrecognized user-mode callback request\n");
70  break;
71  }
72  }
73 
74 cleanup:
75  if (LocalKmtHandle != INVALID_HANDLE_VALUE)
76  CloseHandle(LocalKmtHandle);
77 
78  DPRINT("Callback handler dying! Error code %lu", Error);
79  return Error;
80 }
81 
82 
93 DWORD
95  IN PCSTR TestName)
96 {
97  HANDLE CallbackThread;
100 
101  CallbackThread = CreateThread(NULL, 0, KmtUserCallbackThread, NULL, 0, NULL);
102 
104  error(Error);
105 
106  if (CallbackThread != NULL)
107  CloseHandle(CallbackThread);
108 
109  return Error;
110 }
111 
113 static SC_HANDLE TestServiceHandle;
115 
126 VOID
129  IN BOOLEAN RestartIfRunning)
130 {
132  WCHAR ServicePath[MAX_PATH];
133 
134  StringCbCopy(ServicePath, sizeof ServicePath, ServiceName);
135  StringCbCat(ServicePath, sizeof ServicePath, L"_drv.sys");
136 
137  StringCbCopy(TestServiceName, sizeof TestServiceName, L"Kmtest-");
139 
140  Error = KmtCreateAndStartService(TestServiceName, ServicePath, NULL, &TestServiceHandle, RestartIfRunning);
141 
142  if (Error)
143  {
144  // TODO
145  __debugbreak();
146  }
147 }
148 
154 VOID
156 {
158 
160 
161  if (Error)
162  {
163  // TODO
164  __debugbreak();
165  }
166 }
167 
173 VOID
175 {
177  WCHAR DevicePath[MAX_PATH];
178 
179  StringCbCopy(DevicePath, sizeof DevicePath, L"\\\\.\\Global\\GLOBALROOT\\Device\\");
180  StringCbCat(DevicePath, sizeof DevicePath, TestServiceName);
181 
184  error(Error);
185 
186  if (Error)
187  {
188  // TODO
189  __debugbreak();
190  }
191 
192 }
193 
199 VOID
201 {
203 
205  error(Error);
206 
207  if (Error)
208  {
209  // TODO
210  __debugbreak();
211  }
212 }
213 
223 DWORD
226 {
228 
229  assert(ControlCode < 0x400);
230 
232  return GetLastError();
233 
234  return ERROR_SUCCESS;
235 }
236 
247 DWORD
250  IN PCSTR String)
251 {
253 
254  assert(ControlCode < 0x400);
255 
257  return GetLastError();
258 
259  return ERROR_SUCCESS;
260 }
261 
272 DWORD
275  IN PCWSTR String)
276 {
278 
279  assert(ControlCode < 0x400);
280 
282  return GetLastError();
283 
284  return ERROR_SUCCESS;
285 }
286 
297 DWORD
300  IN DWORD Value)
301 {
303 
304  assert(ControlCode < 0x400);
305 
307  return GetLastError();
308 
309  return ERROR_SUCCESS;
310 }
311 
324 DWORD
328  IN DWORD InLength,
329  IN OUT PDWORD OutLength)
330 {
331  assert(OutLength);
332  assert(Buffer || (!InLength && !*OutLength));
333  assert(ControlCode < 0x400);
334 
335  if (!DeviceIoControl(TestDeviceHandle, KMT_MAKE_CODE(ControlCode), Buffer, InLength, Buffer, *OutLength, OutLength, NULL))
336  return GetLastError();
337 
338  return ERROR_SUCCESS;
339 }
_In_opt_ ULONG _Out_ PULONG Value
Definition: rtlfuncs.h:2327
const uint16_t * PCWSTR
Definition: typedefs.h:55
#define IN
Definition: typedefs.h:38
#define CloseHandle
Definition: compat.h:398
#define ERROR_SUCCESS
Definition: deptool.c:10
#define error(str)
Definition: mkdosfs.c:1605
DWORD KmtStopService(IN PCWSTR ServiceName OPTIONAL, IN OUT SC_HANDLE *ServiceHandle)
Definition: service.c:315
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
#define error_goto(Error, label)
Definition: kmtest.h:21
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:323
static WCHAR TestServiceName[MAX_PATH]
Definition: support.c:112
KMT_CALLBACK_INFORMATION_CLASS OperationClass
Definition: kmt_test.h:64
#define KMTEST_DEVICE_PATH
Definition: kmt_public.h:35
#define INVALID_HANDLE_VALUE
Definition: compat.h:391
#define assert(x)
Definition: debug.h:53
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
HANDLE KmtestHandle
Definition: kmtest.c:32
static WCHAR String[]
Definition: stringtable.c:55
_In_ PVOID Parameter
Definition: ldrtypes.h:240
DWORD KmtSendStringToDriver(IN DWORD ControlCode, IN PCSTR String)
Definition: support.c:248
void __cdecl __debugbreak(void)
Definition: intrin_ppc.h:698
#define GENERIC_WRITE
Definition: nt_native.h:90
static SC_HANDLE TestServiceHandle
Definition: support.c:113
unsigned char BOOLEAN
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:112
smooth NULL
Definition: ftsmooth.c:416
DWORD KmtSendBufferToDriver(IN DWORD ControlCode, IN OUT PVOID Buffer OPTIONAL, IN DWORD InLength, IN OUT PDWORD OutLength)
Definition: support.c:325
void DPRINT(...)
Definition: polytest.cpp:61
_IRQL_requires_same_ typedef _In_ ULONG ControlCode
Definition: wmitypes.h:55
Definition: bufpool.h:45
#define OPEN_EXISTING
Definition: compat.h:426
#define KMT_MAKE_CODE(ControlCode)
Definition: kmt_test.h:265
#define IOCTL_KMTEST_USERMODE_SEND_RESPONSE
Definition: kmt_public.h:22
VOID KmtCloseDriver(VOID)
Definition: support.c:200
#define StringCbCat
Definition: strsafe.h:334
DWORD KmtRunKernelTest(IN PCSTR TestName)
Definition: support.c:94
LPTSTR ServiceName
Definition: ServiceMain.c:15
__wchar_t WCHAR
Definition: xmlstorage.h:180
static HANDLE TestDeviceHandle
Definition: support.c:114
#define MAX_PATH
Definition: compat.h:26
#define WINAPI
Definition: msvc.h:8
unsigned long DWORD
Definition: ntddk_ex.h:95
SIZE_T NTAPI VirtualQuery(IN LPCVOID lpAddress, OUT PMEMORY_BASIC_INFORMATION lpBuffer, IN SIZE_T dwLength)
Definition: virtmem.c:220
BOOL Error
Definition: chkdsk.c:66
Definition: ncftp.h:89
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define StringCbCopy
Definition: strsafe.h:155
DWORD KmtSendWStringToDriver(IN DWORD ControlCode, IN PCWSTR String)
Definition: support.c:273
static const WCHAR L[]
Definition: oid.c:1250
#define GENERIC_READ
Definition: compat.h:124
DWORD WINAPI KmtUserCallbackThread(PVOID Parameter)
Definition: support.c:28
ULONG_PTR SIZE_T
Definition: typedefs.h:78
DWORD KmtSendToDriver(IN DWORD ControlCode)
Definition: support.c:224
VOID KmtUnloadDriver(VOID)
Definition: support.c:155
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
IN OUT PVCB OUT PDIRENT OUT PBCB IN BOOLEAN CreateFile
Definition: fatprocs.h:904
_In_ FILTER_INFORMATION_CLASS _In_ ULONG _Out_ PULONG BytesReturned
Definition: fltkernel.h:1716
DWORD * PDWORD
Definition: pedump.c:68
#define DPRINT1
Definition: precomp.h:8
#define OUT
Definition: typedefs.h:39
struct Response Response
char * cleanup(char *str)
Definition: wpickclick.c:99
const char * PCSTR
Definition: typedefs.h:51
#define IOCTL_KMTEST_RUN_TEST
Definition: kmt_public.h:16
VOID KmtLoadDriver(IN PCWSTR ServiceName, IN BOOLEAN RestartIfRunning)
Definition: support.c:127
DWORD KmtCreateAndStartService(IN PCWSTR ServiceName, IN PCWSTR ServicePath, IN PCWSTR DisplayName OPTIONAL, OUT SC_HANDLE *ServiceHandle, IN BOOLEAN RestartIfRunning)
Definition: service.c:262
VOID KmtOpenDriver(VOID)
Definition: support.c:174
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
DWORD KmtSendUlongToDriver(IN DWORD ControlCode, IN DWORD Value)
Definition: support.c:298
_Must_inspect_result_ _In_ PFILE_OBJECT _In_opt_ PLARGE_INTEGER _In_ ULONG _In_ FLT_IO_OPERATION_FLAGS _Out_opt_ PULONG BytesRead
Definition: fltkernel.h:1255
#define IOCTL_KMTEST_USERMODE_AWAIT_REQ
Definition: kmt_public.h:25
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68