阅读:1740回复:4
tooflat 大侠 请考如何构造MJ_CLEANUP和MJ_CLOSE的IRP
我想在SfCreate完成后
status = IoCallDriver( ((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp ); 过滤将irp取消 使用代码 Irp->IoStatus.Status = STATUS_ACCESS_DENIED; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); 发现文件被占用了不能删除移动 想通过构造MJ_CLEANUP和MJ_CLOSE的IRP关了要个以经占用的文件 |
|
沙发#
发布于:2007-01-26 09:38
顶一下自己
正在阅读 OSR Technical Articles Building IRPs to Perform I/O |
|
板凳#
发布于:2007-01-26 09:39
发送IRP_CLEANUP和IRP_CLOSE,可以直接使用IoCancelFileOpen,不过这样是不安全的,版上应该讨论过很多次了。
///////////////////////////////////////////////////////////////////////////////// 直接构造cleanup irp如下, close没试过,应该差不多。 NTSTATUS SfIssueCleanupIrpSynchronously( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PFILE_OBJECT FileObject ) { PIO_STACK_LOCATION irpSp = NULL; IO_STATUS_BLOCK iosb; KEVENT event; KeInitializeEvent(&event, NotificationEvent, FALSE); KeClearEvent(&FileObject->Event); Irp->Tail.Overlay.OriginalFileObject = FileObject; Irp->Tail.Overlay.Thread = PsGetCurrentThread(); Irp->Overlay.AsynchronousParameters.UserApcRoutine =(PIO_APC_ROUTINE) NULL; Irp->RequestorMode = KernelMode; Irp->UserEvent = &event; Irp->UserIosb = &iosb; Irp->Flags = IRP_SYNCHRONOUS_API | IRP_CLOSE_OPERATION; irpSp = IoGetNextIrpStackLocation(Irp); irpSp->MajorFunction = IRP_MJ_CLEANUP; irpSp->FileObject = FileObject; if (STATUS_PENDING == IoCallDriver(DeviceObject, Irp)) { KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL); } return iosb.Status; } |
|
地板#
发布于:2007-01-26 10:11
谢谢 老大我去试试
|
|
地下室#
发布于:2007-01-26 13:07
再次谢谢老大
我的问题以解决 |
|