Author: pschweitzer Date: Thu Jun 8 06:44:48 2017 New Revision: 74955
URL: http://svn.reactos.org/svn/reactos?rev=74955&view=rev Log: [KMTESTS:MM] Make MmMapLockedPagesSpecifyCache a bit more robust. Based on Thomas' suggestions
Modified: trunk/rostests/kmtests/ntos_mm/MmMapLockedPagesSpecifyCache_drv.c
Modified: trunk/rostests/kmtests/ntos_mm/MmMapLockedPagesSpecifyCache_drv.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/kmtests/ntos_mm/MmMapLocke... ============================================================================== --- trunk/rostests/kmtests/ntos_mm/MmMapLockedPagesSpecifyCache_drv.c [iso-8859-1] (original) +++ trunk/rostests/kmtests/ntos_mm/MmMapLockedPagesSpecifyCache_drv.c [iso-8859-1] Thu Jun 8 06:44:48 2017 @@ -110,6 +110,9 @@ ok_eq_size(InLength, sizeof(QUERY_BUFFER)); ok_eq_size(*OutLength, sizeof(QUERY_BUFFER)); ok_eq_pointer(CurrentMdl, NULL); + + TestCleanEverything(); + ok(ExGetPreviousMode() == UserMode, "Not comming from umode!\n"); if (!skip(Buffer && InLength >= sizeof(QUERY_BUFFER) && *OutLength >= sizeof(QUERY_BUFFER), "Cannot read/write from/to buffer!\n")) { @@ -120,59 +123,66 @@ QueryBuffer = Buffer; CacheType = (QueryBuffer->Cached ? MmCached : MmNonCached); Length = QueryBuffer->Length; + CurrentUser = NULL; ok(Length > 0, "Null size!\n");
- CurrentBuffer = ExAllocatePoolWithTag(NonPagedPool, Length, 'MLPC'); - ok(CurrentBuffer != NULL, "ExAllocatePool failed!\n"); - CurrentUser = NULL; - if (!skip(CurrentBuffer != NULL, "ExAllocatePool failed!\n")) + if (!skip(Length > 0, "Null size!\n")) { - CurrentMdl = IoAllocateMdl(CurrentBuffer, Length, FALSE, FALSE, NULL); - ok(CurrentMdl != NULL, "IoAllocateMdl failed!\n"); - if (CurrentMdl) + CurrentBuffer = ExAllocatePoolWithTag(NonPagedPool, Length, 'MLPC'); + ok(CurrentBuffer != NULL, "ExAllocatePool failed!\n"); + if (!skip(CurrentBuffer != NULL, "ExAllocatePool failed!\n")) { - KIRQL Irql; - - SehStatus = STATUS_SUCCESS; - _SEH2_TRY + CurrentMdl = IoAllocateMdl(CurrentBuffer, Length, FALSE, FALSE, NULL); + ok(CurrentMdl != NULL, "IoAllocateMdl failed!\n"); + if (!skip(CurrentMdl != NULL, "IoAllocateMdl failed!\n")) { - MmProbeAndLockPages(CurrentMdl, KernelMode, IoWriteAccess); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - SehStatus = _SEH2_GetExceptionCode(); - } - _SEH2_END; - ok_eq_hex(SehStatus, STATUS_SUCCESS); - - Irql = KeGetCurrentIrql(); - ok(Irql <= APC_LEVEL, "IRQL > APC_LEVEL: %d\n", Irql); - - SehStatus = STATUS_SUCCESS; - _SEH2_TRY - { - CurrentUser = MmMapLockedPagesSpecifyCache(CurrentMdl, UserMode, CacheType, NULL, FALSE, NormalPagePriority); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - SehStatus = _SEH2_GetExceptionCode(); - } - _SEH2_END; - - if (QueryBuffer->Cached) - { + KIRQL Irql; + + SehStatus = STATUS_SUCCESS; + _SEH2_TRY + { + MmProbeAndLockPages(CurrentMdl, KernelMode, IoWriteAccess); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SehStatus = _SEH2_GetExceptionCode(); + } + _SEH2_END; ok_eq_hex(SehStatus, STATUS_SUCCESS); - ok(CurrentUser != NULL, "MmMapLockedPagesSpecifyCache failed!\n"); + + Irql = KeGetCurrentIrql(); + ok(Irql <= APC_LEVEL, "IRQL > APC_LEVEL: %d\n", Irql); + + SehStatus = STATUS_SUCCESS; + _SEH2_TRY + { + CurrentUser = MmMapLockedPagesSpecifyCache(CurrentMdl, UserMode, CacheType, NULL, FALSE, NormalPagePriority); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SehStatus = _SEH2_GetExceptionCode(); + } + _SEH2_END; + + if (QueryBuffer->Cached) + { + ok_eq_hex(SehStatus, STATUS_SUCCESS); + ok(CurrentUser != NULL, "MmMapLockedPagesSpecifyCache failed!\n"); + } + else + { + ok_eq_hex(SehStatus, STATUS_INVALID_ADDRESS); + ok_eq_pointer(CurrentUser, NULL); + } } else { - ok_eq_hex(SehStatus, STATUS_INVALID_ADDRESS); - ok_eq_pointer(CurrentUser, NULL); + ExFreePoolWithTag(CurrentBuffer, 'MLPC'); } } } + QueryBuffer->Buffer = CurrentUser; - *OutLength = sizeof(QUERY_BUFFER); }