Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=54378
-- v2: ntoskrnl: Add ExGetPreviousMode and test.
From: Alex Henrie alexhenrie24@gmail.com
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);
I just pushed a new patch that returns PsIsSystemThread(KeGetCurrentThread()) and adds a test. I don't know how to test this further, and I'm not sure that more work is necessary right now, since it's not clear that the application in question would need anything more complex. That said, I'm open to suggestions.