bestvista
驱动牛犊
驱动牛犊
  • 注册日期2008-01-29
  • 最后登录2010-04-30
  • 粉丝0
  • 关注0
  • 积分106分
  • 威望51点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
阅读:1292回复:0

关于IRP_MJ_READ中捕获读到的文件内容的问题!!!

楼主#
更多 发布于:2009-06-25 21:26
按照楚狂人教程的..

 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包和每层驱动对其数据处理的详细流程谁能讲下啊,给个链接也行

最新喜欢:

rhpengrhpeng
游客

返回顶部