ReactOS 0.4.16-dev-1260-g901af6a
kmtest.c File Reference
#include <kmt_test.h>
#include "kmtest.h"
#include <kmt_public.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
Include dependency graph for kmtest.c:

Go to the source code of this file.

Macros

#define KMT_DEFINE_TEST_FUNCTIONS
 
#define SERVICE_NAME   L"Kmtest"
 
#define SERVICE_PATH   L"kmtest_drv.sys"
 
#define SERVICE_DESCRIPTION   L"ReactOS Kernel-Mode Test Suite Driver"
 
#define RESULTBUFFER_SIZE   (1024 * 1024)
 

Enumerations

enum  KMT_OPERATION { KMT_DO_NOTHING , KMT_LIST_TESTS , KMT_LIST_ALL_TESTS , KMT_RUN_TEST }
 

Functions

int __cdecl main (int ArgCount, char **Arguments)
 
OutputError

Output an error message to the console.

Parameters
ErrorWin32 error code
static void OutputError (IN DWORD Error)
 
ListTests

Output the list of tests to the console. The list will comprise tests as listed by the driver in addition to user-mode tests in TestList.

Parameters
IncludeHiddenTRUE to include "hidden" tests prefixed with a '-'
Returns
Win32 error code
static DWORD ListTests (IN BOOLEAN IncludeHidden)
 
FindTest

Find a test in TestList by name.

Parameters
TestNameName of the test to look for. Case sensitive
Returns
pointer to test function, or NULL if not found
static PKMT_TESTFUNC FindTest (IN PCSTR TestName)
 
OutputResult

Output the test results in ResultBuffer to the console.

Parameters
TestNameName of the test whose result is to be printed
Returns
Win32 error code
static DWORD OutputResult (IN PCSTR TestName)
 
RunTest

Run the named test and output its results.

Parameters
TestNameName of the test to run. Case sensitive
Returns
Win32 error code
static DWORD RunTest (IN PCSTR TestName)
 
CompareTestNames

strcmp that skips a leading '-' on either string if present

Parameters
Str1
Str2
Returns
see strcmp
static INT CompareTestNames (IN PCSTR Str1, IN PCSTR Str2)
 

Variables

HANDLE KmtestHandle
 
SC_HANDLE KmtestServiceHandle
 
PCSTR ErrorFileAndLine = "No error"
 

Macro Definition Documentation

◆ KMT_DEFINE_TEST_FUNCTIONS

#define KMT_DEFINE_TEST_FUNCTIONS

Definition at line 8 of file kmtest.c.

◆ RESULTBUFFER_SIZE

#define RESULTBUFFER_SIZE   (1024 * 1024)

Definition at line 22 of file kmtest.c.

◆ SERVICE_DESCRIPTION

#define SERVICE_DESCRIPTION   L"ReactOS Kernel-Mode Test Suite Driver"

Definition at line 20 of file kmtest.c.

◆ SERVICE_NAME

#define SERVICE_NAME   L"Kmtest"

Definition at line 18 of file kmtest.c.

◆ SERVICE_PATH

#define SERVICE_PATH   L"kmtest_drv.sys"

Definition at line 19 of file kmtest.c.

Enumeration Type Documentation

◆ KMT_OPERATION

Enumerator
KMT_DO_NOTHING 
KMT_LIST_TESTS 
KMT_LIST_ALL_TESTS 
KMT_RUN_TEST 

Definition at line 24 of file kmtest.c.

