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