Module: wine Branch: master Commit: 51a732163fc3db25cba059a24bbccc2d34d5be51 URL: https://source.winehq.org/git/wine.git/?a=commit;h=51a732163fc3db25cba059a24...
Author: Derek Lesho dereklesho52@gmail.com Date: Thu May 30 13:11:42 2019 +0200
ntoskrnl.exe: Implement KeAreApcsDisabled.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntoskrnl.exe/ntoskrnl.c | 16 ++++++++++++++-- dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +- dlls/ntoskrnl.exe/ntoskrnl_private.h | 1 + dlls/ntoskrnl.exe/tests/driver.c | 23 +++++++++++++++++++++++ include/ddk/ntddk.h | 1 + 5 files changed, 40 insertions(+), 3 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c index b5d89f6..14b5a1a 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/ntoskrnl.c @@ -3569,7 +3569,8 @@ NTSTATUS WINAPI IoCsqInitialize(PIO_CSQ csq, PIO_CSQ_INSERT_IRP insert_irp, PIO_ */ void WINAPI KeEnterCriticalRegion(void) { - FIXME(": stub\n"); + TRACE( "semi-stub\n" ); + KeGetCurrentThread()->critical_region++; }
/*********************************************************************** @@ -3577,7 +3578,18 @@ void WINAPI KeEnterCriticalRegion(void) */ void WINAPI KeLeaveCriticalRegion(void) { - FIXME(": stub\n"); + TRACE( "semi-stub\n" ); + KeGetCurrentThread()->critical_region--; +} + +/*********************************************************************** + * KeAreApcsDisabled (NTOSKRNL.@) + */ +BOOLEAN WINAPI KeAreApcsDisabled(void) +{ + unsigned int critical_region = KeGetCurrentThread()->critical_region; + TRACE( "%u\n", critical_region ); + return !!critical_region; }
/*********************************************************************** diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec index 72ebdc1..7c93705 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec +++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec @@ -523,7 +523,7 @@ @ stdcall KeAcquireSpinLockAtDpcLevel(ptr) @ stdcall -arch=arm,arm64,x86_64 KeAcquireSpinLockRaiseToDpc(ptr) @ stub KeAddSystemServiceTable -@ stub KeAreApcsDisabled +@ stdcall KeAreApcsDisabled() @ stub KeAttachProcess @ stub KeBugCheck @ stub KeBugCheckEx diff --git a/dlls/ntoskrnl.exe/ntoskrnl_private.h b/dlls/ntoskrnl.exe/ntoskrnl_private.h index c003788..03b4432 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl_private.h +++ b/dlls/ntoskrnl.exe/ntoskrnl_private.h @@ -41,6 +41,7 @@ struct _KTHREAD DISPATCHER_HEADER header; PEPROCESS process; CLIENT_ID id; + unsigned int critical_region; };
struct _ETHREAD diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c index 73fc2fb..69a7d78 100644 --- a/dlls/ntoskrnl.exe/tests/driver.c +++ b/dlls/ntoskrnl.exe/tests/driver.c @@ -370,6 +370,27 @@ static void test_current_thread(BOOL is_system) ok(!ret, "ZwClose failed: %#x\n", ret); }
+static void test_critical_region(BOOL is_dispatcher) +{ + BOOLEAN result; + + KeEnterCriticalRegion(); + KeEnterCriticalRegion(); + + result = KeAreApcsDisabled(); + ok(result == TRUE, "KeAreApcsDisabled returned %x\n", result); + KeLeaveCriticalRegion(); + + result = KeAreApcsDisabled(); + ok(result == TRUE, "KeAreApcsDisabled returned %x\n", result); + KeLeaveCriticalRegion(); + + result = KeAreApcsDisabled(); + todo_wine_if(is_dispatcher) + ok(result == is_dispatcher || broken(is_dispatcher && !result), + "KeAreApcsDisabled returned %x\n", result); +} + static void sleep(void) { LARGE_INTEGER timeout; @@ -1490,6 +1511,7 @@ static void WINAPI main_test_task(DEVICE_OBJECT *device, void *context) main_test_work_item = NULL;
test_current_thread(TRUE); + test_critical_region(FALSE); test_call_driver(device); test_cancel_irp(device);
@@ -1546,6 +1568,7 @@ static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *st
test_irp_struct(irp, device); test_current_thread(FALSE); + test_critical_region(TRUE); test_mdl_map(); test_init_funcs(); test_load_driver(); diff --git a/include/ddk/ntddk.h b/include/ddk/ntddk.h index d6ecbae..4afef81 100644 --- a/include/ddk/ntddk.h +++ b/include/ddk/ntddk.h @@ -216,6 +216,7 @@ NTSTATUS WINAPI IoQueryDeviceDescription(PINTERFACE_TYPE,PULONG,PCONFIGURATION_ PCONFIGURATION_TYPE,PULONG,PIO_QUERY_DEVICE_ROUTINE,PVOID); void WINAPI IoRegisterDriverReinitialization(PDRIVER_OBJECT,PDRIVER_REINITIALIZE,PVOID); NTSTATUS WINAPI IoRegisterShutdownNotification(PDEVICE_OBJECT); +BOOLEAN WINAPI KeAreApcsDisabled(void); NTSTATUS WINAPI KeExpandKernelStackAndCallout(PEXPAND_STACK_CALLOUT,void*,SIZE_T); void WINAPI KeSetTargetProcessorDpc(PRKDPC,CCHAR); BOOLEAN WINAPI MmIsAddressValid(void *);