Module: wine Branch: master Commit: 8b787945ef0073b4fd886b347d9e22e7e40ff3fe URL: https://source.winehq.org/git/wine.git/?a=commit;h=8b787945ef0073b4fd886b347...
Author: Jacek Caban jacek@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@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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);