steven_kane
驱动牛犊
驱动牛犊
  • 注册日期2002-12-22
  • 最后登录2009-10-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1125回复:1

紧急求助,缓冲区无效

楼主#
更多 发布于:2003-05-03 23:44
我写了一个简单的调用IRP_MJ_WRITE的例程 ,对应的函数为
NTSTATUS DispatchWrite( IN PDEVICE_OBJECT pObject, IN PIRP pIrp)
{
   NTSTATUS status;
   DEVICE_EXTENSION* pDevExt  =  (DEVICE_EXTENSION*)pObject->DeviceExtension ;
 
   if( pDevExt->devBuffer!=NULL )
   {  ExFreePool( pDevExt->devBuffer )  ;  pDevExt->devBuffer=NULL; pDevExt->devBufferSize=0;  }

   IO_STACK_LOCATION* stl= IoGetCurrentIrpStackLocation( pIrp );
 
   ULONG userbuffersize = stl->Parameters.Write.Length;
  
   void * userbuffer  = pIrp->AssociatedIrp.SystemBuffer;

   if( userbuffer == NULL )
   {  status= STATUS_INSUFFICIENT_RESOURCES;
      userbuffersize=0;
      goto next;
   }

   pDevExt->devBuffer  =  ExAllocatePool(PagedPool, userbuffersize );

   if( pDevExt->devBuffer == NULL )
   {  
     status= STATUS_INSUFFICIENT_RESOURCES;      userbuffersize=0;
   }
   else
   {
       pDevExt->devBufferSize = userbuffersize ;
       RtlCopyMemory( pDevExt->devBuffer , userbuffer , userbuffersize ) ;
       status = STATUS_SUCCESS;

   }

next:

   pIrp->IoStatus.Status=status;
   pIrp->IoStatus.Information = userbuffersize;
   IoCompleteRequest( pIrp, IO_NO_INCREMENT );
  

return status;
}

我在测试程序中调用WriteFile() ,可在DispatchWrite()中 pIrp->AssociatedIrp.SystemBuffer 总是 为 0x00000000 ,  请各位大虾帮我看一下,我在初始化中设置

pObject->Flags  |= DO_BUFFERED_IO ;

////我的测试///
 DWORD outCount;
 int outBuffer[5]={1,2,3,4,5};
  outCount=sizeof(int) * 5 ;
  DWORD bW;
   WriteFile(handle,outBuffer,outCount,&bW,NULL);
    
lu0
lu0
论坛版主
论坛版主
  • 注册日期2001-06-10
  • 最后登录2016-04-05
  • 粉丝2
  • 关注0
  • 积分-6311分
  • 威望21111点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-05-05 23:49
在某些情况下确实如此. 如果BUFFER过大,IO MANAGER可能会使用MDL来解决内存使用问题. 我曾经碰到过. 不过MDL要比SYSTEM BUFFER强多了.
Regards, Lu Lin Webmaster of Inside Programming http://www.lu0s1.com
游客

返回顶部