Jacek Caban : ntoskrnl.exe: Implement IoGetStackLimits.

Alexandre Julliard julliard at winehq.org
Mon Jun 24 16:06:25 CDT 2019


Module: wine
Branch: master
Commit: 8b787945ef0073b4fd886b347d9e22e7e40ff3fe
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=8b787945ef0073b4fd886b347d9e22e7e40ff3fe

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Jun 24 16:25:00 2019 +0200

ntoskrnl.exe: Implement IoGetStackLimits.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47017
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntoskrnl.exe/ntoskrnl.c        | 12 ++++++++++++
 dlls/ntoskrnl.exe/ntoskrnl.exe.spec |  2 +-
 dlls/ntoskrnl.exe/tests/driver.c    | 11 +++++++++++
 include/ddk/wdm.h                   |  1 +
 4 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index 639e4eb..99b8599 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -1689,6 +1689,18 @@ PCONFIGURATION_INFORMATION WINAPI IoGetConfigurationInformation(void)
     return &configuration_information;
 }
 
+/***********************************************************************
+ *           IoGetStackLimits    (NTOSKRNL.EXE.@)
+ */
+void WINAPI IoGetStackLimits(ULONG_PTR *low, ULONG_PTR *high)
+{
+    TEB *teb = NtCurrentTeb();
+
+    TRACE( "%p %p\n", low, high );
+
+    *low  = (DWORD_PTR)teb->Tib.StackLimit;
+    *high = (DWORD_PTR)teb->Tib.StackBase;
+}
 
 /***********************************************************************
  *           IoIsWdmVersionAvailable     (NTOSKRNL.EXE.@)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
index 5edd8df..afe216b 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
+++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
@@ -408,7 +408,7 @@
 @ stub IoGetRequestorProcess
 @ stub IoGetRequestorProcessId
 @ stub IoGetRequestorSessionId
-@ stub IoGetStackLimits
+@ stdcall IoGetStackLimits(ptr ptr)
 @ stub IoGetTopLevelIrp
 @ stdcall IoInitializeIrp(ptr long long)
 @ stdcall IoInitializeRemoveLockEx(ptr long long long long)
diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c
index dbe189d..48bee1d 100644
--- a/dlls/ntoskrnl.exe/tests/driver.c
+++ b/dlls/ntoskrnl.exe/tests/driver.c
@@ -1436,6 +1436,16 @@ static void test_lookup_thread(void)
        "PsLookupThreadByThreadId returned %#x\n", status);
 }
 
+static void test_stack_limits(void)
+{
+    ULONG_PTR low = 0, high = 0;
+
+    IoGetStackLimits(&low, &high);
+    ok(low, "low = 0\n");
+    ok(low < high, "low >= high\n");
+    ok(low < (ULONG_PTR)&low && (ULONG_PTR)&low < high, "stack variable is not in stack limits\n");
+}
+
 static void test_IoAttachDeviceToDeviceStack(void)
 {
     DEVICE_OBJECT *dev1, *dev2, *dev3, *ret;
@@ -1503,6 +1513,7 @@ static void WINAPI main_test_task(DEVICE_OBJECT *device, void *context)
     test_critical_region(FALSE);
     test_call_driver(device);
     test_cancel_irp(device);
+    test_stack_limits();
 
     /* print process report */
     if (winetest_debug)
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
index cad0a20..64afea5 100644
--- a/include/ddk/wdm.h
+++ b/include/ddk/wdm.h
@@ -1586,6 +1586,7 @@ NTSTATUS  WINAPI IoGetDeviceObjectPointer(UNICODE_STRING*,ACCESS_MASK,PFILE_OBJE
 NTSTATUS  WINAPI IoGetDeviceProperty(PDEVICE_OBJECT,DEVICE_REGISTRY_PROPERTY,ULONG,PVOID,PULONG);
 PVOID     WINAPI IoGetDriverObjectExtension(PDRIVER_OBJECT,PVOID);
 PDEVICE_OBJECT WINAPI IoGetRelatedDeviceObject(PFILE_OBJECT);
+void      WINAPI IoGetStackLimits(ULONG_PTR*,ULONG_PTR*);
 void      WINAPI IoInitializeIrp(IRP*,USHORT,CCHAR);
 VOID      WINAPI IoInitializeRemoveLockEx(PIO_REMOVE_LOCK,ULONG,ULONG,ULONG,ULONG);
 void      WINAPI IoInvalidateDeviceRelations(PDEVICE_OBJECT,DEVICE_RELATION_TYPE);




More information about the wine-cvs mailing list