From ff907c53604f33adafaff9c4629f8832ada64948 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 21 Jul 2008 23:56:26 +0000 Subject: [PATCH] implement HackSecureVirtualMemory as a possible workaround for missing MmSecureVirtualMemory svn path=/trunk/; revision=34651 --- reactos/subsystems/win32/win32k/eng/mem.c | 63 +++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/reactos/subsystems/win32/win32k/eng/mem.c b/reactos/subsystems/win32/win32k/eng/mem.c index 7331e1d5805..e8ad590b5ee 100644 --- a/reactos/subsystems/win32/win32k/eng/mem.c +++ b/reactos/subsystems/win32/win32k/eng/mem.c @@ -105,6 +105,69 @@ EngFreeUserMem(PVOID pv) ZwFreeVirtualMemory(NtCurrentProcess(), (PVOID *) &Header, &MemSize, MEM_RELEASE); } + + +PVOID +NTAPI +HackSecureVirtualMemory( + IN PVOID Address, + IN SIZE_T Size, + IN ULONG ProbeMode, + OUT PVOID *SafeAddress) +{ + NTSTATUS Status = STATUS_SUCCESS; + PMDL mdl; + LOCK_OPERATION Operation; + + if (ProbeMode == PAGE_READONLY) Operation = IoReadAccess; + else if (ProbeMode == PAGE_READWRITE) Operation = IoModifyAccess; + else return NULL; + + mdl = IoAllocateMdl(Address, Size, FALSE, TRUE, NULL); + if (mdl == NULL) + { + return NULL; + } + + _SEH_TRY + { + MmProbeAndLockPages(mdl, UserMode, Operation); + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END + + if (!NT_SUCCESS(Status)) + { + IoFreeMdl(mdl); + return NULL; + } + + *SafeAddress = MmGetSystemAddressForMdlSafe(mdl, NormalPagePriority); + + if(!*SafeAddress) + { + MmUnlockPages(mdl); + IoFreeMdl(mdl); + return NULL; + } + + return mdl; +} + +VOID +NTAPI +HackUnsecureVirtualMemory( + IN PVOID SecureHandle) +{ + PMDL mdl = (PMDL)SecureHandle; + + MmUnlockPages(mdl); + IoFreeMdl(mdl); +} + /* * @implemented */