阅读:1411回复:4
自己创建的IRP也会重入吗?
研究了以下前面的关于IRP重入的帖子,关于重入的问题已经讨论很多了,避免的 方法就是自己构造IRP,call 下层驱动,今天自己创建了一个读IRP,可是调试的 时候发现这个读请求被我自己的ReadDispatch处理了,请问各位大虾怎么回事?
|
|
沙发#
发布于:2005-03-18 12:22
怎么构造的IRP把代码发上来,理论上自己构造IRP包然后发给底层驱动是不可能重入的。一定是你在什么地方出了问题。
|
|
|
板凳#
发布于:2005-03-21 09:47
irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
if (!irp) { // // Failure! // return FALSE; } // // Build the IRP\'s main body // irp->UserEvent = &event; irp->UserIosb = &IoStatusBlock; irp->Tail.Overlay.Thread = PsGetCurrentThread(); irp->Tail.Overlay.OriginalFileObject = FileObject; irp->Tail.Overlay.AuxiliaryBuffer = (PVOID) NULL; irp->RequestorMode = ExGetPreviousMode(); irp->PendingReturned = FALSE; irp->Cancel = FALSE; irp->CancelRoutine = (PDRIVER_CANCEL) NULL; // // Set up the I/O stack location. // irpSp = IoGetNextIrpStackLocation(irp); irpSp->MajorFunction = MajorFunction; irpSp->DeviceObject = DeviceObject; irpSp->FileObject = FileObject; //在这里将我自己创建的缓冲区交给IRP if(直接IO) //创建MDL,将FileBuffer作为MDL的buffer else //irp->UserBuffer = FileBuffer; // // Set the completion routine. // IoSetCompletionRoutine(irp, ReadFileCompleted, 0, TRUE, TRUE, TRUE); // // Send it to the FSD // (void) IoCallDriver(DeviceObject, irp); // // Wait for the I/O // KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, 0); 读取文件是正确的,但是用filemon仍然能够看到我自己发的IRP_MJ_READ,请问这是怎么回事儿呢,自己向下层文件系统驱动程序发送的IRP应该不会被filemon拦截到吧,请各位大虾指教。 |
|
地板#
发布于:2005-03-21 10:30
你的代码太少,提示的信息也不清楚,例如DeviceObject指向的是哪个设备对象??等等。
|
|
|
地下室#
发布于:2005-03-21 12:19
BOOLEAN
CreateIRPAndReadFile( PDEVICE_OBJECT DeviceObject, PFILE_OBJECT FileObject, PVOID FileQueryBuffer, ULONG FileQueryBufferLength ){ //这就是我上面贴的代码 } 调用: //FileBufferSize为一个特定长度,例如512字节 //FileBuffer为文件缓冲区,负责存放读出的数据 FileBuffer = ExAllocatePool(NonPagedPool, FileBufferSize); //hookExt就是filemon创建的设备对象的扩展,它指向的FileSystem应该是hook的下层文件系统设备对象吧。 Success = CreateIRPAndReadFile( hookExt->FileSystem, fileObject, FileBuffer, FileBufferSize); if(!Success){ ExFreePool(FileBuffer); return CompleteRequest(Irp, Irp->IoStatus.Status, Irp->IoStatus.Information); } |
|