Module: wine Branch: master Commit: b9627b996f0a9680c95c6d705449a5925334d9f5 URL: https://gitlab.winehq.org/wine/wine/-/commit/b9627b996f0a9680c95c6d705449a59...
Author: Alex Henrie alexhenrie24@gmail.com Date: Fri Jan 27 21:17:42 2023 -0700
ntoskrnl: Add ExGetPreviousMode and test.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=54378
---
dlls/ntoskrnl.exe/ntoskrnl.c | 6 ++++++ dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +- dlls/ntoskrnl.exe/tests/driver.c | 1 + include/ddk/wdm.h | 1 + 4 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c index cc30750a160..2d506402036 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/ntoskrnl.c @@ -4566,6 +4566,12 @@ NTSTATUS WINAPI KdEnableDebugger(void) return STATUS_DEBUGGER_INACTIVE; }
+KPROCESSOR_MODE WINAPI ExGetPreviousMode(void) +{ + TRACE("\n"); + return PsIsSystemThread((PETHREAD)KeGetCurrentThread()) ? KernelMode : UserMode; +} + #ifdef __x86_64__
void WINAPI KfRaiseIrql(KIRQL new, KIRQL *old) diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec index 2447d01458d..0b694b08de0 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec +++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec @@ -154,7 +154,7 @@ @ stub ExGetCurrentProcessorCounts @ stub ExGetCurrentProcessorCpuUsage @ stdcall ExGetExclusiveWaiterCount(ptr) -@ stub ExGetPreviousMode +@ stdcall ExGetPreviousMode() @ stdcall ExGetSharedWaiterCount(ptr) @ stdcall ExInitializeNPagedLookasideList(ptr ptr ptr long long long long) @ stdcall ExInitializePagedLookasideList(ptr ptr ptr long long long long) diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c index d293889c823..d55ad846ef7 100644 --- a/dlls/ntoskrnl.exe/tests/driver.c +++ b/dlls/ntoskrnl.exe/tests/driver.c @@ -454,6 +454,7 @@ static void test_current_thread(BOOL is_system)
ok(PsGetThreadId((PETHREAD)KeGetCurrentThread()) == PsGetCurrentThreadId(), "thread IDs don't match\n"); ok(PsIsSystemThread((PETHREAD)KeGetCurrentThread()) == is_system, "unexpected system thread\n"); + ok(ExGetPreviousMode() == is_system ? KernelMode : UserMode, "previous mode is not correct\n"); if (!is_system) { ok(create_caller_thread == KeGetCurrentThread(), "thread is not create caller thread\n"); diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h index 321b07b84fa..bf240f4fe53 100644 --- a/include/ddk/wdm.h +++ b/include/ddk/wdm.h @@ -1683,6 +1683,7 @@ void WINAPI ExDeleteNPagedLookasideList(PNPAGED_LOOKASIDE_LIST); void WINAPI ExDeletePagedLookasideList(PPAGED_LOOKASIDE_LIST); NTSTATUS WINAPI ExDeleteResourceLite(ERESOURCE*); ULONG WINAPI ExGetExclusiveWaiterCount(ERESOURCE*); +KPROCESSOR_MODE WINAPI ExGetPreviousMode(void); ULONG WINAPI ExGetSharedWaiterCount(ERESOURCE*); void WINAPI ExInitializeNPagedLookasideList(PNPAGED_LOOKASIDE_LIST,PALLOCATE_FUNCTION,PFREE_FUNCTION,ULONG,SIZE_T,ULONG,USHORT); void WINAPI ExInitializePagedLookasideList(PPAGED_LOOKASIDE_LIST,PALLOCATE_FUNCTION,PFREE_FUNCTION,ULONG,SIZE_T,ULONG,USHORT);