diff --git a/src/sys/cleanup.c b/src/sys/cleanup.c index 934061f8..c7854676 100644 --- a/src/sys/cleanup.c +++ b/src/sys/cleanup.c @@ -13,12 +13,14 @@ static NTSTATUS FspFsvrtCleanup( static NTSTATUS FspFsvolCleanup( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); DRIVER_DISPATCH FspCleanup; +FSP_IOCOMPLETION_DISPATCH FspCleanupComplete; #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, FspFsctlCleanup) #pragma alloc_text(PAGE, FspFsvrtCleanup) #pragma alloc_text(PAGE, FspFsvolCleanup) #pragma alloc_text(PAGE, FspCleanup) +#pragma alloc_text(PAGE, FspCleanupComplete) #endif static NTSTATUS FspFsctlCleanup( @@ -66,3 +68,10 @@ FspCleanup( FSP_LEAVE_MJ("FileObject=%p", IrpSp->FileObject); } + +VOID FspCleanupComplete(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response) +{ + PAGED_CODE(); + + FspCompleteRequest(Irp, STATUS_SUCCESS); +} diff --git a/src/sys/close.c b/src/sys/close.c index 49438baf..37a0e2cd 100644 --- a/src/sys/close.c +++ b/src/sys/close.c @@ -13,12 +13,14 @@ static NTSTATUS FspFsvrtClose( static NTSTATUS FspFsvolClose( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); DRIVER_DISPATCH FspClose; +FSP_IOCOMPLETION_DISPATCH FspCloseComplete; #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, FspFsctlClose) #pragma alloc_text(PAGE, FspFsvrtClose) #pragma alloc_text(PAGE, FspFsvolClose) #pragma alloc_text(PAGE, FspClose) +#pragma alloc_text(PAGE, FspCloseComplete) #endif static NTSTATUS FspFsctlClose( @@ -66,3 +68,10 @@ FspClose( FSP_LEAVE_MJ("FileObject=%p", IrpSp->FileObject); } + +VOID FspCloseComplete(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response) +{ + PAGED_CODE(); + + FspCompleteRequest(Irp, STATUS_SUCCESS); +} diff --git a/src/sys/create.c b/src/sys/create.c index eb1c01db..ad104d43 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -13,12 +13,14 @@ static NTSTATUS FspFsvrtCreate( static NTSTATUS FspFsvolCreate( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); DRIVER_DISPATCH FspCreate; +FSP_IOCOMPLETION_DISPATCH FspCreateComplete; #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, FspFsctlCreate) #pragma alloc_text(PAGE, FspFsvrtCreate) #pragma alloc_text(PAGE, FspFsvolCreate) #pragma alloc_text(PAGE, FspCreate) +#pragma alloc_text(PAGE, FspCreateComplete) #endif static NTSTATUS FspFsctlCreate( @@ -80,3 +82,10 @@ FspCreate( Irp->Overlay.AllocationSize.HighPart, Irp->Overlay.AllocationSize.LowPart, Irp->AssociatedIrp.SystemBuffer, IrpSp->Parameters.Create.EaLength); } + +VOID FspCreateComplete(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response) +{ + PAGED_CODE(); + + FspCompleteRequest(Irp, STATUS_SUCCESS); +} diff --git a/src/sys/devctl.c b/src/sys/devctl.c index 73bc4f23..1567b77d 100644 --- a/src/sys/devctl.c +++ b/src/sys/devctl.c @@ -9,10 +9,12 @@ static NTSTATUS FspFsvolDeviceControl( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); DRIVER_DISPATCH FspDeviceControl; +FSP_IOCOMPLETION_DISPATCH FspDeviceControlComplete; #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, FspFsvolDeviceControl) #pragma alloc_text(PAGE, FspDeviceControl) +#pragma alloc_text(PAGE, FspDeviceControlComplete) #endif static NTSTATUS FspFsvolDeviceControl( @@ -40,3 +42,10 @@ FspDeviceControl( FSP_LEAVE_MJ("", 0); } + +VOID FspDeviceControlComplete(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response) +{ + PAGED_CODE(); + + FspCompleteRequest(Irp, STATUS_SUCCESS); +} diff --git a/src/sys/dirctl.c b/src/sys/dirctl.c index 57e2daa1..7b8fcd97 100644 --- a/src/sys/dirctl.c +++ b/src/sys/dirctl.c @@ -9,10 +9,12 @@ static NTSTATUS FspFsvolDirectoryControl( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); DRIVER_DISPATCH FspDirectoryControl; +FSP_IOCOMPLETION_DISPATCH FspDirectoryControlComplete; #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, FspFsvolDirectoryControl) #pragma alloc_text(PAGE, FspDirectoryControl) +#pragma alloc_text(PAGE, FspDirectoryControlComplete) #endif static NTSTATUS FspFsvolDirectoryControl( @@ -40,3 +42,10 @@ FspDirectoryControl( FSP_LEAVE_MJ("", 0); } + +VOID FspDirectoryControlComplete(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response) +{ + PAGED_CODE(); + + FspCompleteRequest(Irp, STATUS_SUCCESS); +} diff --git a/src/sys/driver.c b/src/sys/driver.c index 37862d88..a51cafd4 100644 --- a/src/sys/driver.c +++ b/src/sys/driver.c @@ -47,7 +47,6 @@ DriverEntry( /* setup the driver object */ DriverObject->DriverUnload = FspUnload; DriverObject->MajorFunction[IRP_MJ_CREATE] = FspCreate; - //DriverObject->MajorFunction[IRP_MJ_CREATE_NAMED_PIPE] = IopInvalidDeviceRequest; DriverObject->MajorFunction[IRP_MJ_CLOSE] = FspClose; DriverObject->MajorFunction[IRP_MJ_READ] = FspRead; DriverObject->MajorFunction[IRP_MJ_WRITE] = FspWrite; @@ -61,19 +60,32 @@ DriverEntry( DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] = FspDirectoryControl; DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = FspFileSystemControl; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = FspDeviceControl; - //DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = IopInvalidDeviceRequest; DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = FspShutdown; DriverObject->MajorFunction[IRP_MJ_LOCK_CONTROL] = FspLockControl; DriverObject->MajorFunction[IRP_MJ_CLEANUP] = FspCleanup; - //DriverObject->MajorFunction[IRP_MJ_CREATE_MAILSLOT] = IopInvalidDeviceRequest; DriverObject->MajorFunction[IRP_MJ_QUERY_SECURITY] = FspQuerySecurity; DriverObject->MajorFunction[IRP_MJ_SET_SECURITY] = FspSetSecurity; - //DriverObject->MajorFunction[IRP_MJ_POWER] = IopInvalidDeviceRequest; - //DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = IopInvalidDeviceRequest; - //DriverObject->MajorFunction[IRP_MJ_DEVICE_CHANGE] = IopInvalidDeviceRequest; - //DriverObject->MajorFunction[IRP_MJ_QUERY_QUOTA] = IopInvalidDeviceRequest; - //DriverObject->MajorFunction[IRP_MJ_SET_QUOTA] = IopInvalidDeviceRequest; - //DriverObject->MajorFunction[IRP_MJ_PNP] = IopInvalidDeviceRequest; + + /* setup the I/O completion functions */ + FspIoCompletionFunction[IRP_MJ_CREATE] = FspCreateComplete; + FspIoCompletionFunction[IRP_MJ_CLOSE] = FspCloseComplete; + FspIoCompletionFunction[IRP_MJ_READ] = FspReadComplete; + FspIoCompletionFunction[IRP_MJ_WRITE] = FspWriteComplete; + FspIoCompletionFunction[IRP_MJ_QUERY_INFORMATION] = FspQueryInformationComplete; + FspIoCompletionFunction[IRP_MJ_SET_INFORMATION] = FspSetInformationComplete; + FspIoCompletionFunction[IRP_MJ_QUERY_EA] = FspQueryEaComplete; + FspIoCompletionFunction[IRP_MJ_SET_EA] = FspSetEaComplete; + FspIoCompletionFunction[IRP_MJ_FLUSH_BUFFERS] = FspFlushBuffersComplete; + FspIoCompletionFunction[IRP_MJ_QUERY_VOLUME_INFORMATION] = FspQueryVolumeInformationComplete; + FspIoCompletionFunction[IRP_MJ_SET_VOLUME_INFORMATION] = FspSetVolumeInformationComplete; + FspIoCompletionFunction[IRP_MJ_DIRECTORY_CONTROL] = FspDirectoryControlComplete; + FspIoCompletionFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = FspFileSystemControlComplete; + FspIoCompletionFunction[IRP_MJ_DEVICE_CONTROL] = FspDeviceControlComplete; + FspIoCompletionFunction[IRP_MJ_SHUTDOWN] = FspShutdownComplete; + FspIoCompletionFunction[IRP_MJ_LOCK_CONTROL] = FspLockControlComplete; + FspIoCompletionFunction[IRP_MJ_CLEANUP] = FspCleanupComplete; + FspIoCompletionFunction[IRP_MJ_QUERY_SECURITY] = FspQuerySecurityComplete; + FspIoCompletionFunction[IRP_MJ_SET_SECURITY] = FspSetSecurityComplete; /* setup fast I/O and resource acquisition */ static FAST_IO_DISPATCH FspFastIoDispatch = { 0 }; diff --git a/src/sys/driver.h b/src/sys/driver.h index 6f86e7e4..26378034 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -145,6 +145,28 @@ DRIVER_DISPATCH FspSetVolumeInformation; DRIVER_DISPATCH FspShutdown; DRIVER_DISPATCH FspWrite; +/* I/O completion functions */ +typedef VOID FSP_IOCOMPLETION_DISPATCH(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response); +FSP_IOCOMPLETION_DISPATCH FspCleanupComplete; +FSP_IOCOMPLETION_DISPATCH FspCloseComplete; +FSP_IOCOMPLETION_DISPATCH FspCreateComplete; +FSP_IOCOMPLETION_DISPATCH FspDeviceControlComplete; +FSP_IOCOMPLETION_DISPATCH FspDirectoryControlComplete; +FSP_IOCOMPLETION_DISPATCH FspFileSystemControlComplete; +FSP_IOCOMPLETION_DISPATCH FspFlushBuffersComplete; +FSP_IOCOMPLETION_DISPATCH FspLockControlComplete; +FSP_IOCOMPLETION_DISPATCH FspQueryEaComplete; +FSP_IOCOMPLETION_DISPATCH FspQueryInformationComplete; +FSP_IOCOMPLETION_DISPATCH FspQuerySecurityComplete; +FSP_IOCOMPLETION_DISPATCH FspQueryVolumeInformationComplete; +FSP_IOCOMPLETION_DISPATCH FspReadComplete; +FSP_IOCOMPLETION_DISPATCH FspSetEaComplete; +FSP_IOCOMPLETION_DISPATCH FspSetInformationComplete; +FSP_IOCOMPLETION_DISPATCH FspSetSecurityComplete; +FSP_IOCOMPLETION_DISPATCH FspSetVolumeInformationComplete; +FSP_IOCOMPLETION_DISPATCH FspShutdownComplete; +FSP_IOCOMPLETION_DISPATCH FspWriteComplete; + /* fast I/O */ FAST_IO_CHECK_IF_POSSIBLE FspFastIoCheckIfPossible; @@ -242,5 +264,6 @@ const char *IoctlCodeSym(ULONG ControlCode); /* extern */ extern PDEVICE_OBJECT FspFsctlDiskDeviceObject; extern PDEVICE_OBJECT FspFsctlNetDeviceObject; +extern FSP_IOCOMPLETION_DISPATCH *FspIoCompletionFunction[]; #endif diff --git a/src/sys/ea.c b/src/sys/ea.c index f9bf2cdf..f6ba11ac 100644 --- a/src/sys/ea.c +++ b/src/sys/ea.c @@ -12,12 +12,16 @@ static NTSTATUS FspFsvolSetEa( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); DRIVER_DISPATCH FspQueryEa; DRIVER_DISPATCH FspSetEa; +FSP_IOCOMPLETION_DISPATCH FspQueryEaComplete; +FSP_IOCOMPLETION_DISPATCH FspSetEaComplete; #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, FspFsvolQueryEa) #pragma alloc_text(PAGE, FspFsvolSetEa) #pragma alloc_text(PAGE, FspQueryEa) #pragma alloc_text(PAGE, FspSetEa) +#pragma alloc_text(PAGE, FspQueryEaComplete) +#pragma alloc_text(PAGE, FspSetEaComplete) #endif static NTSTATUS FspFsvolQueryEa( @@ -71,3 +75,17 @@ FspSetEa( FSP_LEAVE_MJ("", 0); } + +VOID FspQueryEaComplete(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response) +{ + PAGED_CODE(); + + FspCompleteRequest(Irp, STATUS_SUCCESS); +} + +VOID FspSetEaComplete(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response) +{ + PAGED_CODE(); + + FspCompleteRequest(Irp, STATUS_SUCCESS); +} diff --git a/src/sys/fileinfo.c b/src/sys/fileinfo.c index 39efb451..fb021e0d 100644 --- a/src/sys/fileinfo.c +++ b/src/sys/fileinfo.c @@ -12,12 +12,16 @@ static NTSTATUS FspFsvolSetInformation( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); DRIVER_DISPATCH FspQueryInformation; DRIVER_DISPATCH FspSetInformation; +FSP_IOCOMPLETION_DISPATCH FspQueryInformationComplete; +FSP_IOCOMPLETION_DISPATCH FspSetInformationComplete; #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, FspFsvolQueryInformation) #pragma alloc_text(PAGE, FspFsvolSetInformation) #pragma alloc_text(PAGE, FspQueryInformation) #pragma alloc_text(PAGE, FspSetInformation) +#pragma alloc_text(PAGE, FspQueryInformationComplete) +#pragma alloc_text(PAGE, FspSetInformationComplete) #endif static NTSTATUS FspFsvolQueryInformation( @@ -71,3 +75,17 @@ FspSetInformation( FSP_LEAVE_MJ("", 0); } + +VOID FspQueryInformationComplete(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response) +{ + PAGED_CODE(); + + FspCompleteRequest(Irp, STATUS_SUCCESS); +} + +VOID FspSetInformationComplete(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response) +{ + PAGED_CODE(); + + FspCompleteRequest(Irp, STATUS_SUCCESS); +} diff --git a/src/sys/flush.c b/src/sys/flush.c index c8f26730..4f8f6865 100644 --- a/src/sys/flush.c +++ b/src/sys/flush.c @@ -9,10 +9,12 @@ static NTSTATUS FspFsvolFlushBuffers( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); DRIVER_DISPATCH FspFlushBuffers; +FSP_IOCOMPLETION_DISPATCH FspFlushBuffersComplete; #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, FspFsvolFlushBuffers) #pragma alloc_text(PAGE, FspFlushBuffers) +#pragma alloc_text(PAGE, FspFlushBuffersComplete) #endif static NTSTATUS FspFsvolFlushBuffers( @@ -40,3 +42,10 @@ FspFlushBuffers( FSP_LEAVE_MJ("", 0); } + +VOID FspFlushBuffersComplete(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response) +{ + PAGED_CODE(); + + FspCompleteRequest(Irp, STATUS_SUCCESS); +} diff --git a/src/sys/fsctl.c b/src/sys/fsctl.c index 4ad7ed02..5a798da7 100644 --- a/src/sys/fsctl.c +++ b/src/sys/fsctl.c @@ -19,6 +19,7 @@ static NTSTATUS FspFsvrtFileSystemControl( static NTSTATUS FspFsvolFileSystemControl( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); DRIVER_DISPATCH FspFileSystemControl; +FSP_IOCOMPLETION_DISPATCH FspFileSystemControlComplete; #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, FspFsctlCreateVolume) @@ -28,6 +29,7 @@ DRIVER_DISPATCH FspFileSystemControl; #pragma alloc_text(PAGE, FspFsvrtFileSystemControl) #pragma alloc_text(PAGE, FspFsvolFileSystemControl) #pragma alloc_text(PAGE, FspFileSystemControl) +#pragma alloc_text(PAGE, FspFileSystemControlComplete) #endif static NTSTATUS FspFsctlCreateVolume( @@ -282,3 +284,10 @@ FspFileSystemControl( IRP_MN_USER_FS_REQUEST == IrpSp->MinorFunction ? IoctlCodeSym(IrpSp->Parameters.FileSystemControl.FsControlCode) : ""); } + +VOID FspFileSystemControlComplete(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response) +{ + PAGED_CODE(); + + FspCompleteRequest(Irp, STATUS_SUCCESS); +} diff --git a/src/sys/iocompl.c b/src/sys/iocompl.c index 5b707491..f46b7218 100644 --- a/src/sys/iocompl.c +++ b/src/sys/iocompl.c @@ -6,7 +6,10 @@ #include +VOID FspDispatchProcessedIrp(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response); + #ifdef ALLOC_PRAGMA +#pragma alloc_text(PAGE, FspDispatchProcessedIrp) #endif VOID FspCompleteRequest(PIRP Irp, NTSTATUS Result) @@ -26,4 +29,14 @@ VOID FspCompleteRequest(PIRP Irp, NTSTATUS Result) VOID FspDispatchProcessedIrp(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response) { + PAGED_CODE(); + + PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); + + ASSERT(IRP_MJ_MAXIMUM_FUNCTION >= IrpSp->MajorFunction); + ASSERT(0 != FspIoCompletionFunction[IrpSp->MajorFunction]); + + FspIoCompletionFunction[IrpSp->MajorFunction](Irp, Response); } + +FSP_IOCOMPLETION_DISPATCH *FspIoCompletionFunction[IRP_MJ_MAXIMUM_FUNCTION + 1]; diff --git a/src/sys/lockctl.c b/src/sys/lockctl.c index 6013c515..20cc1d6c 100644 --- a/src/sys/lockctl.c +++ b/src/sys/lockctl.c @@ -9,10 +9,12 @@ static NTSTATUS FspFsvolLockControl( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); DRIVER_DISPATCH FspLockControl; +FSP_IOCOMPLETION_DISPATCH FspLockControlComplete; #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, FspFsvolLockControl) #pragma alloc_text(PAGE, FspLockControl) +#pragma alloc_text(PAGE, FspLockControlComplete) #endif static NTSTATUS FspFsvolLockControl( @@ -40,3 +42,10 @@ FspLockControl( FSP_LEAVE_MJ("", 0); } + +VOID FspLockControlComplete(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response) +{ + PAGED_CODE(); + + FspCompleteRequest(Irp, STATUS_SUCCESS); +} diff --git a/src/sys/read.c b/src/sys/read.c index ed145d84..01825f6b 100644 --- a/src/sys/read.c +++ b/src/sys/read.c @@ -9,10 +9,12 @@ static NTSTATUS FspFsvolRead( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); DRIVER_DISPATCH FspRead; +FSP_IOCOMPLETION_DISPATCH FspReadComplete; #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, FspFsvolRead) #pragma alloc_text(PAGE, FspRead) +#pragma alloc_text(PAGE, FspReadComplete) #endif static NTSTATUS FspFsvolRead( @@ -40,3 +42,10 @@ FspRead( FSP_LEAVE_MJ("", 0); } + +VOID FspReadComplete(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response) +{ + PAGED_CODE(); + + FspCompleteRequest(Irp, STATUS_SUCCESS); +} diff --git a/src/sys/security.c b/src/sys/security.c index 4a134064..b3c74355 100644 --- a/src/sys/security.c +++ b/src/sys/security.c @@ -12,12 +12,16 @@ static NTSTATUS FspFsvolSetSecurity( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); DRIVER_DISPATCH FspQuerySecurity; DRIVER_DISPATCH FspSetSecurity; +FSP_IOCOMPLETION_DISPATCH FspQuerySecurityComplete; +FSP_IOCOMPLETION_DISPATCH FspSetSecurityComplete; #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, FspFsvolQuerySecurity) #pragma alloc_text(PAGE, FspFsvolSetSecurity) #pragma alloc_text(PAGE, FspQuerySecurity) #pragma alloc_text(PAGE, FspSetSecurity) +#pragma alloc_text(PAGE, FspQuerySecurityComplete) +#pragma alloc_text(PAGE, FspSetSecurityComplete) #endif static NTSTATUS FspFsvolQuerySecurity( @@ -71,3 +75,17 @@ FspSetSecurity( FSP_LEAVE_MJ("", 0); } + +VOID FspQuerySecurityComplete(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response) +{ + PAGED_CODE(); + + FspCompleteRequest(Irp, STATUS_SUCCESS); +} + +VOID FspSetSecurityComplete(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response) +{ + PAGED_CODE(); + + FspCompleteRequest(Irp, STATUS_SUCCESS); +} diff --git a/src/sys/shutdown.c b/src/sys/shutdown.c index 642fb780..e79afeb4 100644 --- a/src/sys/shutdown.c +++ b/src/sys/shutdown.c @@ -9,10 +9,12 @@ static NTSTATUS FspFsvolShutdown( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); DRIVER_DISPATCH FspShutdown; +FSP_IOCOMPLETION_DISPATCH FspShutdownComplete; #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, FspFsvolShutdown) #pragma alloc_text(PAGE, FspShutdown) +#pragma alloc_text(PAGE, FspShutdownComplete) #endif static NTSTATUS FspFsvolShutdown( @@ -40,3 +42,10 @@ FspShutdown( FSP_LEAVE_MJ("", 0); } + +VOID FspShutdownComplete(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response) +{ + PAGED_CODE(); + + FspCompleteRequest(Irp, STATUS_SUCCESS); +} diff --git a/src/sys/volinfo.c b/src/sys/volinfo.c index 3b120066..11cc782c 100644 --- a/src/sys/volinfo.c +++ b/src/sys/volinfo.c @@ -12,12 +12,16 @@ static NTSTATUS FspFsvolSetVolumeInformation( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); DRIVER_DISPATCH FspQueryVolumeInformation; DRIVER_DISPATCH FspSetVolumeInformation; +FSP_IOCOMPLETION_DISPATCH FspQueryVolumeInformationComplete; +FSP_IOCOMPLETION_DISPATCH FspSetVolumeInformationComplete; #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, FspFsvolQueryVolumeInformation) #pragma alloc_text(PAGE, FspFsvolSetVolumeInformation) #pragma alloc_text(PAGE, FspQueryVolumeInformation) #pragma alloc_text(PAGE, FspSetVolumeInformation) +#pragma alloc_text(PAGE, FspQueryVolumeInformationComplete) +#pragma alloc_text(PAGE, FspSetVolumeInformationComplete) #endif static NTSTATUS FspFsvolQueryVolumeInformation( @@ -71,3 +75,17 @@ FspSetVolumeInformation( FSP_LEAVE_MJ("", 0); } + +VOID FspQueryVolumeInformationComplete(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response) +{ + PAGED_CODE(); + + FspCompleteRequest(Irp, STATUS_SUCCESS); +} + +VOID FspSetVolumeInformationComplete(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response) +{ + PAGED_CODE(); + + FspCompleteRequest(Irp, STATUS_SUCCESS); +} diff --git a/src/sys/write.c b/src/sys/write.c index dbdeb016..d149aba3 100644 --- a/src/sys/write.c +++ b/src/sys/write.c @@ -9,10 +9,12 @@ static NTSTATUS FspFsvolWrite( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); DRIVER_DISPATCH FspWrite; +VOID FspWriteComplete(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response); #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, FspFsvolWrite) #pragma alloc_text(PAGE, FspWrite) +#pragma alloc_text(PAGE, FspWriteComplete) #endif static NTSTATUS FspFsvolWrite( @@ -40,3 +42,10 @@ FspWrite( FSP_LEAVE_MJ("", 0); } + +VOID FspWriteComplete(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response) +{ + PAGED_CODE(); + + FspCompleteRequest(Irp, STATUS_SUCCESS); +}