阅读:1282回复:0
帮我看看我的这段代码。。。
实现功能: 在sfcreate中发送自己的irp(read)并得到数据
1. 在sfcreate中的得到全路径后调用(发送自建的irp) 运行调试的过程: 1. irp经过sfread、sfreadcomplete、SfIssueReadWriteIrpSynchronously、irpCompletion 2. 在sfread、sfreadcomplete、SfIssueReadWriteIrpSynchronously、irpCompletion中都能看到Buffer的长度,但是Buffer为空 3. 程序运行的过程,先后顺序 sfread->sfreadcomplete->SfIssueReadWriteIrpSynchronously>irpCompletion 4. Buffer为空,为什么??问题所在 5. ntfs下可以调试,fat下黑屏,我正在调试。。。 static NTSTATUS irpCompletion( PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context ) { UNREFERENCED_PARAMETER( DeviceObject ); UNREFERENCED_PARAMETER( Context ); KeSetEvent(Irp->UserEvent, 0, FALSE); // Signal event *Irp->UserIosb = Irp->IoStatus; // Copy status information to // the user KdPrint(("sfilter!irpCompletion[%s]\n", Irp->UserBuffer)); if (Irp->MdlAddress) { MmUnmapLockedPages( MmGetSystemAddressForMdl(Irp->MdlAddress), Irp->MdlAddress); MmUnlockPages(Irp->MdlAddress); IoFreeMdl(Irp->MdlAddress); } IoFreeIrp(Irp); // Free IRP return STATUS_MORE_PROCESSING_REQUIRED; // Tell the I/O manager to stop } NTSTATUS SfIssueReadWriteIrpSynchronously( IN PDEVICE_OBJECT DeviceObject, IN PFILE_OBJECT FileObject, IN ULONG MajorFunction, IN PIO_STATUS_BLOCK IoStatus, IN PVOID Buffer, IN ULONG Length, IN PLARGE_INTEGER ByteOffset, IN ULONG IrpFlags ) { PIRP Irp = NULL; PIO_STACK_LOCATION IrpSp = NULL; KEVENT Event; NTSTATUS Status; UNREFERENCED_PARAMETER( IrpFlags ); ASSERT((MajorFunction == IRP_MJ_READ) || (MajorFunction == IRP_MJ_WRITE)); KeInitializeEvent(&Event, NotificationEvent, FALSE); Irp = IoBuildAsynchronousFsdRequest( MajorFunction, DeviceObject, Buffer, Length, ByteOffset, //&Event, IoStatus ); if (!Irp) return STATUS_INSUFFICIENT_RESOURCES; Irp->Flags = IRP_NOCACHE ;//IRP_READ_OPERATION | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO;//IRP_PAGING_IO+IRP_NOCACHE+IRP_SYNCHRONOUS_PAGING_IO(0x43); Irp->RequestorMode = KernelMode; Irp->UserEvent = &Event; IrpSp = IoGetNextIrpStackLocation(Irp); IrpSp->FileObject = FileObject; IrpSp->DeviceObject = DeviceObject; KdPrint(("sfilter!SfIssueReadWriteIrpSynchronously: Length = [%d]\n", IrpSp->Parameters.Read.Length)); KdPrint(("sfilter!SfIssueReadWriteIrpSynchronously: ByteOffset = [%d]\n", IrpSp->Parameters.Read.ByteOffset)); IoSetCompletionRoutine(Irp, &irpCompletion, 0, TRUE, TRUE, TRUE); Status = IoCallDriver(DeviceObject, Irp); //Irp = NULL; if (STATUS_PENDING == Status) { KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); } KdPrint(("sfilter!SfIssueReadWriteIrpSynchronously[%s]\n",Buffer)); KdPrint(("sfilter!SfIssueReadWriteIrpSynchronously[%ws]\n",Buffer)); return IoStatus->Status; } NTSTATUS SfEncryptDecryptFileByFileObject( IN PDEVICE_OBJECT DeviceObject, IN PFILE_OBJECT FileObject ) { IO_STATUS_BLOCK IoStatus = {0}; NTSTATUS Status; PVOID Buffer = NULL; LARGE_INTEGER ByteOffset; ULONG Length = MARKLEN; LARGE_INTEGER OrigByteOffset; ByteOffset = FileObject->CurrentByteOffset; while(TRUE) { IoStatus.Status = STATUS_SUCCESS; IoStatus.Information = 0; Buffer = ExAllocatePool( NonPagedPool, Length ); if(Buffer == NULL) break; RtlZeroMemory(Buffer, MARKLEN ); RtlFillMemory(Buffer, MARKLEN-1, 'H'); *((PCHAR)(Buffer) + MARKLEN-1) = 0; OrigByteOffset = FileObject->CurrentByteOffset; Status = SfIssueReadWriteIrpSynchronously( DeviceObject, FileObject, IRP_MJ_READ, &IoStatus, Buffer, Length, &ByteOffset, 0 ); // Restore the original byte offset FileObject->CurrentByteOffset = OrigByteOffset; if (!NT_SUCCESS(Status)) { if (STATUS_END_OF_FILE == Status) { Status = STATUS_SUCCESS; KdPrint(("sfilter!SpyCreate: SfEncryptDecryptFileByFileObject: Status == STATUS_END_OF_FILE\n")); } break; } if (0 == IoStatus.Information) { KdPrint(("sfilter!SpyCreate: SfEncryptDecryptFileByFileObject: IoStatus.Information == 0 and %d\n", strlen(Buffer))); break; } break; } KdPrint(("sfilter!SfEncryptDecryptFileByFileObject: buffer: [%d][%s]\n", strlen(Buffer), Buffer)); if (Buffer != NULL) { ExFreePool( Buffer ); } return Status; } |
|