czcty
驱动牛犊
驱动牛犊
  • 注册日期2004-11-04
  • 最后登录2006-11-08
  • 粉丝0
  • 关注0
  • 积分100分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
阅读:858回复:1

请帮我解释一下这个DispatchRead例程

楼主#
更多 发布于:2005-01-25 11:46
NTSTATUS DispatchRead (
IN PDEVICE_OBJECT pDevObj,
IN PIRP pIrp ) {


NTSTATUS status = STATUS_SUCCESS;
PVOID userBuffer; //DebugView 输出 userBuffer 是一个字符串 PVOID 是什么数据类型?
ULONG xferSize;
// The stack location contains the user buffer info
PIO_STACK_LOCATION pIrpStack =
IoGetCurrentIrpStackLocation( pIrp );
// Dig out the Device Extension from the Device object
PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
pDevObj->DeviceExtension;
// Determine the length of the request
xferSize = pIrpStack->Parameters.Read.Length;
// Obtain user buffer pointer
userBuffer = pIrp->AssociatedIrp.SystemBuffer;

// Don't transfer more than the user's request
xferSize = (xferSize < pDevExt->deviceBufferSize) ?
xferSize : pDevExt->deviceBufferSize;
// Now copy the pool buffer into user space
// 把需要的读数据copy到 useBuffer 中
RtlCopyMemory( userBuffer, pDevExt->deviceBuffer,
xferSize );//这样拷贝到内存中,API调用该例程,如何得到数据? userBuffer是一个指针码?在这里如果用pIrp->AssociatedIrp.SystemBuffer 代替userBuffer 可以?
#ifdef DEBUGMSG
     DbgPrint( "\n*******************\n");
          DbgPrint( "%d", pDevExt->deviceBufferSize);
  DbgPrint( "%s", pDevExt->deviceBuffer);
 DbgPrint( "\n*******************\n");
#endif
// Free the temporary pool buffer
ExFreePool( pDevExt->deviceBuffer );// 释放内存 读出之后就释放出来
pDevExt->deviceBuffer = NULL;
pDevExt->deviceBufferSize = 0;

// Now complete the IRP
pIrp->IoStatus.Status = status;
pIrp->IoStatus.Information = xferSize; // bytes xfered
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
return status;
}

最新喜欢:

rhpengrhpeng
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-25 12:13
//DebugView 输出 userBuffer 是一个字符串 PVOID 是什么数据类型?
是PVOID  “void *”的意思
RtlCopyMemory( userBuffer, pDevExt->deviceBuffer,
xferSize );//这样拷贝到内存中,API调用该例程,如何得到数据? userBuffer是一个指针码?在这里如果用pIrp->AssociatedIrp.SystemBuffer 代替userBuffer 可以?
对,userBuffer是一个指针
pIrp->AssociatedIrp.SystemBuffer 和userBuffer ,具体看使用什么方式
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
游客

返回顶部