Derek Lesho : ntoskrnl.exe: Implement KeInitializeApc.
Alexandre Julliard
julliard at winehq.org
Tue Aug 4 15:26:36 CDT 2020
Module: wine
Branch: master
Commit: 2a578eaeb61047a8e4f4a4ffc47e275de475b6ec
URL: https://source.winehq.org/git/wine.git/?a=commit;h=2a578eaeb61047a8e4f4a4ffc47e275de475b6ec
Author: Derek Lesho <dlesho at codeweavers.com>
Date: Thu Jul 16 10:17:10 2020 -0500
ntoskrnl.exe: Implement KeInitializeApc.
Signed-off-by: Derek Lesho <dlesho at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +-
dlls/ntoskrnl.exe/sync.c | 33 +++++++++++++++++++++++++++++++++
include/ddk/wdm.h | 7 +++++++
3 files changed, 41 insertions(+), 1 deletion(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
index 584a8283ea..2376226dc6 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
+++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
@@ -564,7 +564,7 @@
@ stub KeI386ReleaseLid
@ stub KeI386SetGdtSelector
@ stub KeIcacheFlushCount
-@ stub KeInitializeApc
+@ stdcall KeInitializeApc(ptr ptr long ptr ptr ptr long ptr)
@ stub KeInitializeDeviceQueue
@ stdcall KeInitializeDpc(ptr ptr ptr)
@ stdcall KeInitializeEvent(ptr long long)
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
index 7f19ce7571..c67c4f0157 100644
--- a/dlls/ntoskrnl.exe/sync.c
+++ b/dlls/ntoskrnl.exe/sync.c
@@ -33,6 +33,7 @@
#include "wine/asm.h"
#include "wine/debug.h"
#include "wine/heap.h"
+#include "wine/server.h"
#include "ntoskrnl_private.h"
@@ -663,6 +664,38 @@ void WINAPI KeReleaseInStackQueuedSpinLock( KLOCK_QUEUE_HANDLE *queue )
}
#endif
+/***********************************************************************
+ * KeInitializeApc (NTOSKRNL.EXE.@)
+ */
+void WINAPI KeInitializeApc(PRKAPC apc, PRKTHREAD thread, KAPC_ENVIRONMENT env, PKKERNEL_ROUTINE krnl_routine,
+ PKRUNDOWN_ROUTINE rundown_routine, PKNORMAL_ROUTINE normal_routine, KPROCESSOR_MODE apc_mode, PVOID ctx)
+{
+ TRACE("apc %p thread %p env %u krnl_routine %p rundown_routine %p normal_routine %p apc_mode %u ctx %p\n",
+ apc, thread, env, krnl_routine, rundown_routine, normal_routine, apc_mode, ctx);
+
+ if (env != OriginalApcEnvironment)
+ FIXME("Unhandled APC_ENVIRONMENT\n");
+
+ apc->Type = 18;
+ apc->Size = sizeof(*apc);
+ apc->Thread = thread;
+ apc->ApcStateIndex = env;
+ apc->KernelRoutine = krnl_routine;
+ apc->RundownRoutine = rundown_routine;
+ apc->NormalRoutine = normal_routine;
+ apc->Inserted = FALSE;
+ if (apc->NormalRoutine)
+ {
+ apc->ApcMode = apc_mode;
+ apc->NormalContext = ctx;
+ }
+ else
+ {
+ apc->ApcMode = KernelMode;
+ apc->NormalContext = NULL;
+ }
+}
+
static KSPIN_LOCK cancel_lock;
/***********************************************************************
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
index 176b432644..9fcb138701 100644
--- a/include/ddk/wdm.h
+++ b/include/ddk/wdm.h
@@ -464,6 +464,13 @@ typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;
/* Irp definitions */
typedef UCHAR KIRQL, *PKIRQL;
typedef CCHAR KPROCESSOR_MODE;
+typedef enum _KAPC_ENVIRONMENT
+{
+ OriginalApcEnvironment,
+ AttachedApcEnvironment,
+ CurrentApcEnvironment,
+ InsertApcEnvironment
+} KAPC_ENVIRONMENT, *PKAPC_ENVIRONMENT;
typedef VOID (WINAPI *PDRIVER_CANCEL)(
IN struct _DEVICE_OBJECT *DeviceObject,
More information about the wine-cvs
mailing list