Author: tfaber Date: Tue Nov 4 20:55:16 2014 New Revision: 65256
URL: http://svn.reactos.org/svn/reactos?rev=65256&view=rev Log: [KMTESTS] - Move out definitions for user/kernel test utility functions into their own header (still not pretty, but at least the one header won't get as huge - Make KmtStartThread/KmtFinishThread available to all tests
Added: trunk/rostests/kmtests/include/kmt_test_kernel.h - copied, changed from r65197, trunk/rostests/kmtests/include/kmt_test.h trunk/rostests/kmtests/include/kmt_test_user.h - copied, changed from r65197, trunk/rostests/kmtests/include/kmt_test.h Modified: trunk/rostests/kmtests/include/kmt_test.h trunk/rostests/kmtests/npfs/NpfsHelpers.c trunk/rostests/kmtests/npfs/npfs.h
Modified: trunk/rostests/kmtests/include/kmt_test.h URL: http://svn.reactos.org/svn/reactos/trunk/rostests/kmtests/include/kmt_test.h... ============================================================================== --- trunk/rostests/kmtests/include/kmt_test.h [iso-8859-1] (original) +++ trunk/rostests/kmtests/include/kmt_test.h [iso-8859-1] Tue Nov 4 20:55:16 2014 @@ -132,6 +132,8 @@ BOOLEAN KmtAreInterruptsEnabled(VOID); ULONG KmtGetPoolTag(PVOID Memory); USHORT KmtGetPoolType(PVOID Memory); +PKTHREAD KmtStartThread(IN PKSTART_ROUTINE StartRoutine, IN PVOID StartContext OPTIONAL); +VOID KmtFinishThread(IN PKTHREAD Thread OPTIONAL, IN PKEVENT Event OPTIONAL); #elif defined KMT_USER_MODE DWORD KmtRunKernelTest(IN PCSTR TestName);
@@ -242,143 +244,9 @@ #if defined KMT_DEFINE_TEST_FUNCTIONS
#if defined KMT_KERNEL_MODE -BOOLEAN KmtIsCheckedBuild; -BOOLEAN KmtIsMultiProcessorBuild; -PCSTR KmtMajorFunctionNames[] = -{ - "Create", - "CreateNamedPipe", - "Close", - "Read", - "Write", - "QueryInformation", - "SetInformation", - "QueryEa", - "SetEa", - "FlushBuffers", - "QueryVolumeInformation", - "SetVolumeInformation", - "DirectoryControl", - "FileSystemControl", - "DeviceControl", - "InternalDeviceControl/Scsi", - "Shutdown", - "LockControl", - "Cleanup", - "CreateMailslot", - "QuerySecurity", - "SetSecurity", - "Power", - "SystemControl", - "DeviceChange", - "QueryQuota", - "SetQuota", - "Pnp/PnpPower" -}; - -VOID KmtSetIrql(IN KIRQL NewIrql) -{ - KIRQL Irql = KeGetCurrentIrql(); - if (Irql > NewIrql) - KeLowerIrql(NewIrql); - else if (Irql < NewIrql) - KeRaiseIrql(NewIrql, &Irql); -} - -BOOLEAN KmtAreInterruptsEnabled(VOID) -{ - return (__readeflags() & (1 << 9)) != 0; -} - -typedef struct _POOL_HEADER -{ - union - { - struct - { -#ifdef _M_AMD64 - USHORT PreviousSize:8; - USHORT PoolIndex:8; - USHORT BlockSize:8; - USHORT PoolType:8; -#else - USHORT PreviousSize:9; - USHORT PoolIndex:7; - USHORT BlockSize:9; - USHORT PoolType:7; -#endif - }; - ULONG Ulong1; - }; -#ifdef _M_AMD64 - ULONG PoolTag; -#endif - union - { -#ifdef _M_AMD64 - PEPROCESS ProcessBilled; -#else - ULONG PoolTag; -#endif - struct - { - USHORT AllocatorBackTraceIndex; - USHORT PoolTagHash; - }; - }; -} POOL_HEADER, *PPOOL_HEADER; - -ULONG KmtGetPoolTag(PVOID Memory) -{ - PPOOL_HEADER Header; - - /* it's not so easy for allocations of PAGE_SIZE */ - if (((ULONG_PTR)Memory & (PAGE_SIZE - 1)) == 0) - return 'TooL'; - - Header = Memory; - Header--; - - return Header->PoolTag; -} - -USHORT KmtGetPoolType(PVOID Memory) -{ - PPOOL_HEADER Header; - - /* it's not so easy for allocations of PAGE_SIZE */ - if (((ULONG_PTR)Memory & (PAGE_SIZE - 1)) == 0) - return 0; - - Header = Memory; - Header--; - - return Header->PoolType; -} - -INT __cdecl KmtVSNPrintF(PSTR Buffer, SIZE_T BufferMaxLength, PCSTR Format, va_list Arguments) KMT_FORMAT(ms_printf, 3, 0); +#include "kmt_test_kernel.h" #elif defined KMT_USER_MODE -static PKMT_RESULTBUFFER KmtAllocateResultBuffer(SIZE_T ResultBufferSize) -{ - PKMT_RESULTBUFFER Buffer = HeapAlloc(GetProcessHeap(), 0, ResultBufferSize); - if (!Buffer) - return NULL; - - Buffer->Successes = 0; - Buffer->Failures = 0; - Buffer->Skipped = 0; - Buffer->LogBufferLength = 0; - Buffer->LogBufferMaxLength = (ULONG)ResultBufferSize - FIELD_OFFSET(KMT_RESULTBUFFER, LogBuffer); - - return Buffer; -} - -static VOID KmtFreeResultBuffer(PKMT_RESULTBUFFER Buffer) -{ - HeapFree(GetProcessHeap(), 0, Buffer); -} - -#define KmtVSNPrintF vsnprintf +#include "kmt_test_user.h" #endif /* defined KMT_USER_MODE */
PKMT_RESULTBUFFER ResultBuffer = NULL;
Copied: trunk/rostests/kmtests/include/kmt_test_kernel.h (from r65197, trunk/rostests/kmtests/include/kmt_test.h) URL: http://svn.reactos.org/svn/reactos/trunk/rostests/kmtests/include/kmt_test_k... ============================================================================== --- trunk/rostests/kmtests/include/kmt_test.h [iso-8859-1] (original) +++ trunk/rostests/kmtests/include/kmt_test_kernel.h [iso-8859-1] Tue Nov 4 20:55:16 2014 @@ -1,247 +1,17 @@ /* * PROJECT: ReactOS kernel-mode tests - * LICENSE: GPLv2+ - See COPYING in the top level directory + * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory * PURPOSE: Kernel-Mode Test Suite test framework declarations * PROGRAMMER: Thomas Faber thomas.faber@reactos.org */
-/* Inspired by Wine C unit tests, Copyright (C) 2002 Alexandre Julliard - * Inspired by ReactOS kernel-mode regression tests, - * Copyright (C) Aleksey Bragin, Filip Navara - */ +#ifndef _KMTEST_TEST_KERNEL_H_ +#define _KMTEST_TEST_KERNEL_H_
-#ifndef _KMTEST_TEST_H_ -#define _KMTEST_TEST_H_ +#if !defined _KMTEST_TEST_H_ +#error include kmt_test.h instead of including kmt_test_kernel.h +#endif /* !defined _KMTEST_TEST_H_ */
-#include <kmt_platform.h> - -typedef VOID KMT_TESTFUNC(VOID); -typedef KMT_TESTFUNC *PKMT_TESTFUNC; - -typedef struct -{ - const char *TestName; - KMT_TESTFUNC *TestFunction; -} KMT_TEST, *PKMT_TEST; - -typedef const KMT_TEST CKMT_TEST, *PCKMT_TEST; - -extern const KMT_TEST TestList[]; - -typedef struct -{ - volatile LONG Successes; - volatile LONG Failures; - volatile LONG Skipped; - volatile LONG LogBufferLength; - LONG LogBufferMaxLength; - CHAR LogBuffer[ANYSIZE_ARRAY]; -} KMT_RESULTBUFFER, *PKMT_RESULTBUFFER; - -#ifndef KMT_STANDALONE_DRIVER - -/* usermode call-back mechanism */ - -/* list of supported operations */ -typedef enum _KMT_CALLBACK_INFORMATION_CLASS -{ - QueryVirtualMemory -} KMT_CALLBACK_INFORMATION_CLASS, *PKMT_CALLBACK_INFORMATION_CLASS; - -/* TODO: "response" is a little generic */ -typedef union _KMT_RESPONSE -{ - MEMORY_BASIC_INFORMATION MemInfo; -} KMT_RESPONSE, *PKMT_RESPONSE; - -/* this struct is sent from driver to usermode */ -typedef struct _KMT_CALLBACK_REQUEST_PACKET -{ - ULONG RequestId; - KMT_CALLBACK_INFORMATION_CLASS OperationClass; - PVOID Parameters; -} KMT_CALLBACK_REQUEST_PACKET, *PKMT_CALLBACK_REQUEST_PACKET; - -PKMT_RESPONSE KmtUserModeCallback(KMT_CALLBACK_INFORMATION_CLASS Operation, PVOID Parameters); -VOID KmtFreeCallbackResponse(PKMT_RESPONSE Response); - -//macro to simplify using the mechanism -#define Test_NtQueryVirtualMemory(BaseAddress, Size, AllocationType, ProtectionType) \ - do { \ - PKMT_RESPONSE NtQueryTest = KmtUserModeCallback(QueryVirtualMemory, BaseAddress); \ - if (NtQueryTest != NULL) \ - { \ - ok_eq_hex(NtQueryTest->MemInfo.Protect, ProtectionType); \ - ok_eq_hex(NtQueryTest->MemInfo.State, AllocationType); \ - ok_eq_size(NtQueryTest->MemInfo.RegionSize, Size); \ - KmtFreeCallbackResponse(NtQueryTest); \ - } \ - } while (0) \ - -#endif - -#ifdef KMT_STANDALONE_DRIVER -#define KMT_KERNEL_MODE - -typedef NTSTATUS (KMT_IRP_HANDLER)( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PIO_STACK_LOCATION IoStackLocation); -typedef KMT_IRP_HANDLER *PKMT_IRP_HANDLER; - -NTSTATUS KmtRegisterIrpHandler(IN UCHAR MajorFunction, IN PDEVICE_OBJECT DeviceObject OPTIONAL, IN PKMT_IRP_HANDLER IrpHandler); -NTSTATUS KmtUnregisterIrpHandler(IN UCHAR MajorFunction, IN PDEVICE_OBJECT DeviceObject OPTIONAL, IN PKMT_IRP_HANDLER IrpHandler); - -typedef NTSTATUS (KMT_MESSAGE_HANDLER)( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG ControlCode, - IN PVOID Buffer OPTIONAL, - IN SIZE_T InLength, - IN OUT PSIZE_T OutLength); -typedef KMT_MESSAGE_HANDLER *PKMT_MESSAGE_HANDLER; - -NTSTATUS KmtRegisterMessageHandler(IN ULONG ControlCode OPTIONAL, IN PDEVICE_OBJECT DeviceObject OPTIONAL, IN PKMT_MESSAGE_HANDLER MessageHandler); -NTSTATUS KmtUnregisterMessageHandler(IN ULONG ControlCode OPTIONAL, IN PDEVICE_OBJECT DeviceObject OPTIONAL, IN PKMT_MESSAGE_HANDLER MessageHandler); - -typedef enum -{ - TESTENTRY_NO_CREATE_DEVICE = 1, - TESTENTRY_NO_REGISTER_DISPATCH = 2, - TESTENTRY_NO_REGISTER_UNLOAD = 4, - TESTENTRY_NO_EXCLUSIVE_DEVICE = 8, -} KMT_TESTENTRY_FLAGS; - -NTSTATUS TestEntry(IN PDRIVER_OBJECT DriverObject, IN PCUNICODE_STRING RegistryPath, OUT PCWSTR *DeviceName, IN OUT INT *Flags); -VOID TestUnload(IN PDRIVER_OBJECT DriverObject); -#endif /* defined KMT_STANDALONE_DRIVER */ - -#ifdef KMT_KERNEL_MODE -/* Device Extension layout */ -typedef struct -{ - PKMT_RESULTBUFFER ResultBuffer; - PMDL Mdl; -} KMT_DEVICE_EXTENSION, *PKMT_DEVICE_EXTENSION; - -extern BOOLEAN KmtIsCheckedBuild; -extern BOOLEAN KmtIsMultiProcessorBuild; -extern PCSTR KmtMajorFunctionNames[]; -extern PDRIVER_OBJECT KmtDriverObject; - -VOID KmtSetIrql(IN KIRQL NewIrql); -BOOLEAN KmtAreInterruptsEnabled(VOID); -ULONG KmtGetPoolTag(PVOID Memory); -USHORT KmtGetPoolType(PVOID Memory); -#elif defined KMT_USER_MODE -DWORD KmtRunKernelTest(IN PCSTR TestName); - -VOID KmtLoadDriver(IN PCWSTR ServiceName, IN BOOLEAN RestartIfRunning); -VOID KmtUnloadDriver(VOID); -VOID KmtOpenDriver(VOID); -VOID KmtCloseDriver(VOID); - -DWORD KmtSendToDriver(IN DWORD ControlCode); -DWORD KmtSendStringToDriver(IN DWORD ControlCode, IN PCSTR String); -DWORD KmtSendWStringToDriver(IN DWORD ControlCode, IN PCWSTR String); -DWORD KmtSendBufferToDriver(IN DWORD ControlCode, IN OUT PVOID Buffer OPTIONAL, IN DWORD InLength, IN OUT PDWORD OutLength); -#else /* if !defined KMT_KERNEL_MODE && !defined KMT_USER_MODE */ -#error either KMT_KERNEL_MODE or KMT_USER_MODE must be defined -#endif /* !defined KMT_KERNEL_MODE && !defined KMT_USER_MODE */ - -extern PKMT_RESULTBUFFER ResultBuffer; - -#ifdef __GNUC__ -/* TODO: GCC doesn't understand %wZ :( */ -#define KMT_FORMAT(type, fmt, first) /*__attribute__((__format__(type, fmt, first)))*/ -#elif !defined __GNUC__ -#define KMT_FORMAT(type, fmt, first) -#endif /* !defined __GNUC__ */ - -#define START_TEST(name) VOID Test_##name(VOID) - -#ifndef KMT_STRINGIZE -#define KMT_STRINGIZE(x) #x -#endif /* !defined KMT_STRINGIZE */ -#define ok(test, ...) ok_(test, __FILE__, __LINE__, __VA_ARGS__) -#define trace(...) trace_( __FILE__, __LINE__, __VA_ARGS__) -#define skip(test, ...) skip_(test, __FILE__, __LINE__, __VA_ARGS__) - -#define ok_(test, file, line, ...) KmtOk(test, file ":" KMT_STRINGIZE(line), __VA_ARGS__) -#define trace_(file, line, ...) KmtTrace( file ":" KMT_STRINGIZE(line), __VA_ARGS__) -#define skip_(test, file, line, ...) KmtSkip(test, file ":" KMT_STRINGIZE(line), __VA_ARGS__) - -BOOLEAN KmtVOk(INT Condition, PCSTR FileAndLine, PCSTR Format, va_list Arguments) KMT_FORMAT(ms_printf, 3, 0); -BOOLEAN KmtOk(INT Condition, PCSTR FileAndLine, PCSTR Format, ...) KMT_FORMAT(ms_printf, 3, 4); -VOID KmtVTrace(PCSTR FileAndLine, PCSTR Format, va_list Arguments) KMT_FORMAT(ms_printf, 2, 0); -VOID KmtTrace(PCSTR FileAndLine, PCSTR Format, ...) KMT_FORMAT(ms_printf, 2, 3); -BOOLEAN KmtVSkip(INT Condition, PCSTR FileAndLine, PCSTR Format, va_list Arguments) KMT_FORMAT(ms_printf, 3, 0); -BOOLEAN KmtSkip(INT Condition, PCSTR FileAndLine, PCSTR Format, ...) KMT_FORMAT(ms_printf, 3, 4); -PVOID KmtAllocateGuarded(SIZE_T SizeRequested); -VOID KmtFreeGuarded(PVOID Pointer); - -#ifdef KMT_KERNEL_MODE -#define ok_irql(irql) ok(KeGetCurrentIrql() == irql, "IRQL is %d, expected %d\n", KeGetCurrentIrql(), irql) -#endif /* defined KMT_KERNEL_MODE */ -#define ok_eq_print(value, expected, spec) ok((value) == (expected), #value " = " spec ", expected " spec "\n", value, expected) -#define ok_eq_pointer(value, expected) ok_eq_print(value, expected, "%p") -#define ok_eq_int(value, expected) ok_eq_print(value, expected, "%d") -#define ok_eq_uint(value, expected) ok_eq_print(value, expected, "%u") -#define ok_eq_long(value, expected) ok_eq_print(value, expected, "%ld") -#define ok_eq_ulong(value, expected) ok_eq_print(value, expected, "%lu") -#define ok_eq_longlong(value, expected) ok_eq_print(value, expected, "%I64d") -#define ok_eq_ulonglong(value, expected) ok_eq_print(value, expected, "%I64u") -#define ok_eq_char(value, expected) ok_eq_print(value, expected, "%c") -#define ok_eq_wchar(value, expected) ok_eq_print(value, expected, "%C") -#ifndef _WIN64 -#define ok_eq_size(value, expected) ok_eq_print(value, (SIZE_T)(expected), "%lu") -#define ok_eq_longptr(value, expected) ok_eq_print(value, (LONG_PTR)(expected), "%ld") -#define ok_eq_ulongptr(value, expected) ok_eq_print(value, (ULONG_PTR)(expected), "%lu") -#elif defined _WIN64 -#define ok_eq_size(value, expected) ok_eq_print(value, (SIZE_T)(expected), "%I64u") -#define ok_eq_longptr(value, expected) ok_eq_print(value, (LONG_PTR)(expected), "%I64d") -#define ok_eq_ulongptr(value, expected) ok_eq_print(value, (ULONG_PTR)(expected), "%I64u") -#endif /* defined _WIN64 */ -#define ok_eq_hex(value, expected) ok_eq_print(value, expected, "0x%08lx") -#define ok_bool_true(value, desc) ok((value) == TRUE, desc " FALSE, expected TRUE\n") -#define ok_bool_false(value, desc) ok((value) == FALSE, desc " TRUE, expected FALSE\n") -#define ok_eq_bool(value, expected) ok((value) == (expected), #value " = %s, expected %s\n", \ - (value) ? "TRUE" : "FALSE", \ - (expected) ? "TRUE" : "FALSE") -#define ok_eq_str(value, expected) ok(!strcmp(value, expected), #value " = "%s", expected "%s"\n", value, expected) -#define ok_eq_wstr(value, expected) ok(!wcscmp(value, expected), #value " = "%ls", expected "%ls"\n", value, expected) -#define ok_eq_tag(value, expected) ok_eq_print(value, expected, "0x%08lx") - -#define KMT_MAKE_CODE(ControlCode) CTL_CODE(FILE_DEVICE_UNKNOWN, \ - 0xC00 + (ControlCode), \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define MICROSECOND 10 -#define MILLISECOND (1000 * MICROSECOND) -#define SECOND (1000 * MILLISECOND) - -/* See apitests/include/apitest.h */ -#define KmtInvalidPointer ((PVOID)0x5555555555555555ULL) - -#define KmtStartSeh() \ -{ \ - NTSTATUS ExceptionStatus = STATUS_SUCCESS; \ - _SEH2_TRY \ - { - -#define KmtEndSeh(ExpectedStatus) \ - } \ - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) \ - { \ - ExceptionStatus = _SEH2_GetExceptionCode(); \ - } \ - _SEH2_END; \ - ok_eq_hex(ExceptionStatus, (ExpectedStatus)); \ -} - -#if defined KMT_DEFINE_TEST_FUNCTIONS - -#if defined KMT_KERNEL_MODE BOOLEAN KmtIsCheckedBuild; BOOLEAN KmtIsMultiProcessorBuild; PCSTR KmtMajorFunctionNames[] = @@ -356,240 +126,59 @@ return Header->PoolType; }
-INT __cdecl KmtVSNPrintF(PSTR Buffer, SIZE_T BufferMaxLength, PCSTR Format, va_list Arguments) KMT_FORMAT(ms_printf, 3, 0); -#elif defined KMT_USER_MODE -static PKMT_RESULTBUFFER KmtAllocateResultBuffer(SIZE_T ResultBufferSize) +PKTHREAD KmtStartThread(IN PKSTART_ROUTINE StartRoutine, IN PVOID StartContext OPTIONAL) { - PKMT_RESULTBUFFER Buffer = HeapAlloc(GetProcessHeap(), 0, ResultBufferSize); - if (!Buffer) - return NULL; + NTSTATUS Status; + OBJECT_ATTRIBUTES ObjectAttributes; + HANDLE ThreadHandle; + PVOID ThreadObject = NULL;
- Buffer->Successes = 0; - Buffer->Failures = 0; - Buffer->Skipped = 0; - Buffer->LogBufferLength = 0; - Buffer->LogBufferMaxLength = (ULONG)ResultBufferSize - FIELD_OFFSET(KMT_RESULTBUFFER, LogBuffer); - - return Buffer; + InitializeObjectAttributes(&ObjectAttributes, + NULL, + OBJ_KERNEL_HANDLE, + NULL, + NULL); + ThreadHandle = INVALID_HANDLE_VALUE; + Status = PsCreateSystemThread(&ThreadHandle, + SYNCHRONIZE, + &ObjectAttributes, + NULL, + NULL, + StartRoutine, + StartContext); + ok_eq_hex(Status, STATUS_SUCCESS); + if (!skip(NT_SUCCESS(Status) && ThreadHandle != NULL && ThreadHandle != INVALID_HANDLE_VALUE, "No thread\n")) + { + Status = ObReferenceObjectByHandle(ThreadHandle, + SYNCHRONIZE, + *PsThreadType, + KernelMode, + &ThreadObject, + NULL); + ok_eq_hex(Status, STATUS_SUCCESS); + ObCloseHandle(ThreadHandle, KernelMode); + } + return ThreadObject; }
-static VOID KmtFreeResultBuffer(PKMT_RESULTBUFFER Buffer) +VOID KmtFinishThread(IN PKTHREAD Thread OPTIONAL, IN PKEVENT Event OPTIONAL) { - HeapFree(GetProcessHeap(), 0, Buffer); + NTSTATUS Status; + + if (skip(Thread != NULL, "No thread\n")) + return; + + if (Event) + KeSetEvent(Event, IO_NO_INCREMENT, TRUE); + Status = KeWaitForSingleObject(Thread, + Executive, + KernelMode, + FALSE, + NULL); + ok_eq_hex(Status, STATUS_SUCCESS); + ObDereferenceObject(Thread); }
-#define KmtVSNPrintF vsnprintf -#endif /* defined KMT_USER_MODE */ +INT __cdecl KmtVSNPrintF(PSTR Buffer, SIZE_T BufferMaxLength, PCSTR Format, va_list Arguments) KMT_FORMAT(ms_printf, 3, 0);
-PKMT_RESULTBUFFER ResultBuffer = NULL; - -static VOID KmtAddToLogBuffer(PKMT_RESULTBUFFER Buffer, PCSTR String, SIZE_T Length) -{ - LONG OldLength; - LONG NewLength; - - if (!Buffer) - return; - - do - { - OldLength = Buffer->LogBufferLength; - NewLength = OldLength + (ULONG)Length; - if (NewLength > Buffer->LogBufferMaxLength) - return; - } while (InterlockedCompareExchange(&Buffer->LogBufferLength, NewLength, OldLength) != OldLength); - - memcpy(&Buffer->LogBuffer[OldLength], String, Length); -} - -KMT_FORMAT(ms_printf, 5, 0) -static SIZE_T KmtXVSNPrintF(PSTR Buffer, SIZE_T BufferMaxLength, PCSTR FileAndLine, PCSTR Prepend, PCSTR Format, va_list Arguments) -{ - SIZE_T BufferLength = 0; - SIZE_T Length; - - if (FileAndLine) - { - PCSTR Slash; - Slash = strrchr(FileAndLine, '\'); - if (Slash) - FileAndLine = Slash + 1; - Slash = strrchr(FileAndLine, '/'); - if (Slash) - FileAndLine = Slash + 1; - - Length = min(BufferMaxLength, strlen(FileAndLine)); - memcpy(Buffer, FileAndLine, Length); - Buffer += Length; - BufferLength += Length; - BufferMaxLength -= Length; - } - if (Prepend) - { - Length = min(BufferMaxLength, strlen(Prepend)); - memcpy(Buffer, Prepend, Length); - Buffer += Length; - BufferLength += Length; - BufferMaxLength -= Length; - } - if (Format) - { - Length = KmtVSNPrintF(Buffer, BufferMaxLength, Format, Arguments); - /* vsnprintf can return more than maxLength, we don't want to do that */ - BufferLength += min(Length, BufferMaxLength); - } - return BufferLength; -} - -KMT_FORMAT(ms_printf, 5, 6) -static SIZE_T KmtXSNPrintF(PSTR Buffer, SIZE_T BufferMaxLength, PCSTR FileAndLine, PCSTR Prepend, PCSTR Format, ...) -{ - SIZE_T BufferLength; - va_list Arguments; - va_start(Arguments, Format); - BufferLength = KmtXVSNPrintF(Buffer, BufferMaxLength, FileAndLine, Prepend, Format, Arguments); - va_end(Arguments); - return BufferLength; -} - -VOID KmtFinishTest(PCSTR TestName) -{ - CHAR MessageBuffer[512]; - SIZE_T MessageLength; - - if (!ResultBuffer) - return; - - MessageLength = KmtXSNPrintF(MessageBuffer, sizeof MessageBuffer, NULL, NULL, - "%s: %ld tests executed (0 marked as todo, %ld failures), %ld skipped.\n", - TestName, - ResultBuffer->Successes + ResultBuffer->Failures, - ResultBuffer->Failures, - ResultBuffer->Skipped); - KmtAddToLogBuffer(ResultBuffer, MessageBuffer, MessageLength); -} - -BOOLEAN KmtVOk(INT Condition, PCSTR FileAndLine, PCSTR Format, va_list Arguments) -{ - CHAR MessageBuffer[512]; - SIZE_T MessageLength; - - if (!ResultBuffer) - return Condition != 0; - - if (Condition) - { - InterlockedIncrement(&ResultBuffer->Successes); - - if (0/*KmtReportSuccess*/) - { - MessageLength = KmtXSNPrintF(MessageBuffer, sizeof MessageBuffer, FileAndLine, ": Test succeeded\n", NULL); - KmtAddToLogBuffer(ResultBuffer, MessageBuffer, MessageLength); - } - } - else - { - InterlockedIncrement(&ResultBuffer->Failures); - MessageLength = KmtXVSNPrintF(MessageBuffer, sizeof MessageBuffer, FileAndLine, ": Test failed: ", Format, Arguments); - KmtAddToLogBuffer(ResultBuffer, MessageBuffer, MessageLength); - } - - return Condition != 0; -} - -BOOLEAN KmtOk(INT Condition, PCSTR FileAndLine, PCSTR Format, ...) -{ - BOOLEAN Ret; - va_list Arguments; - va_start(Arguments, Format); - Ret = KmtVOk(Condition, FileAndLine, Format, Arguments); - va_end(Arguments); - return Ret; -} - -VOID KmtVTrace(PCSTR FileAndLine, PCSTR Format, va_list Arguments) -{ - CHAR MessageBuffer[512]; - SIZE_T MessageLength; - - MessageLength = KmtXVSNPrintF(MessageBuffer, sizeof MessageBuffer, FileAndLine, ": ", Format, Arguments); - KmtAddToLogBuffer(ResultBuffer, MessageBuffer, MessageLength); -} - -VOID KmtTrace(PCSTR FileAndLine, PCSTR Format, ...) -{ - va_list Arguments; - va_start(Arguments, Format); - KmtVTrace(FileAndLine, Format, Arguments); - va_end(Arguments); -} - -BOOLEAN KmtVSkip(INT Condition, PCSTR FileAndLine, PCSTR Format, va_list Arguments) -{ - CHAR MessageBuffer[512]; - SIZE_T MessageLength; - - if (!ResultBuffer) - return !Condition; - - if (!Condition) - { - InterlockedIncrement(&ResultBuffer->Skipped); - MessageLength = KmtXVSNPrintF(MessageBuffer, sizeof MessageBuffer, FileAndLine, ": Tests skipped: ", Format, Arguments); - KmtAddToLogBuffer(ResultBuffer, MessageBuffer, MessageLength); - } - - return !Condition; -} - -BOOLEAN KmtSkip(INT Condition, PCSTR FileAndLine, PCSTR Format, ...) -{ - BOOLEAN Ret; - va_list Arguments; - va_start(Arguments, Format); - Ret = KmtVSkip(Condition, FileAndLine, Format, Arguments); - va_end(Arguments); - return Ret; -} - -PVOID KmtAllocateGuarded(SIZE_T SizeRequested) -{ - NTSTATUS Status; - SIZE_T Size = PAGE_ROUND_UP(SizeRequested + PAGE_SIZE); - PVOID VirtualMemory = NULL; - PCHAR StartOfBuffer; - - Status = ZwAllocateVirtualMemory(ZwCurrentProcess(), &VirtualMemory, 0, &Size, MEM_RESERVE, PAGE_NOACCESS); - - if (!NT_SUCCESS(Status)) - return NULL; - - Size -= PAGE_SIZE; - Status = ZwAllocateVirtualMemory(ZwCurrentProcess(), &VirtualMemory, 0, &Size, MEM_COMMIT, PAGE_READWRITE); - if (!NT_SUCCESS(Status)) - { - Size = 0; - Status = ZwFreeVirtualMemory(ZwCurrentProcess(), &VirtualMemory, &Size, MEM_RELEASE); - ok_eq_hex(Status, STATUS_SUCCESS); - return NULL; - } - - StartOfBuffer = VirtualMemory; - StartOfBuffer += Size - SizeRequested; - - return StartOfBuffer; -} - -VOID KmtFreeGuarded(PVOID Pointer) -{ - NTSTATUS Status; - PVOID VirtualMemory = (PVOID)PAGE_ROUND_DOWN((SIZE_T)Pointer); - SIZE_T Size = 0; - - Status = ZwFreeVirtualMemory(ZwCurrentProcess(), &VirtualMemory, &Size, MEM_RELEASE); - ok_eq_hex(Status, STATUS_SUCCESS); -} - -#endif /* defined KMT_DEFINE_TEST_FUNCTIONS */ - -#endif /* !defined _KMTEST_TEST_H_ */ +#endif /* !defined _KMTEST_TEST_KERNEL_H_ */
Copied: trunk/rostests/kmtests/include/kmt_test_user.h (from r65197, trunk/rostests/kmtests/include/kmt_test.h) URL: http://svn.reactos.org/svn/reactos/trunk/rostests/kmtests/include/kmt_test_u... ============================================================================== --- trunk/rostests/kmtests/include/kmt_test.h [iso-8859-1] (original) +++ trunk/rostests/kmtests/include/kmt_test_user.h [iso-8859-1] Tue Nov 4 20:55:16 2014 @@ -1,363 +1,17 @@ /* * PROJECT: ReactOS kernel-mode tests - * LICENSE: GPLv2+ - See COPYING in the top level directory + * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory * PURPOSE: Kernel-Mode Test Suite test framework declarations * PROGRAMMER: Thomas Faber thomas.faber@reactos.org */
-/* Inspired by Wine C unit tests, Copyright (C) 2002 Alexandre Julliard - * Inspired by ReactOS kernel-mode regression tests, - * Copyright (C) Aleksey Bragin, Filip Navara - */ +#ifndef _KMTEST_TEST_USER_H_ +#define _KMTEST_TEST_USER_H_
-#ifndef _KMTEST_TEST_H_ -#define _KMTEST_TEST_H_ +#if !defined _KMTEST_TEST_H_ +#error include kmt_test.h instead of including kmt_test_user.h +#endif /* !defined _KMTEST_TEST_H_ */
-#include <kmt_platform.h> - -typedef VOID KMT_TESTFUNC(VOID); -typedef KMT_TESTFUNC *PKMT_TESTFUNC; - -typedef struct -{ - const char *TestName; - KMT_TESTFUNC *TestFunction; -} KMT_TEST, *PKMT_TEST; - -typedef const KMT_TEST CKMT_TEST, *PCKMT_TEST; - -extern const KMT_TEST TestList[]; - -typedef struct -{ - volatile LONG Successes; - volatile LONG Failures; - volatile LONG Skipped; - volatile LONG LogBufferLength; - LONG LogBufferMaxLength; - CHAR LogBuffer[ANYSIZE_ARRAY]; -} KMT_RESULTBUFFER, *PKMT_RESULTBUFFER; - -#ifndef KMT_STANDALONE_DRIVER - -/* usermode call-back mechanism */ - -/* list of supported operations */ -typedef enum _KMT_CALLBACK_INFORMATION_CLASS -{ - QueryVirtualMemory -} KMT_CALLBACK_INFORMATION_CLASS, *PKMT_CALLBACK_INFORMATION_CLASS; - -/* TODO: "response" is a little generic */ -typedef union _KMT_RESPONSE -{ - MEMORY_BASIC_INFORMATION MemInfo; -} KMT_RESPONSE, *PKMT_RESPONSE; - -/* this struct is sent from driver to usermode */ -typedef struct _KMT_CALLBACK_REQUEST_PACKET -{ - ULONG RequestId; - KMT_CALLBACK_INFORMATION_CLASS OperationClass; - PVOID Parameters; -} KMT_CALLBACK_REQUEST_PACKET, *PKMT_CALLBACK_REQUEST_PACKET; - -PKMT_RESPONSE KmtUserModeCallback(KMT_CALLBACK_INFORMATION_CLASS Operation, PVOID Parameters); -VOID KmtFreeCallbackResponse(PKMT_RESPONSE Response); - -//macro to simplify using the mechanism -#define Test_NtQueryVirtualMemory(BaseAddress, Size, AllocationType, ProtectionType) \ - do { \ - PKMT_RESPONSE NtQueryTest = KmtUserModeCallback(QueryVirtualMemory, BaseAddress); \ - if (NtQueryTest != NULL) \ - { \ - ok_eq_hex(NtQueryTest->MemInfo.Protect, ProtectionType); \ - ok_eq_hex(NtQueryTest->MemInfo.State, AllocationType); \ - ok_eq_size(NtQueryTest->MemInfo.RegionSize, Size); \ - KmtFreeCallbackResponse(NtQueryTest); \ - } \ - } while (0) \ - -#endif - -#ifdef KMT_STANDALONE_DRIVER -#define KMT_KERNEL_MODE - -typedef NTSTATUS (KMT_IRP_HANDLER)( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PIO_STACK_LOCATION IoStackLocation); -typedef KMT_IRP_HANDLER *PKMT_IRP_HANDLER; - -NTSTATUS KmtRegisterIrpHandler(IN UCHAR MajorFunction, IN PDEVICE_OBJECT DeviceObject OPTIONAL, IN PKMT_IRP_HANDLER IrpHandler); -NTSTATUS KmtUnregisterIrpHandler(IN UCHAR MajorFunction, IN PDEVICE_OBJECT DeviceObject OPTIONAL, IN PKMT_IRP_HANDLER IrpHandler); - -typedef NTSTATUS (KMT_MESSAGE_HANDLER)( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG ControlCode, - IN PVOID Buffer OPTIONAL, - IN SIZE_T InLength, - IN OUT PSIZE_T OutLength); -typedef KMT_MESSAGE_HANDLER *PKMT_MESSAGE_HANDLER; - -NTSTATUS KmtRegisterMessageHandler(IN ULONG ControlCode OPTIONAL, IN PDEVICE_OBJECT DeviceObject OPTIONAL, IN PKMT_MESSAGE_HANDLER MessageHandler); -NTSTATUS KmtUnregisterMessageHandler(IN ULONG ControlCode OPTIONAL, IN PDEVICE_OBJECT DeviceObject OPTIONAL, IN PKMT_MESSAGE_HANDLER MessageHandler); - -typedef enum -{ - TESTENTRY_NO_CREATE_DEVICE = 1, - TESTENTRY_NO_REGISTER_DISPATCH = 2, - TESTENTRY_NO_REGISTER_UNLOAD = 4, - TESTENTRY_NO_EXCLUSIVE_DEVICE = 8, -} KMT_TESTENTRY_FLAGS; - -NTSTATUS TestEntry(IN PDRIVER_OBJECT DriverObject, IN PCUNICODE_STRING RegistryPath, OUT PCWSTR *DeviceName, IN OUT INT *Flags); -VOID TestUnload(IN PDRIVER_OBJECT DriverObject); -#endif /* defined KMT_STANDALONE_DRIVER */ - -#ifdef KMT_KERNEL_MODE -/* Device Extension layout */ -typedef struct -{ - PKMT_RESULTBUFFER ResultBuffer; - PMDL Mdl; -} KMT_DEVICE_EXTENSION, *PKMT_DEVICE_EXTENSION; - -extern BOOLEAN KmtIsCheckedBuild; -extern BOOLEAN KmtIsMultiProcessorBuild; -extern PCSTR KmtMajorFunctionNames[]; -extern PDRIVER_OBJECT KmtDriverObject; - -VOID KmtSetIrql(IN KIRQL NewIrql); -BOOLEAN KmtAreInterruptsEnabled(VOID); -ULONG KmtGetPoolTag(PVOID Memory); -USHORT KmtGetPoolType(PVOID Memory); -#elif defined KMT_USER_MODE -DWORD KmtRunKernelTest(IN PCSTR TestName); - -VOID KmtLoadDriver(IN PCWSTR ServiceName, IN BOOLEAN RestartIfRunning); -VOID KmtUnloadDriver(VOID); -VOID KmtOpenDriver(VOID); -VOID KmtCloseDriver(VOID); - -DWORD KmtSendToDriver(IN DWORD ControlCode); -DWORD KmtSendStringToDriver(IN DWORD ControlCode, IN PCSTR String); -DWORD KmtSendWStringToDriver(IN DWORD ControlCode, IN PCWSTR String); -DWORD KmtSendBufferToDriver(IN DWORD ControlCode, IN OUT PVOID Buffer OPTIONAL, IN DWORD InLength, IN OUT PDWORD OutLength); -#else /* if !defined KMT_KERNEL_MODE && !defined KMT_USER_MODE */ -#error either KMT_KERNEL_MODE or KMT_USER_MODE must be defined -#endif /* !defined KMT_KERNEL_MODE && !defined KMT_USER_MODE */ - -extern PKMT_RESULTBUFFER ResultBuffer; - -#ifdef __GNUC__ -/* TODO: GCC doesn't understand %wZ :( */ -#define KMT_FORMAT(type, fmt, first) /*__attribute__((__format__(type, fmt, first)))*/ -#elif !defined __GNUC__ -#define KMT_FORMAT(type, fmt, first) -#endif /* !defined __GNUC__ */ - -#define START_TEST(name) VOID Test_##name(VOID) - -#ifndef KMT_STRINGIZE -#define KMT_STRINGIZE(x) #x -#endif /* !defined KMT_STRINGIZE */ -#define ok(test, ...) ok_(test, __FILE__, __LINE__, __VA_ARGS__) -#define trace(...) trace_( __FILE__, __LINE__, __VA_ARGS__) -#define skip(test, ...) skip_(test, __FILE__, __LINE__, __VA_ARGS__) - -#define ok_(test, file, line, ...) KmtOk(test, file ":" KMT_STRINGIZE(line), __VA_ARGS__) -#define trace_(file, line, ...) KmtTrace( file ":" KMT_STRINGIZE(line), __VA_ARGS__) -#define skip_(test, file, line, ...) KmtSkip(test, file ":" KMT_STRINGIZE(line), __VA_ARGS__) - -BOOLEAN KmtVOk(INT Condition, PCSTR FileAndLine, PCSTR Format, va_list Arguments) KMT_FORMAT(ms_printf, 3, 0); -BOOLEAN KmtOk(INT Condition, PCSTR FileAndLine, PCSTR Format, ...) KMT_FORMAT(ms_printf, 3, 4); -VOID KmtVTrace(PCSTR FileAndLine, PCSTR Format, va_list Arguments) KMT_FORMAT(ms_printf, 2, 0); -VOID KmtTrace(PCSTR FileAndLine, PCSTR Format, ...) KMT_FORMAT(ms_printf, 2, 3); -BOOLEAN KmtVSkip(INT Condition, PCSTR FileAndLine, PCSTR Format, va_list Arguments) KMT_FORMAT(ms_printf, 3, 0); -BOOLEAN KmtSkip(INT Condition, PCSTR FileAndLine, PCSTR Format, ...) KMT_FORMAT(ms_printf, 3, 4); -PVOID KmtAllocateGuarded(SIZE_T SizeRequested); -VOID KmtFreeGuarded(PVOID Pointer); - -#ifdef KMT_KERNEL_MODE -#define ok_irql(irql) ok(KeGetCurrentIrql() == irql, "IRQL is %d, expected %d\n", KeGetCurrentIrql(), irql) -#endif /* defined KMT_KERNEL_MODE */ -#define ok_eq_print(value, expected, spec) ok((value) == (expected), #value " = " spec ", expected " spec "\n", value, expected) -#define ok_eq_pointer(value, expected) ok_eq_print(value, expected, "%p") -#define ok_eq_int(value, expected) ok_eq_print(value, expected, "%d") -#define ok_eq_uint(value, expected) ok_eq_print(value, expected, "%u") -#define ok_eq_long(value, expected) ok_eq_print(value, expected, "%ld") -#define ok_eq_ulong(value, expected) ok_eq_print(value, expected, "%lu") -#define ok_eq_longlong(value, expected) ok_eq_print(value, expected, "%I64d") -#define ok_eq_ulonglong(value, expected) ok_eq_print(value, expected, "%I64u") -#define ok_eq_char(value, expected) ok_eq_print(value, expected, "%c") -#define ok_eq_wchar(value, expected) ok_eq_print(value, expected, "%C") -#ifndef _WIN64 -#define ok_eq_size(value, expected) ok_eq_print(value, (SIZE_T)(expected), "%lu") -#define ok_eq_longptr(value, expected) ok_eq_print(value, (LONG_PTR)(expected), "%ld") -#define ok_eq_ulongptr(value, expected) ok_eq_print(value, (ULONG_PTR)(expected), "%lu") -#elif defined _WIN64 -#define ok_eq_size(value, expected) ok_eq_print(value, (SIZE_T)(expected), "%I64u") -#define ok_eq_longptr(value, expected) ok_eq_print(value, (LONG_PTR)(expected), "%I64d") -#define ok_eq_ulongptr(value, expected) ok_eq_print(value, (ULONG_PTR)(expected), "%I64u") -#endif /* defined _WIN64 */ -#define ok_eq_hex(value, expected) ok_eq_print(value, expected, "0x%08lx") -#define ok_bool_true(value, desc) ok((value) == TRUE, desc " FALSE, expected TRUE\n") -#define ok_bool_false(value, desc) ok((value) == FALSE, desc " TRUE, expected FALSE\n") -#define ok_eq_bool(value, expected) ok((value) == (expected), #value " = %s, expected %s\n", \ - (value) ? "TRUE" : "FALSE", \ - (expected) ? "TRUE" : "FALSE") -#define ok_eq_str(value, expected) ok(!strcmp(value, expected), #value " = "%s", expected "%s"\n", value, expected) -#define ok_eq_wstr(value, expected) ok(!wcscmp(value, expected), #value " = "%ls", expected "%ls"\n", value, expected) -#define ok_eq_tag(value, expected) ok_eq_print(value, expected, "0x%08lx") - -#define KMT_MAKE_CODE(ControlCode) CTL_CODE(FILE_DEVICE_UNKNOWN, \ - 0xC00 + (ControlCode), \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define MICROSECOND 10 -#define MILLISECOND (1000 * MICROSECOND) -#define SECOND (1000 * MILLISECOND) - -/* See apitests/include/apitest.h */ -#define KmtInvalidPointer ((PVOID)0x5555555555555555ULL) - -#define KmtStartSeh() \ -{ \ - NTSTATUS ExceptionStatus = STATUS_SUCCESS; \ - _SEH2_TRY \ - { - -#define KmtEndSeh(ExpectedStatus) \ - } \ - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) \ - { \ - ExceptionStatus = _SEH2_GetExceptionCode(); \ - } \ - _SEH2_END; \ - ok_eq_hex(ExceptionStatus, (ExpectedStatus)); \ -} - -#if defined KMT_DEFINE_TEST_FUNCTIONS - -#if defined KMT_KERNEL_MODE -BOOLEAN KmtIsCheckedBuild; -BOOLEAN KmtIsMultiProcessorBuild; -PCSTR KmtMajorFunctionNames[] = -{ - "Create", - "CreateNamedPipe", - "Close", - "Read", - "Write", - "QueryInformation", - "SetInformation", - "QueryEa", - "SetEa", - "FlushBuffers", - "QueryVolumeInformation", - "SetVolumeInformation", - "DirectoryControl", - "FileSystemControl", - "DeviceControl", - "InternalDeviceControl/Scsi", - "Shutdown", - "LockControl", - "Cleanup", - "CreateMailslot", - "QuerySecurity", - "SetSecurity", - "Power", - "SystemControl", - "DeviceChange", - "QueryQuota", - "SetQuota", - "Pnp/PnpPower" -}; - -VOID KmtSetIrql(IN KIRQL NewIrql) -{ - KIRQL Irql = KeGetCurrentIrql(); - if (Irql > NewIrql) - KeLowerIrql(NewIrql); - else if (Irql < NewIrql) - KeRaiseIrql(NewIrql, &Irql); -} - -BOOLEAN KmtAreInterruptsEnabled(VOID) -{ - return (__readeflags() & (1 << 9)) != 0; -} - -typedef struct _POOL_HEADER -{ - union - { - struct - { -#ifdef _M_AMD64 - USHORT PreviousSize:8; - USHORT PoolIndex:8; - USHORT BlockSize:8; - USHORT PoolType:8; -#else - USHORT PreviousSize:9; - USHORT PoolIndex:7; - USHORT BlockSize:9; - USHORT PoolType:7; -#endif - }; - ULONG Ulong1; - }; -#ifdef _M_AMD64 - ULONG PoolTag; -#endif - union - { -#ifdef _M_AMD64 - PEPROCESS ProcessBilled; -#else - ULONG PoolTag; -#endif - struct - { - USHORT AllocatorBackTraceIndex; - USHORT PoolTagHash; - }; - }; -} POOL_HEADER, *PPOOL_HEADER; - -ULONG KmtGetPoolTag(PVOID Memory) -{ - PPOOL_HEADER Header; - - /* it's not so easy for allocations of PAGE_SIZE */ - if (((ULONG_PTR)Memory & (PAGE_SIZE - 1)) == 0) - return 'TooL'; - - Header = Memory; - Header--; - - return Header->PoolTag; -} - -USHORT KmtGetPoolType(PVOID Memory) -{ - PPOOL_HEADER Header; - - /* it's not so easy for allocations of PAGE_SIZE */ - if (((ULONG_PTR)Memory & (PAGE_SIZE - 1)) == 0) - return 0; - - Header = Memory; - Header--; - - return Header->PoolType; -} - -INT __cdecl KmtVSNPrintF(PSTR Buffer, SIZE_T BufferMaxLength, PCSTR Format, va_list Arguments) KMT_FORMAT(ms_printf, 3, 0); -#elif defined KMT_USER_MODE static PKMT_RESULTBUFFER KmtAllocateResultBuffer(SIZE_T ResultBufferSize) { PKMT_RESULTBUFFER Buffer = HeapAlloc(GetProcessHeap(), 0, ResultBufferSize); @@ -379,217 +33,5 @@ }
#define KmtVSNPrintF vsnprintf -#endif /* defined KMT_USER_MODE */
-PKMT_RESULTBUFFER ResultBuffer = NULL; - -static VOID KmtAddToLogBuffer(PKMT_RESULTBUFFER Buffer, PCSTR String, SIZE_T Length) -{ - LONG OldLength; - LONG NewLength; - - if (!Buffer) - return; - - do - { - OldLength = Buffer->LogBufferLength; - NewLength = OldLength + (ULONG)Length; - if (NewLength > Buffer->LogBufferMaxLength) - return; - } while (InterlockedCompareExchange(&Buffer->LogBufferLength, NewLength, OldLength) != OldLength); - - memcpy(&Buffer->LogBuffer[OldLength], String, Length); -} - -KMT_FORMAT(ms_printf, 5, 0) -static SIZE_T KmtXVSNPrintF(PSTR Buffer, SIZE_T BufferMaxLength, PCSTR FileAndLine, PCSTR Prepend, PCSTR Format, va_list Arguments) -{ - SIZE_T BufferLength = 0; - SIZE_T Length; - - if (FileAndLine) - { - PCSTR Slash; - Slash = strrchr(FileAndLine, '\'); - if (Slash) - FileAndLine = Slash + 1; - Slash = strrchr(FileAndLine, '/'); - if (Slash) - FileAndLine = Slash + 1; - - Length = min(BufferMaxLength, strlen(FileAndLine)); - memcpy(Buffer, FileAndLine, Length); - Buffer += Length; - BufferLength += Length; - BufferMaxLength -= Length; - } - if (Prepend) - { - Length = min(BufferMaxLength, strlen(Prepend)); - memcpy(Buffer, Prepend, Length); - Buffer += Length; - BufferLength += Length; - BufferMaxLength -= Length; - } - if (Format) - { - Length = KmtVSNPrintF(Buffer, BufferMaxLength, Format, Arguments); - /* vsnprintf can return more than maxLength, we don't want to do that */ - BufferLength += min(Length, BufferMaxLength); - } - return BufferLength; -} - -KMT_FORMAT(ms_printf, 5, 6) -static SIZE_T KmtXSNPrintF(PSTR Buffer, SIZE_T BufferMaxLength, PCSTR FileAndLine, PCSTR Prepend, PCSTR Format, ...) -{ - SIZE_T BufferLength; - va_list Arguments; - va_start(Arguments, Format); - BufferLength = KmtXVSNPrintF(Buffer, BufferMaxLength, FileAndLine, Prepend, Format, Arguments); - va_end(Arguments); - return BufferLength; -} - -VOID KmtFinishTest(PCSTR TestName) -{ - CHAR MessageBuffer[512]; - SIZE_T MessageLength; - - if (!ResultBuffer) - return; - - MessageLength = KmtXSNPrintF(MessageBuffer, sizeof MessageBuffer, NULL, NULL, - "%s: %ld tests executed (0 marked as todo, %ld failures), %ld skipped.\n", - TestName, - ResultBuffer->Successes + ResultBuffer->Failures, - ResultBuffer->Failures, - ResultBuffer->Skipped); - KmtAddToLogBuffer(ResultBuffer, MessageBuffer, MessageLength); -} - -BOOLEAN KmtVOk(INT Condition, PCSTR FileAndLine, PCSTR Format, va_list Arguments) -{ - CHAR MessageBuffer[512]; - SIZE_T MessageLength; - - if (!ResultBuffer) - return Condition != 0; - - if (Condition) - { - InterlockedIncrement(&ResultBuffer->Successes); - - if (0/*KmtReportSuccess*/) - { - MessageLength = KmtXSNPrintF(MessageBuffer, sizeof MessageBuffer, FileAndLine, ": Test succeeded\n", NULL); - KmtAddToLogBuffer(ResultBuffer, MessageBuffer, MessageLength); - } - } - else - { - InterlockedIncrement(&ResultBuffer->Failures); - MessageLength = KmtXVSNPrintF(MessageBuffer, sizeof MessageBuffer, FileAndLine, ": Test failed: ", Format, Arguments); - KmtAddToLogBuffer(ResultBuffer, MessageBuffer, MessageLength); - } - - return Condition != 0; -} - -BOOLEAN KmtOk(INT Condition, PCSTR FileAndLine, PCSTR Format, ...) -{ - BOOLEAN Ret; - va_list Arguments; - va_start(Arguments, Format); - Ret = KmtVOk(Condition, FileAndLine, Format, Arguments); - va_end(Arguments); - return Ret; -} - -VOID KmtVTrace(PCSTR FileAndLine, PCSTR Format, va_list Arguments) -{ - CHAR MessageBuffer[512]; - SIZE_T MessageLength; - - MessageLength = KmtXVSNPrintF(MessageBuffer, sizeof MessageBuffer, FileAndLine, ": ", Format, Arguments); - KmtAddToLogBuffer(ResultBuffer, MessageBuffer, MessageLength); -} - -VOID KmtTrace(PCSTR FileAndLine, PCSTR Format, ...) -{ - va_list Arguments; - va_start(Arguments, Format); - KmtVTrace(FileAndLine, Format, Arguments); - va_end(Arguments); -} - -BOOLEAN KmtVSkip(INT Condition, PCSTR FileAndLine, PCSTR Format, va_list Arguments) -{ - CHAR MessageBuffer[512]; - SIZE_T MessageLength; - - if (!ResultBuffer) - return !Condition; - - if (!Condition) - { - InterlockedIncrement(&ResultBuffer->Skipped); - MessageLength = KmtXVSNPrintF(MessageBuffer, sizeof MessageBuffer, FileAndLine, ": Tests skipped: ", Format, Arguments); - KmtAddToLogBuffer(ResultBuffer, MessageBuffer, MessageLength); - } - - return !Condition; -} - -BOOLEAN KmtSkip(INT Condition, PCSTR FileAndLine, PCSTR Format, ...) -{ - BOOLEAN Ret; - va_list Arguments; - va_start(Arguments, Format); - Ret = KmtVSkip(Condition, FileAndLine, Format, Arguments); - va_end(Arguments); - return Ret; -} - -PVOID KmtAllocateGuarded(SIZE_T SizeRequested) -{ - NTSTATUS Status; - SIZE_T Size = PAGE_ROUND_UP(SizeRequested + PAGE_SIZE); - PVOID VirtualMemory = NULL; - PCHAR StartOfBuffer; - - Status = ZwAllocateVirtualMemory(ZwCurrentProcess(), &VirtualMemory, 0, &Size, MEM_RESERVE, PAGE_NOACCESS); - - if (!NT_SUCCESS(Status)) - return NULL; - - Size -= PAGE_SIZE; - Status = ZwAllocateVirtualMemory(ZwCurrentProcess(), &VirtualMemory, 0, &Size, MEM_COMMIT, PAGE_READWRITE); - if (!NT_SUCCESS(Status)) - { - Size = 0; - Status = ZwFreeVirtualMemory(ZwCurrentProcess(), &VirtualMemory, &Size, MEM_RELEASE); - ok_eq_hex(Status, STATUS_SUCCESS); - return NULL; - } - - StartOfBuffer = VirtualMemory; - StartOfBuffer += Size - SizeRequested; - - return StartOfBuffer; -} - -VOID KmtFreeGuarded(PVOID Pointer) -{ - NTSTATUS Status; - PVOID VirtualMemory = (PVOID)PAGE_ROUND_DOWN((SIZE_T)Pointer); - SIZE_T Size = 0; - - Status = ZwFreeVirtualMemory(ZwCurrentProcess(), &VirtualMemory, &Size, MEM_RELEASE); - ok_eq_hex(Status, STATUS_SUCCESS); -} - -#endif /* defined KMT_DEFINE_TEST_FUNCTIONS */ - -#endif /* !defined _KMTEST_TEST_H_ */ +#endif /* !defined _KMTEST_TEST_USER_H_ */
Modified: trunk/rostests/kmtests/npfs/NpfsHelpers.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/kmtests/npfs/NpfsHelpers.c... ============================================================================== --- trunk/rostests/kmtests/npfs/NpfsHelpers.c [iso-8859-1] (original) +++ trunk/rostests/kmtests/npfs/NpfsHelpers.c [iso-8859-1] Tue Nov 4 20:55:16 2014 @@ -713,62 +713,3 @@ KeSetEvent(&Context->StartWorkEvent, IO_NO_INCREMENT, TRUE); return WaitForWork(Context, MilliSeconds); } - -PKTHREAD -KmtStartThread( - IN PKSTART_ROUTINE StartRoutine, - IN PVOID StartContext OPTIONAL) -{ - NTSTATUS Status; - OBJECT_ATTRIBUTES ObjectAttributes; - HANDLE ThreadHandle; - PVOID ThreadObject = NULL; - - InitializeObjectAttributes(&ObjectAttributes, - NULL, - OBJ_KERNEL_HANDLE, - NULL, - NULL); - ThreadHandle = INVALID_HANDLE_VALUE; - Status = PsCreateSystemThread(&ThreadHandle, - SYNCHRONIZE, - &ObjectAttributes, - NULL, - NULL, - StartRoutine, - StartContext); - ok_eq_hex(Status, STATUS_SUCCESS); - if (!skip(NT_SUCCESS(Status) && ThreadHandle != NULL && ThreadHandle != INVALID_HANDLE_VALUE, "No thread\n")) - { - Status = ObReferenceObjectByHandle(ThreadHandle, - SYNCHRONIZE, - *PsThreadType, - KernelMode, - &ThreadObject, - NULL); - ok_eq_hex(Status, STATUS_SUCCESS); - ObCloseHandle(ThreadHandle, KernelMode); - } - return ThreadObject; -} - -VOID -KmtFinishThread( - IN PKTHREAD Thread OPTIONAL, - IN PKEVENT Event OPTIONAL) -{ - NTSTATUS Status; - - if (skip(Thread != NULL, "No thread\n")) - return; - - if (Event) - KeSetEvent(Event, IO_NO_INCREMENT, TRUE); - Status = KeWaitForSingleObject(Thread, - Executive, - KernelMode, - FALSE, - NULL); - ok_eq_hex(Status, STATUS_SUCCESS); - ObDereferenceObject(Thread); -}
Modified: trunk/rostests/kmtests/npfs/npfs.h URL: http://svn.reactos.org/svn/reactos/trunk/rostests/kmtests/npfs/npfs.h?rev=65... ============================================================================== --- trunk/rostests/kmtests/npfs/npfs.h [iso-8859-1] (original) +++ trunk/rostests/kmtests/npfs/npfs.h [iso-8859-1] Tue Nov 4 20:55:16 2014 @@ -211,15 +211,4 @@ IN PTHREAD_CONTEXT Context, IN ULONG MilliSeconds);
- -PKTHREAD -KmtStartThread( - IN PKSTART_ROUTINE StartRoutine, - IN PVOID StartContext OPTIONAL); - -VOID -KmtFinishThread( - IN PKTHREAD Thread OPTIONAL, - IN PKEVENT Event OPTIONAL); - #endif /* !defined _KMTEST_NPFS_H_ */