Module: wine Branch: master Commit: 43ba0a1bec4139e2cb90097a26d6fd25ebb5d47a URL: https://source.winehq.org/git/wine.git/?a=commit;h=43ba0a1bec4139e2cb90097a2...
Author: Jacek Caban jacek@codeweavers.com Date: Wed May 1 17:54:23 2019 +0200
ntoskrnl.exe: Implement IoQueueWorkItem.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntoskrnl.exe/ntoskrnl.c | 29 +++++++++++++++++++++++++++++ dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +- include/ddk/wdm.h | 10 ++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c index cf053ca..eff90bb 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/ntoskrnl.c @@ -1235,6 +1235,8 @@ void WINAPI IoFreeMdl(PMDL mdl) struct _IO_WORKITEM { DEVICE_OBJECT *device; + PIO_WORKITEM_ROUTINE worker; + void *context; };
/*********************************************************************** @@ -1262,6 +1264,33 @@ void WINAPI IoFreeWorkItem( PIO_WORKITEM work_item ) }
+void WINAPI run_work_item_worker(TP_CALLBACK_INSTANCE *instance, void *context) +{ + PIO_WORKITEM work_item = context; + DEVICE_OBJECT *device = work_item->device; + + TRACE( "%p: calling %p(%p %p)\n", work_item, work_item->worker, device, work_item->context ); + work_item->worker( device, work_item->context ); + TRACE( "done\n" ); + + ObDereferenceObject( device ); +} + +/*********************************************************************** + * IoQueueWorkItem (NTOSKRNL.EXE.@) + */ +void WINAPI IoQueueWorkItem( PIO_WORKITEM work_item, PIO_WORKITEM_ROUTINE worker, + WORK_QUEUE_TYPE type, void *context ) +{ + TRACE( "%p %p %u %p\n", work_item, worker, type, context ); + + ObReferenceObject( work_item->device ); + work_item->worker = worker; + work_item->context = context; + TrySubmitThreadpoolCallback( run_work_item_worker, work_item, NULL ); +} + + /*********************************************************************** * IoAttachDeviceToDeviceStack (NTOSKRNL.EXE.@) */ diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec index 3103159..a1c84ee 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec +++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec @@ -428,7 +428,7 @@ @ stub IoQueryFileInformation @ stub IoQueryVolumeInformation @ stub IoQueueThreadIrp -@ stub IoQueueWorkItem +@ stdcall IoQueueWorkItem(ptr ptr long ptr) @ stub IoRaiseHardError @ stub IoRaiseInformationalHardError @ stub IoReadDiskSignature diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h index 4772793..f2b2723 100644 --- a/include/ddk/wdm.h +++ b/include/ddk/wdm.h @@ -1460,6 +1460,15 @@ typedef enum _DIRECTORY_NOTIFY_INFORMATION_CLASS { DirectoryNotifyExtendedInformation } DIRECTORY_NOTIFY_INFORMATION_CLASS, *PDIRECTORY_NOTIFY_INFORMATION_CLASS;
+typedef enum _WORK_QUEUE_TYPE { + CriticalWorkQueue, + DelayedWorkQueue, + HyperCriticalWorkQueue, + MaximumWorkQueue +} WORK_QUEUE_TYPE; + +typedef void (WINAPI *PIO_WORKITEM_ROUTINE)(PDEVICE_OBJECT,void*); + NTSTATUS WINAPI ObCloseHandle(IN HANDLE handle);
#ifdef NONAMELESSUNION @@ -1568,6 +1577,7 @@ PDEVICE_OBJECT WINAPI IoGetRelatedDeviceObject(PFILE_OBJECT); void WINAPI IoInitializeIrp(IRP*,USHORT,CCHAR); VOID WINAPI IoInitializeRemoveLockEx(PIO_REMOVE_LOCK,ULONG,ULONG,ULONG,ULONG); void WINAPI IoInvalidateDeviceRelations(PDEVICE_OBJECT,DEVICE_RELATION_TYPE); +void WINAPI IoQueueWorkItem(PIO_WORKITEM,PIO_WORKITEM_ROUTINE,WORK_QUEUE_TYPE,void*); NTSTATUS WINAPI IoRegisterDeviceInterface(PDEVICE_OBJECT,const GUID*,PUNICODE_STRING,PUNICODE_STRING); void WINAPI IoReleaseCancelSpinLock(KIRQL); NTSTATUS WINAPI IoSetDeviceInterfaceState(UNICODE_STRING*,BOOLEAN);