25{
KMT_OPERATION
Definition: kmtest.c:25
@ KMT_RUN_TEST
Definition: kmtest.c:29
@ KMT_LIST_TESTS
Definition: kmtest.c:27
@ KMT_LIST_ALL_TESTS
Definition: kmtest.c:28
@ KMT_DO_NOTHING
Definition: kmtest.c:26

Function Documentation

◆ CompareTestNames()

static INT CompareTestNames ( IN PCSTR  Str1,
IN PCSTR  Str2 
)
static

Definition at line 81 of file kmtest.c.

84{
85 if (*Str1 == '-')
86 ++Str1;
87 if (*Str2 == '-')
88 ++Str2;
89 while (*Str1 && *Str1 == *Str2)
90 {
91 ++Str1;
92 ++Str2;
93 }
94 return *Str1 - *Str2;
95}

Referenced by ListTests().

◆ FindTest()

static PKMT_TESTFUNC FindTest ( IN PCSTR  TestName)
static

Definition at line 202 of file kmtest.c.

204{
206
207 for (TestEntry = TestList; TestEntry->TestName; ++TestEntry)
208 {
209 PCSTR TestEntryName = TestEntry->TestName;
210
211 // skip leading '-' if present
212 if (*TestEntryName == '-')
213 ++TestEntryName;
214
215 if (!lstrcmpA(TestEntryName, TestName))
216 break;
217 }
218
219 return TestEntry->TestFunction;
220}
int WINAPI lstrcmpA(LPCSTR str1, LPCSTR str2)
Definition: locale.c:4195
static void TestEntry(const ENTRY *pEntry)
WCHAR TestName[MAX_PATH]
Definition: main.cpp:13
EH_STD::__list__< TestClass, eh_allocator(TestClass) > TestList
Definition: test_list.cpp:31
const char * PCSTR
Definition: typedefs.h:52

◆ ListTests()

static DWORD ListTests ( IN BOOLEAN  IncludeHidden)
static

Definition at line 111 of file kmtest.c.

113{
115 PSTR Buffer = NULL;
116 DWORD BufferSize = 1024;
120 PCSTR NextTestName;
121
122 puts("Valid test names:");
123
124 // get test list from driver
125 while (TRUE)
126 {
128 if (!Buffer)
130
133 if (BytesRead < BufferSize)
134 break;
135
137 BufferSize *= 2;
138 }
139
140 // output test list plus user-mode tests
142 while (TestEntry->TestName || *TestName)
143 {
144 if (!TestEntry->TestName)
145 {
146 NextTestName = TestName;
147 TestName += strlen(TestName) + 1;
148 }
149 else if (!*TestName)
150 {
151 NextTestName = TestEntry->TestName;
152 ++TestEntry;
153 }
154 else
155 {
157
158 if (Result == 0)
159 {
160 NextTestName = TestEntry->TestName;
161 TestName += strlen(TestName) + 1;
162 ++TestEntry;
163 }
164 else if (Result < 0)
165 {
166 NextTestName = TestEntry->TestName;
167 ++TestEntry;
168 }
169 else
170 {
171 NextTestName = TestName;
172 TestName += strlen(TestName) + 1;
173 }
174 }
175
176 if (IncludeHidden && NextTestName[0] == '-')
177 ++NextTestName;
178
179 if (NextTestName[0] != '-')
180 printf(" %s\n", NextTestName);
181 }
182
183cleanup:
184 if (Buffer)
186
187 return Error;
188}
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
BOOL Error
Definition: chkdsk.c:66
Definition: bufpool.h:45
int puts(const char *string)
Definition: crtsupp.c:23
#define BufferSize
Definition: mmc.h:75
#define ERROR_SUCCESS
Definition: deptool.c:10
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
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
static void cleanup(void)
Definition: main.c:1335
unsigned long DWORD
Definition: ntddk_ex.h:95
#define printf
Definition: freeldr.h:97
#define IOCTL_KMTEST_GET_TESTS
Definition: kmt_public.h:13
HANDLE KmtestHandle
Definition: kmtest.c:32
static INT CompareTestNames(IN PCSTR Str1, IN PCSTR Str2)
Definition: kmtest.c:81
#define error_goto(Error, label)
Definition: kmtest.h:21
char * PSTR
Definition: typedefs.h:51
int32_t INT
Definition: typedefs.h:58
_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
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
Definition: wdfmemory.h:254
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409

Referenced by main().

◆ main()

int __cdecl main ( int  ArgCount,
char **  Arguments 
)

Definition at line 318 of file kmtest.c.

321{
324 PCSTR AppName = "kmtest.exe";
327 BOOLEAN ShowHidden = FALSE;
328
330 if (Error)
331 goto cleanup;
332
333 if (ArgCount >= 1)
334 AppName = Arguments[0];
335
336 if (ArgCount <= 1)
337 {
338 printf("Usage: %s <test_name> - run the specified test (creates/starts the driver(s) as appropriate)\n", AppName);
339 printf(" %s --list - list available tests\n", AppName);
340 printf(" %s --list-all - list available tests, including hidden\n", AppName);
341 printf(" %s <create|delete|start|stop> - manage the kmtest driver\n\n", AppName);
343 }
344 else
345 {
346 TestName = Arguments[1];
347 if (!lstrcmpA(TestName, "create"))
349 else if (!lstrcmpA(TestName, "delete"))
351 else if (!lstrcmpA(TestName, "start"))
353 else if (!lstrcmpA(TestName, "stop"))
355
356 else if (!lstrcmpA(TestName, "--list"))
358 else if (!lstrcmpA(TestName, "--list-all"))
360 else
362 }
363
364 if (Operation)
365 {
367 if (Error)
368 goto cleanup;
369
373
374 switch (Operation)
375 {
377 ShowHidden = TRUE;
378 /* fall through */
379 case KMT_LIST_TESTS:
380 Error = ListTests(ShowHidden);
381 break;
382 case KMT_RUN_TEST:
384 break;
385 default:
386 assert(FALSE);
387 }
388 }
389
390cleanup:
391 if (KmtestHandle)
393
394 if (ResultBuffer)
396
398
399 if (Error)
401 else
403
404 if (Error)
405 {
407
409 }
410
411 return Status;
412}
DWORD KmtStartService(IN PCWSTR ServiceName OPTIONAL, IN OUT SC_HANDLE *ServiceHandle)
Definition: service.c:217
static KSTART_ROUTINE RunTest
Definition: NpfsConnect.c:238
unsigned char BOOLEAN
static CHAR AppName[MAX_PATH]
Definition: dem.c:252
#define FALSE
Definition: types.h:117
#define CloseHandle
Definition: compat.h:739
#define OPEN_EXISTING
Definition: compat.h:775
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define GENERIC_READ
Definition: compat.h:135
#define assert(x)
Definition: debug.h:53
FP_OP Operation
Definition: fpcontrol.c:150
Status
Definition: gdiplustypes.h:25
#define EXIT_FAILURE
Definition: jerror.c:33
#define KMTEST_DEVICE_PATH
Definition: kmt_public.h:35
PKMT_RESULTBUFFER ResultBuffer
static VOID KmtFreeResultBuffer(PKMT_RESULTBUFFER Buffer)
Definition: kmt_test_user.h:30
static DWORD ListTests(IN BOOLEAN IncludeHidden)
Definition: kmtest.c:111
static void OutputError(IN DWORD Error)
Definition: kmtest.c:53
#define SERVICE_NAME
Definition: kmtest.c:18
#define SERVICE_PATH
Definition: kmtest.c:19
SC_HANDLE KmtestServiceHandle
Definition: kmtest.c:33
DWORD KmtServiceCleanup(BOOLEAN IgnoreErrors)
Definition: service.c:64
DWORD KmtServiceInit(VOID)
Definition: service.c:40
DWORD KmtCloseService(IN OUT SC_HANDLE *ServiceHandle)
Definition: service.c:392
DWORD KmtDeleteService(IN PCWSTR ServiceName OPTIONAL, IN OUT SC_HANDLE *ServiceHandle)
Definition: service.c:356
DWORD KmtCreateService(IN PCWSTR ServiceName, IN PCWSTR ServicePath, IN PCWSTR DisplayName OPTIONAL, OUT SC_HANDLE *ServiceHandle)
Definition: service.c:92
DWORD KmtStopService(IN PCWSTR ServiceName OPTIONAL, IN OUT SC_HANDLE *ServiceHandle)
Definition: service.c:315
DWORD KmtCreateAndStartService(IN PCWSTR ServiceName, IN PCWSTR ServicePath, IN PCWSTR DisplayName OPTIONAL, OUT SC_HANDLE *ServiceHandle, IN BOOLEAN RestartIfRunning)
Definition: service.c:262
#define GENERIC_WRITE
Definition: nt_native.h:90
#define EXIT_SUCCESS
Definition: rdjpgcom.c:55
#define CreateFile
Definition: winbase.h:3790

◆ OutputError()

static void OutputError ( IN DWORD  Error)
static

Definition at line 53 of file kmtest.c.

55{
59 {
60 fprintf(stderr, "%s: Could not retrieve error message (error 0x%08lx). Original error: 0x%08lx\n",
62 return;
63 }
64
65 fprintf(stderr, "%s: error 0x%08lx: %s\n", ErrorFileAndLine, Error, Message);
66
68}
DWORD WINAPI FormatMessageA(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPSTR lpBuffer, DWORD nSize, __ms_va_list *args)
Definition: format_msg.c:483
static const WCHAR Message[]
Definition: register.c:74
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
#define stderr
Definition: stdio.h:100
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
PCSTR ErrorFileAndLine
Definition: kmtest.c:34
#define LANG_NEUTRAL
Definition: nls.h:22
#define MAKELANGID(p, s)
Definition: nls.h:15
#define SUBLANG_DEFAULT
Definition: nls.h:168
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define FORMAT_MESSAGE_IGNORE_INSERTS
Definition: winbase.h:453
#define FORMAT_MESSAGE_FROM_SYSTEM
Definition: winbase.h:456
#define FORMAT_MESSAGE_ALLOCATE_BUFFER
Definition: winbase.h:452
char * LPSTR
Definition: xmlstorage.h:182

Referenced by main().

◆ OutputResult()

static DWORD OutputResult ( IN PCSTR  TestName)
static

Definition at line 234 of file kmtest.c.

236{
239 DWORD LogBufferLength;
240 DWORD Offset = 0;
241 /* A console window can't handle a single
242 * huge block of data, so split it up */
243 const DWORD BlockSize = 8 * 1024;
244
245 KmtFinishTest(TestName);
246
247 LogBufferLength = ResultBuffer->LogBufferLength;
248 for (Offset = 0; Offset < LogBufferLength; Offset += BlockSize)
249 {
250 DWORD Length = min(LogBufferLength - Offset, BlockSize);
252 error(Error);
253 }
254
255 return Error;
256}
HANDLE WINAPI GetStdHandle(IN DWORD nStdHandle)
Definition: console.c:203
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
#define error(str)
Definition: mkdosfs.c:1605
#define min(a, b)
Definition: monoChain.cc:55
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
CHAR LogBuffer[ANYSIZE_ARRAY]
Definition: kmt_test.h:41
volatile LONG LogBufferLength
Definition: kmt_test.h:39
_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 BytesWritten
Definition: wdfiotarget.h:960
#define STD_OUTPUT_HANDLE
Definition: winbase.h:301

Referenced by RunTest().

◆ RunTest()

static DWORD RunTest ( IN PCSTR  TestName)
static

Definition at line 270 of file kmtest.c.

272{
276
277 assert(TestName != NULL);
278
279 if (!ResultBuffer)
280 {
282 if (!ResultBuffer)
286 }
287
288 // check test list
290
291 if (TestFunction)
292 {
293 TestFunction();
294 goto cleanup;
295 }
296
297 // not found in user-mode test list, call driver
299
300cleanup:
301 if (!Error)
303
304 return Error;
305}
#define IOCTL_KMTEST_SET_RESULTBUFFER
Definition: kmt_public.h:19
KMT_TESTFUNC * PKMT_TESTFUNC
Definition: kmt_test.h:22
static PKMT_RESULTBUFFER KmtAllocateResultBuffer(SIZE_T ResultBufferSize)
Definition: kmt_test_user.h:15
#define RESULTBUFFER_SIZE
Definition: kmtest.c:22
static DWORD OutputResult(IN PCSTR TestName)
Definition: kmtest.c:234
void TestFunction()
DWORD KmtRunKernelTest(IN PCSTR TestName)
Definition: support.c:95

Variable Documentation

◆ ErrorFileAndLine

PCSTR ErrorFileAndLine = "No error"

Definition at line 34 of file kmtest.c.

Referenced by OutputError().

◆ KmtestHandle

HANDLE KmtestHandle

Definition at line 32 of file kmtest.c.

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

◆ KmtestServiceHandle

SC_HANDLE KmtestServiceHandle

Definition at line 33 of file kmtest.c.

Referenced by main().