Derek Lesho : ntoskrnl.exe: Implement KeAreApcsDisabled.

Alexandre Julliard julliard at winehq.org
Thu May 30 16:27:13 CDT 2019


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

Author: Derek Lesho <dereklesho52 at gmail.com>
Date:   Thu May 30 13:11:42 2019 +0200

ntoskrnl.exe: Implement KeAreApcsDisabled.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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 *);




More information about the wine-cvs mailing list