mirror of
https://github.com/reactos/reactos.git
synced 2025-07-25 04:23:48 +00:00
[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:
parent
c0ecebef26
commit
f63c9159c8
3 changed files with 22 additions and 14 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue