[PATCH 2/5] ntoskrnl.exe: Allocate pool memory from an executable heap.

Zebediah Figura z.figura12 at gmail.com
Wed Aug 21 23:16:51 CDT 2019


Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45843
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/ntoskrnl.exe/ntoskrnl.c     |  8 ++++++--
 dlls/ntoskrnl.exe/tests/driver.c | 23 +++++++++++++++++++++++
 2 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index b04e49eea7..745db57f99 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -78,6 +78,8 @@ static DWORD request_thread;
 /* tid of the client thread */
 static DWORD client_tid;
 
+static HANDLE ntoskrnl_heap;
+
 struct wine_driver
 {
     DRIVER_OBJECT driver_obj;
@@ -2126,7 +2128,7 @@ PVOID WINAPI ExAllocatePoolWithQuota( POOL_TYPE type, SIZE_T size )
 PVOID WINAPI ExAllocatePoolWithTag( POOL_TYPE type, SIZE_T size, ULONG tag )
 {
     /* FIXME: handle page alignment constraints */
-    void *ret = HeapAlloc( GetProcessHeap(), 0, size );
+    void *ret = HeapAlloc( ntoskrnl_heap, 0, size );
     TRACE( "%lu pool %u -> %p\n", size, type, ret );
     return ret;
 }
@@ -2168,7 +2170,7 @@ void WINAPI ExFreePool( void *ptr )
 void WINAPI ExFreePoolWithTag( void *ptr, ULONG tag )
 {
     TRACE( "%p\n", ptr );
-    HeapFree( GetProcessHeap(), 0, ptr );
+    HeapFree( ntoskrnl_heap, 0, ptr );
 }
 
 static void initialize_lookaside_list( GENERAL_LOOKASIDE *lookaside, PALLOCATE_FUNCTION allocate, PFREE_FUNCTION free,
@@ -3195,9 +3197,11 @@ BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved )
 #endif
         KeQueryTickCount( &count );  /* initialize the global KeTickCount */
         NtBuildNumber = NtCurrentTeb()->Peb->OSBuildNumber;
+        ntoskrnl_heap = HeapCreate( HEAP_CREATE_ENABLE_EXECUTE, 0, 0 );
         break;
     case DLL_PROCESS_DETACH:
         if (reserved) break;
+        HeapDestroy( ntoskrnl_heap );
         RtlRemoveVectoredExceptionHandler( handler );
         break;
     }
diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c
index 2b3a32b17c..dc583f98c0 100644
--- a/dlls/ntoskrnl.exe/tests/driver.c
+++ b/dlls/ntoskrnl.exe/tests/driver.c
@@ -1685,6 +1685,26 @@ static void WINAPI main_test_task(DEVICE_OBJECT *device, void *context)
     IoCompleteRequest(irp, IO_NO_INCREMENT);
 }
 
+#if defined(__i386__) || defined(__x86_64__)
+static void test_executable_pool(void)
+{
+    static const unsigned char bytes[] =
+            { 0xb8, 0xef, 0xbe, 0xad, 0xde, 0xc3 }; /* mov $0xdeadbeef,%eax ; ret */
+    static const ULONG tag = 0x74736574; /* test */
+    int (*func)(void);
+    int ret;
+
+    func = ExAllocatePoolWithTag(NonPagedPool, sizeof(bytes), tag);
+    ok(!!func, "Got NULL memory.\n");
+
+    memcpy(func, bytes, sizeof(bytes));
+    ret = func();
+    ok(ret == 0xdeadbeef, "Got %#x.\n", ret);
+
+    ExFreePoolWithTag(func, tag);
+}
+#endif
+
 static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *stack)
 {
     ULONG length = stack->Parameters.DeviceIoControl.OutputBufferLength;
@@ -1735,6 +1755,9 @@ static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *st
     test_lookup_thread();
     test_IoAttachDeviceToDeviceStack();
     test_object_name();
+#if defined(__i386__) || defined(__x86_64__)
+    test_executable_pool();
+#endif
 
     if (main_test_work_item) return STATUS_UNEXPECTED_IO_ERROR;
 
-- 
2.22.0




More information about the wine-devel mailing list