[KMTESTS]

- probe user address in user mode
- don't free the result buffer before the driver unlocks it. Fixes assertion in ROS for large buffers

svn path=/branches/GSoC_2011/KMTestSuite/; revision=52947
This commit is contained in:
Thomas Faber 2011-07-28 09:00:56 +00:00
parent c0ecebef26
commit f63c9159c8
3 changed files with 22 additions and 14 deletions

View file

@ -173,15 +173,17 @@ BOOLEAN KmtAreInterruptsEnabled(VOID)
INT __cdecl KmtVSNPrintF(PSTR Buffer, SIZE_T BufferMaxLength, PCSTR Format, va_list Arguments) KMT_FORMAT(ms_printf, 3, 0); INT __cdecl KmtVSNPrintF(PSTR Buffer, SIZE_T BufferMaxLength, PCSTR Format, va_list Arguments) KMT_FORMAT(ms_printf, 3, 0);
#elif defined KMT_USER_MODE #elif defined KMT_USER_MODE
static PKMT_RESULTBUFFER KmtAllocateResultBuffer(SIZE_T LogBufferMaxLength) static PKMT_RESULTBUFFER KmtAllocateResultBuffer(SIZE_T ResultBufferSize)
{ {
PKMT_RESULTBUFFER Buffer = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(KMT_RESULTBUFFER, LogBuffer[LogBufferMaxLength])); PKMT_RESULTBUFFER Buffer = HeapAlloc(GetProcessHeap(), 0, ResultBufferSize);
if (!Buffer)
return NULL;
Buffer->Successes = 0; Buffer->Successes = 0;
Buffer->Failures = 0; Buffer->Failures = 0;
Buffer->Skipped = 0; Buffer->Skipped = 0;
Buffer->LogBufferLength = 0; Buffer->LogBufferLength = 0;
Buffer->LogBufferMaxLength = LogBufferMaxLength; Buffer->LogBufferMaxLength = ResultBufferSize - FIELD_OFFSET(KMT_RESULTBUFFER, LogBuffer);
return Buffer; return Buffer;
} }

View file

@ -24,8 +24,7 @@
#define SERVICE_PATH L"kmtest_drv.sys" #define SERVICE_PATH L"kmtest_drv.sys"
#define SERVICE_DESCRIPTION L"ReactOS Kernel-Mode Test Suite Driver" #define SERVICE_DESCRIPTION L"ReactOS Kernel-Mode Test Suite Driver"
#define LOGBUFFER_SIZE 16364 #define RESULTBUFFER_SIZE (1024 * 1024)
#define RESULTBUFFER_SIZE FIELD_OFFSET(KMT_RESULTBUFFER, LogBuffer[LOGBUFFER_SIZE])
typedef enum typedef enum
{ {
@ -255,9 +254,14 @@ RunTest(
assert(TestName != NULL); assert(TestName != NULL);
ResultBuffer = KmtAllocateResultBuffer(LOGBUFFER_SIZE); if (!ResultBuffer)
if (!DeviceIoControl(KmtestHandle, IOCTL_KMTEST_SET_RESULTBUFFER, ResultBuffer, RESULTBUFFER_SIZE, NULL, 0, &BytesRead, NULL)) {
error_goto(Error, cleanup); ResultBuffer = KmtAllocateResultBuffer(RESULTBUFFER_SIZE);
if (!ResultBuffer)
error_goto(Error, cleanup);
if (!DeviceIoControl(KmtestHandle, IOCTL_KMTEST_SET_RESULTBUFFER, ResultBuffer, RESULTBUFFER_SIZE, NULL, 0, &BytesRead, NULL))
error_goto(Error, cleanup);
}
// check test list // check test list
TestFunction = FindTest(TestName); TestFunction = FindTest(TestName);
@ -275,8 +279,6 @@ cleanup:
if (!Error) if (!Error)
Error = OutputResult(TestName); Error = OutputResult(TestName);
KmtFreeResultBuffer(ResultBuffer);
return Error; return Error;
} }
@ -367,6 +369,9 @@ cleanup:
if (KmtestHandle) if (KmtestHandle)
CloseHandle(KmtestHandle); CloseHandle(KmtestHandle);
if (ResultBuffer)
KmtFreeResultBuffer(ResultBuffer);
KmtCloseService(&KmtestServiceHandle); KmtCloseService(&KmtestServiceHandle);
if (Error) if (Error)

View file

@ -314,9 +314,10 @@ DriverIoControl(
{ {
PKMT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension; PKMT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
DPRINT("DriverIoControl. IOCTL_KMTEST_SET_RESULTBUFFER, inlen=%lu, outlen=%lu\n", DPRINT("DriverIoControl. IOCTL_KMTEST_SET_RESULTBUFFER, buffer=%p, inlen=%lu, outlen=%lu\n",
IoStackLocation->Parameters.DeviceIoControl.InputBufferLength, IoStackLocation->Parameters.DeviceIoControl.Type3InputBuffer,
IoStackLocation->Parameters.DeviceIoControl.OutputBufferLength); IoStackLocation->Parameters.DeviceIoControl.InputBufferLength,
IoStackLocation->Parameters.DeviceIoControl.OutputBufferLength);
if (DeviceExtension->Mdl) if (DeviceExtension->Mdl)
{ {
@ -342,7 +343,7 @@ DriverIoControl(
_SEH2_TRY _SEH2_TRY
{ {
MmProbeAndLockPages(DeviceExtension->Mdl, KernelMode, IoModifyAccess); MmProbeAndLockPages(DeviceExtension->Mdl, UserMode, IoModifyAccess);
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {