From a11cdd2231d8d736f79c806e00fc81d9776db9ff Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Thu, 2 May 2019 13:20:52 +0200 Subject: [PATCH] ntoskrnl.exe: Implement IoBuildAsynchronousFsdRequest. Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- dlls/ntoskrnl.exe/ntoskrnl.c | 35 ++++++++++++++++++++++------- dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +- include/ddk/wdm.h | 1 + 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c index eff90bb9830..63f66477a66 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/ntoskrnl.c @@ -1366,18 +1366,17 @@ PIRP WINAPI IoBuildDeviceIoControlRequest( ULONG code, PDEVICE_OBJECT device, return irp; } - -/********************************************************** - * IoBuildSynchronousFsdRequest (NTOSKRNL.EXE.@) +/*********************************************************************** + * IoBuildAsynchronousFsdRequest (NTOSKRNL.EXE.@) */ -PIRP WINAPI IoBuildSynchronousFsdRequest(ULONG majorfunc, PDEVICE_OBJECT device, - PVOID buffer, ULONG length, PLARGE_INTEGER startoffset, - PKEVENT event, PIO_STATUS_BLOCK iosb) +PIRP WINAPI IoBuildAsynchronousFsdRequest(ULONG majorfunc, DEVICE_OBJECT *device, + void *buffer, ULONG length, LARGE_INTEGER *startoffset, + IO_STATUS_BLOCK *iosb) { PIRP irp; PIO_STACK_LOCATION irpsp; - TRACE("(%d %p %p %d %p %p %p)\n", majorfunc, device, buffer, length, startoffset, event, iosb); + TRACE( "(%d %p %p %d %p %p)\n", majorfunc, device, buffer, length, startoffset, iosb ); if (!(irp = IoAllocateIrp( device->StackSize, FALSE ))) return NULL; @@ -1414,11 +1413,31 @@ PIRP WINAPI IoBuildSynchronousFsdRequest(ULONG majorfunc, PDEVICE_OBJECT device, } irp->RequestorMode = KernelMode; irp->UserIosb = iosb; - irp->UserEvent = event; + irp->UserEvent = NULL; irp->UserBuffer = buffer; return irp; } + + +/*********************************************************************** + * IoBuildSynchronousFsdRequest (NTOSKRNL.EXE.@) + */ +PIRP WINAPI IoBuildSynchronousFsdRequest(ULONG majorfunc, PDEVICE_OBJECT device, + PVOID buffer, ULONG length, PLARGE_INTEGER startoffset, + PKEVENT event, PIO_STATUS_BLOCK iosb) +{ + IRP *irp; + + TRACE("(%d %p %p %d %p %p)\n", majorfunc, device, buffer, length, startoffset, iosb); + + irp = IoBuildAsynchronousFsdRequest( majorfunc, device, buffer, length, startoffset, iosb ); + if (!irp) return NULL; + + irp->UserEvent = event; + return irp; +} + static void build_driver_keypath( const WCHAR *name, UNICODE_STRING *keypath ) { static const WCHAR driverW[] = {'\\','D','r','i','v','e','r','\\',0}; diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec index a1c84eef573..20999d29157 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec +++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec @@ -330,7 +330,7 @@ @ stub IoAttachDeviceByPointer @ stdcall IoAttachDeviceToDeviceStack(ptr ptr) @ stub IoAttachDeviceToDeviceStackSafe -@ stub IoBuildAsynchronousFsdRequest +@ stdcall IoBuildAsynchronousFsdRequest(long ptr ptr long ptr ptr) @ stdcall IoBuildDeviceIoControlRequest(long ptr ptr long ptr long long ptr ptr) @ stub IoBuildPartialMdl @ stdcall IoBuildSynchronousFsdRequest(long ptr ptr long ptr ptr ptr) diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h index 25f2d4922bb..1f6bdfab857 100644 --- a/include/ddk/wdm.h +++ b/include/ddk/wdm.h @@ -1559,6 +1559,7 @@ PIRP WINAPI IoAllocateIrp(CCHAR,BOOLEAN); PMDL WINAPI IoAllocateMdl(PVOID,ULONG,BOOLEAN,BOOLEAN,IRP*); PIO_WORKITEM WINAPI IoAllocateWorkItem(PDEVICE_OBJECT); PDEVICE_OBJECT WINAPI IoAttachDeviceToDeviceStack(PDEVICE_OBJECT,PDEVICE_OBJECT); +PIRP WINAPI IoBuildAsynchronousFsdRequest(ULONG,DEVICE_OBJECT*,void*,ULONG,LARGE_INTEGER*,IO_STATUS_BLOCK*); PIRP WINAPI IoBuildDeviceIoControlRequest(ULONG,DEVICE_OBJECT*,PVOID,ULONG,PVOID,ULONG,BOOLEAN,PKEVENT,IO_STATUS_BLOCK*); PIRP WINAPI IoBuildSynchronousFsdRequest(ULONG,DEVICE_OBJECT*,PVOID,ULONG,PLARGE_INTEGER,PKEVENT,IO_STATUS_BLOCK*); NTSTATUS WINAPI IoCallDriver(DEVICE_OBJECT*,IRP*);