阅读:1292回复:0
关于IRP_MJ_READ中捕获读到的文件内容的问题!!!
按照楚狂人教程的..
SfRead() { ............ ........... ULONG length; length = irpsp->Parameters.Read.Length; 开始获取读取文件长度,装上驱动,dbg跟踪测试发现开始是0.............................................. KEVENT waitEvent; KeInitializeEvent( &waitEvent, NotificationEvent, FALSE ); IoCopyCurrentIrpStackLocationToNext ( Irp ); IoSetCompletionRoutine( Irp, SfReadCompletion, &waitEvent, TRUE, TRUE, TRUE ); status = IoCallDriver( devExt->AttachedToDeviceObject, Irp ); if (STATUS_PENDING == status) { status = KeWaitForSingleObject( &waitEvent, Executive, KernelMode, FALSE, NULL ); ASSERT( STATUS_SUCCESS == status ); } !!!到这里在print length长度信息,发现值变了,我打开一个文件测试, 到这里length就变成一个非零的值了..有次是24,有次是512.... 完成例程后怎么会改变原来线程的变量值呢? switch(irpsp->MiniorFunction) { case IRP_MN_NORMAL: { Void *buffer; if(Irp->MdlAddress != NULL) buffer = MmGetSystemAddressForMdlSafe(irp->MdlAddress,NormalPagePriority) else 测试过程程序走了这个else分支.................................................................................................................. buffer = Irp->UserBuffer; 我在这里打印buffer发现出的结果竟然开头正确后面乱码.................................................................................................. Irp->IoStatus.Information = length; Irp-> IoStatus.Status = STATUS_SUCCESS; Irp->FileObject->CurrentByteOffset.Quat = offset.Quat+length; IoCompleteRequest( Irp, IO_NO_INCREMENT ); return STATUS_SUCCESS; } case IRP_MN_MDL: { PMDL mdl = MyMdlMemoryAllocate (length); // if(mdl == NULL) { } Irp->MdlAddress = mdl;; Irp->IoStatus.Information = length; Irp-> IoStatus.Status = STATUS_SUCCESS; Irp->FileObject->CurrentByteOffset.Quat = offset.Quat+l IoCompleteRequest( Irp, IO_NO_INCREMENT ); return STATUS_SUCCESS; } case IRP_MN_MDL_COMPLETE: { Irp->IoStatus.Information = length; Irp-> IoStatus.Status = STATUS_SUCCESS; Irp->FileObject->CurrentByteOffset.Quat = offset.Quat+l IoCompleteRequest( Irp, IO_NO_INCREMENT ); return STATUS_SUCCESS; } default: { } } SfReadCompletion() { .............................. } 出了上面的问题还有几个地方不理解. 1:关于教程说文件指针要偏移的问题. 我的理解是Irp从底层返回上来,我只是打印其缓存中的数据, 都成功返回到这里了,难道底层驱动没改文件指针? 2:完成例程结束后,返回到原来的read例程, 那么read里面原来旧的irp和完成例程后的irp是一个么?还是说irp唯一,但是每层驱动都创建一个iostack栈? 3:irp包和每层驱动对其数据处理的详细流程谁能讲下啊,给个链接也行 |
|
最新喜欢:![]() |