阅读:1447回复:3
在 IRP_MJ_CREATE 读档出问题
各位大牛
小弟想在IRP_MJ_CREATE中透过自定义IRP去读档,可是读到的资料都是空的 我的程序代码如下 NTSTATUS IoCompletionRoutine( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ) { DbgPrint(("IoCompletionRoutine!\n")); *Irp->UserIosb = Irp->IoStatus; if (Irp->UserEvent) KeSetEvent(Irp->UserEvent, IO_NO_INCREMENT, 0); if (Irp->MdlAddress) { IoFreeMdl(Irp->MdlAddress); Irp->MdlAddress = NULL; } IoFreeIrp(Irp); return STATUS_MORE_PROCESSING_REQUIRED; } NTSTATUS IrpFileRead( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER ByteOffset OPTIONAL, IN ULONG Length, OUT PVOID Buffer, OUT PIO_STATUS_BLOCK IoStatusBlock ) { NTSTATUS status; KEVENT event; PIRP irp; PIO_STACK_LOCATION irpSp; PDEVICE_OBJECT deviceObject; if (ByteOffset == NULL) { if (!(FileObject->Flags & FO_SYNCHRONOUS_IO)) return STATUS_INVALID_PARAMETER; ByteOffset = &FileObject->CurrentByteOffset; } if (FileObject->Vpb == 0 || FileObject->Vpb->RealDevice == NULL) return STATUS_UNSUCCESSFUL; deviceObject = FileObject->Vpb->DeviceObject; irp = IoAllocateIrp(deviceObject->StackSize, FALSE); if (irp == NULL) return STATUS_INSUFFICIENT_RESOURCES; irp->MdlAddress = IoAllocateMdl(Buffer, Length, FALSE, TRUE, NULL); if (irp->MdlAddress == NULL) { IoFreeIrp(irp); return STATUS_INSUFFICIENT_RESOURCES;; } MmBuildMdlForNonPagedPool(irp->MdlAddress); irp->Flags = IRP_READ_OPERATION; irp->RequestorMode = KernelMode; irp->UserIosb = IoStatusBlock; irp->UserEvent = &event; irp->Tail.Overlay.Thread = (PETHREAD)KeGetCurrentThread(); irp->Tail.Overlay.OriginalFileObject = FileObject; irpSp = IoGetNextIrpStackLocation(irp); irpSp->MajorFunction = IRP_MJ_READ; irpSp->MinorFunction = IRP_MN_NORMAL; irpSp->DeviceObject = deviceObject; irpSp->FileObject = FileObject; irpSp->Parameters.Read.Length = Length; irpSp->Parameters.Read.ByteOffset = *ByteOffset; KeInitializeEvent(&event, SynchronizationEvent, FALSE); IoSetCompletionRoutine(irp, IoCompletionRoutine, NULL, TRUE, TRUE, TRUE); status = IoCallDriver(deviceObject, irp); if (status == STATUS_PENDING) status = KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, NULL); return status; } NTSTATUS SpyCreate( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); PFILE_OBJECT FileObject = IrpSp->FileObject; PVOID ReadBuffer; IO_STATUS_BLCOK iosb; … If(MyFile){ ReadBuffer = ExAllocatePoolWithTag(NonPagedPool, 8, FALSE, TRUE, 0); If(!ReadBuffer) Return STATUS_INSUFFICIENT_RESOURCES; IrpFileRead(FileObject, 0 ,8 ,ReadBuffer , &iosb); DbgPrint(“Data:%s”,(PUCHAR)ReadBuffer) ; // 这里印出来变成 Data: 后面没有值 .... } } 请问我哪里少做,或是做错了? 请各位前辈指教 似乎都没有进去IoCompletionRoutine的样子 |
|
沙发#
发布于:2008-08-09 21:59
问题解决了! 要先PreCreate
然后在PreCreate 读就可以了 |
|
板凳#
发布于:2008-10-22 11:52
引用第1楼rong1028于2008-08-09 21:59发表的 : PreCreate 什么意思呢,不太懂?? |
|
地板#
发布于:2008-10-25 23:31
那位大哥能解释下什么意思的么 ?
|
|