ReactOS  0.4.15-dev-492-ga1108f6
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-2020 Thomas Faber <thomas.faber@reactos.org>
6  * Copyright 2013 Nikolay Borisov <nib9@aber.ac.uk>
7  * Copyright 2018 Serge Gautherie <reactos-git_serge_171003@gautherie.fr>
8  */
9 
10 #include <kmt_test.h>
11 
12 #include "kmtest.h"
13 #include <kmt_public.h>
14 
15 #include <assert.h>
16 #include <debug.h>
17 
18 extern HANDLE KmtestHandle;
19 
27 DWORD
28 WINAPI
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  {
56  case QueryVirtualMemory:
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))
65  ASSERT(BytesReturned == 0);
66 
67  break;
68  }
69  default:
70  DPRINT1("Unrecognized user-mode callback request\n");
71  break;
72  }
73  }
74 
75 cleanup:
76  if (LocalKmtHandle != INVALID_HANDLE_VALUE)
77  CloseHandle(LocalKmtHandle);
78 
79  DPRINT("Callback handler dying! Error code %lu", Error);
80  return Error;
81 }
82 
83 
94 DWORD
96  IN PCSTR TestName)
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 }
112 
114 static SC_HANDLE TestServiceHandle;
116 
127 VOID
130  IN BOOLEAN RestartIfRunning)
131 {
133  WCHAR ServicePath[MAX_PATH];
134 
135  StringCbCopyW(ServicePath, sizeof(ServicePath), ServiceName);
136  StringCbCatW(ServicePath, sizeof(ServicePath), L"_drv.sys");
137 
138  StringCbCopyW(TestServiceName, sizeof(TestServiceName), L"Kmtest-");
140 
141  Error = KmtCreateAndStartService(TestServiceName, ServicePath, NULL, &TestServiceHandle, RestartIfRunning);
142 
143  if (Error)
144  {
145  // TODO
146  __debugbreak();
147  }
148 }
149 
155 VOID
157 {
158  DWORD Error;
159 
161 
162  if (Error)
163  {
164  fprintf(stderr, "Failed to stop %ls service with error 0x%lx\n", TestServiceName, Error);
165  }
166 
168 
169  if (Error)
170  {
171  fprintf(stderr, "Failed to delete %ls service with error 0x%lx\n", TestServiceName, Error);
172  }
173 }
174 
180 VOID
182 {
184  WCHAR DevicePath[MAX_PATH];
185 
186  StringCbCopyW(DevicePath, sizeof(DevicePath), L"\\\\.\\Global\\GLOBALROOT\\Device\\");
187  StringCbCatW(DevicePath, sizeof(DevicePath), TestServiceName);
188 
191  error(Error);
192 
193  if (Error)
194  {
195  // TODO
196  __debugbreak();
197  }
198 
199 }
200 
206 VOID
208 {
210 
212  error(Error);
213 
214  if (Error)
215  {
216  // TODO
217  __debugbreak();
218  }
219 }
220 
230 DWORD
233 {
235 
236  assert(ControlCode < 0x400);
237 
239  return GetLastError();
240 
241  return ERROR_SUCCESS;
242 }
243 
254 DWORD
257  IN PCSTR String)
258 {
260 
261  assert(ControlCode < 0x400);
262 
264  return GetLastError();
265 
266  return ERROR_SUCCESS;
267 }
268 
279 DWORD
282  IN PCWSTR String)
283 {
285 
286  assert(ControlCode < 0x400);
287 
289  return GetLastError();
290 
291  return ERROR_SUCCESS;
292 }
293 
304 DWORD
307  IN DWORD Value)
308 {
310 
311  assert(ControlCode < 0x400);
312 
314  return GetLastError();
315 
316  return ERROR_SUCCESS;
317 }
318 
331 DWORD
335  IN DWORD InLength,
336  IN OUT PDWORD OutLength)
337 {
338  assert(OutLength);
339  assert(Buffer || (!InLength && !*OutLength));
340  assert(ControlCode < 0x400);
341 
342  if (!DeviceIoControl(TestDeviceHandle, KMT_MAKE_CODE(ControlCode), Buffer, InLength, Buffer, *OutLength, OutLength, NULL))
343  return GetLastError();
344 
345  return ERROR_SUCCESS;
346 }
const uint16_t * PCWSTR
Definition: typedefs.h:56
#define IN
Definition: typedefs.h:39
#define CloseHandle
Definition: compat.h:407
#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:113
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:400
#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:241
DWORD KmtSendStringToDriver(IN DWORD ControlCode, IN PCSTR String)
Definition: support.c:255
void __cdecl __debugbreak(void)
Definition: intrin_ppc.h:698
STRSAFEAPI StringCbCatW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:342
IN UCHAR Value
Definition: halp.h:394
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
#define GENERIC_WRITE
Definition: nt_native.h:90
static SC_HANDLE TestServiceHandle
Definition: support.c:114
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:136
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:332
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:435
#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:207
DWORD KmtRunKernelTest(IN PCSTR TestName)
Definition: support.c:95
LPTSTR ServiceName
Definition: ServiceMain.c:15
__wchar_t WCHAR
Definition: xmlstorage.h:180
static HANDLE TestDeviceHandle
Definition: support.c:115
#define MAX_PATH
Definition: compat.h:26
#define WINAPI
Definition: msvc.h:6
DWORD KmtDeleteService(IN PCWSTR ServiceName OPTIONAL, IN OUT SC_HANDLE *ServiceHandle)
Definition: service.c:356
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)
DWORD KmtSendWStringToDriver(IN DWORD ControlCode, IN PCWSTR String)
Definition: support.c:280
static const WCHAR L[]
Definition: oid.c:1250
#define GENERIC_READ
Definition: compat.h:124
DWORD WINAPI KmtUserCallbackThread(PVOID Parameter)
Definition: support.c:29
ULONG_PTR SIZE_T
Definition: typedefs.h:79
DWORD KmtSendToDriver(IN DWORD ControlCode)
Definition: support.c:231
VOID KmtUnloadDriver(VOID)
Definition: support.c:156
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:913
_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:40
FILE * stderr
struct Response Response
char * cleanup(char *str)
Definition: wpickclick.c:99
const char * PCSTR
Definition: typedefs.h:52
#define IOCTL_KMTEST_RUN_TEST
Definition: kmt_public.h:16
VOID KmtLoadDriver(IN PCWSTR ServiceName, IN BOOLEAN RestartIfRunning)
Definition: support.c:128
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:181
STRSAFEAPI StringCbCopyW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:166
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
DWORD KmtSendUlongToDriver(IN DWORD ControlCode, IN DWORD Value)
Definition: support.c:305
_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