dionysus77
驱动小牛
驱动小牛
  • 注册日期2006-11-15
  • 最后登录2011-12-18
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望392点
  • 贡献值0点
  • 好评度177点
  • 原创分0分
  • 专家分0分
阅读:1171回复:3

自己的creat向自己的write发irp的三种情况?

楼主#
更多 发布于:2007-04-25 19:53
  如果在自己的creat历程中向自己的write发送一个IRP,会怎样呢?

A。驱动处理完creat的全部代码,才处理write?
B。驱动处理完creat引起的write,再返回处理creat的后续代码?
C。驱动同时并行处理creat和write?
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
沙发#
发布于:2007-04-26 08:09
1.如果create没有成功返回之前(FILE_OBJECT还未建立)发送write则异常;
2.如果create成功返回之后(FILE_OBJECT已经建立)发送write则又分两种情况:
   同步和异步WRITE IRP;
人总在矛盾中徘徊。。。
dionysus77
驱动小牛
驱动小牛
  • 注册日期2006-11-15
  • 最后登录2011-12-18
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望392点
  • 贡献值0点
  • 好评度177点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-04-26 14:36
引用第1楼devia2007-04-26 08:09发表的“”:
1.如果create没有成功返回之前(FILE_OBJECT还未建立)发送write则异常;
2.如果create成功返回之后(FILE_OBJECT已经建立)发送write则又分两种情况:
   同步和异步WRITE IRP;


我创建异步irp,想实现同步功能,主要代码如下:

发送:
Irp = IoBuildAsynchronousFsdRequest();

IrpSp = IoGetNextIrpStackLocation(Irp);
IrpSp->FileObject = FileObject;
Irp->Flags = 0x43;//三种不过虑标志
    
KeInitializeEvent(&Event, NotificationEvent, FALSE);
IoSetCompletionRoutine(Irp,MyIrpComplete,&Event,TRUE,TRUE,TRUE);

Status = IoCallDriver(DeviceObject, Irp);
if(Status == STATUS_PENDING)
        KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
    
return IoStatus->Status;

完成:
 if (Irp->MdlAddress)
{
        MmUnmapLockedPages(MmGetSystemAddressForMdl(Irp->MdlAddress),Irp->MdlAddress);
        MmUnlockPages(Irp->MdlAddress);
        IoFreeMdl(Irp->MdlAddress);
}

IoFreeIrp(Irp);
    
if (Irp->PendingReturned)
{
       KeSetEvent(Event, IO_NO_INCREMENT, FALSE);
}

return STATUS_MORE_PROCESSING_REQUIRED;


我的问题是:等待和设置同步事件是不是一定要判断Status == STATUS_PENDING 和 Irp->PendingReturned?
tracera
禁止发言
禁止发言
  • 注册日期2006-01-09
  • 最后登录2018-09-25
  • 粉丝8
  • 关注0
  • 积分-5788分
  • 威望135321点
  • 贡献值0点
  • 好评度625点
  • 原创分1分
  • 专家分0分
  • 社区居民
地板#
发布于:2007-04-29 17:48
用户被禁言,该主题自动屏蔽!
游客

返回顶部