luckyshow00
驱动牛犊
驱动牛犊
  • 注册日期2007-03-12
  • 最后登录2008-11-24
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望36点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
阅读:2164回复:19

KeWaitForSingleObject

楼主#
更多 发布于:2007-07-04 13:00
NTSTATUS SfReadCompletion(IN PDEVICE_OBJECT DeviceObject,
                        IN PIRP Irp,
                        IN PVOID Context)
{
    PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
    

    UNREFERENCED_PARAMETER( Context );
    UNREFERENCED_PARAMETER( DeviceObject );
    
    ASSERT(IS_MY_DEVICE_OBJECT( DeviceObject ));
    
    KeSetEvent((PKEVENT)Context, IO_NO_INCREMENT, FALSE);
    return STATUS_MORE_PROCESSING_REQUIRED;
    //如果换成 return STATUS_SUCCESS;在输入密码完成后,进如系统时重起
};
NTSTATUS SfRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
    PIO_STACK_LOCATION irpsp = IoGetCurrentIrpStackLocation(Irp);
    PFILE_OBJECT file_object = irpsp->FileObject;
    PSFILTER_DEVICE_EXTENSION devExt = DeviceObject->DeviceExtension;
    NTSTATUS Status = STATUS_SUCCESS;
    ULONG IsFile = 0;
    
    KEVENT waitEvent;
    

    PAGED_CODE();
     // 对控制设备的操作,返回成功?
    if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject)) {



            Irp->IoStatus.Status = STATUS_SUCCESS;
            Irp->IoStatus.Information = 0;
            IoCompleteRequest( Irp, IO_NO_INCREMENT );
            return STATUS_SUCCESS;;


     }
    // 对文件系统其他设备的操作,passthru.
    
    if (!devExt->StorageStackDeviceObject)
    {
        IoSkipCurrentIrpStackLocation(Irp);
        return IoCallDriver(devExt->AttachedToDeviceObject, Irp);
    }
    
    if (!(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO)))
    {
        IoSkipCurrentIrpStackLocation(Irp);
        return IoCallDriver(devExt->AttachedToDeviceObject, Irp);
    }
    

        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 );
    }

        return Status;

};
编译环境:Windows IFS Kit and DDK 3790 Windows 2000 Free Build Environment
运行环境:Win2000 Professional Sp4
症状:在登陆截面的时候,就是出现Win2k的画面时,进度条走到大概3/4的时候就停了,一直不动了
但这个在xp下又没有问题
请问是怎么回事啊?
先谢谢大家啦!
luckyshow00
驱动牛犊
驱动牛犊
  • 注册日期2007-03-12
  • 最后登录2008-11-24
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望36点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-07-04 13:20
用了IoSetCompletionRoutine这个,还需要设置completerequest么?
luckyshow00
驱动牛犊
驱动牛犊
  • 注册日期2007-03-12
  • 最后登录2008-11-24
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望36点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-07-04 13:52
不对吧,加了之后,BugChk
MULTIPLE_IRP_COMPLETE_REQUEST
luckyshow00
驱动牛犊
驱动牛犊
  • 注册日期2007-03-12
  • 最后登录2008-11-24
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望36点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-07-04 14:07
NTSTATUS SfRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
    PIO_STACK_LOCATION irpsp = IoGetCurrentIrpStackLocation(Irp);
    PFILE_OBJECT file_object = irpsp->FileObject;
    PSFILTER_DEVICE_EXTENSION devExt = DeviceObject->DeviceExtension;
    NTSTATUS Status = STATUS_SUCCESS;
    ULONG IsFile = 0;
    
    KEVENT waitEvent;
    

    PAGED_CODE();
    // 对控制设备的操作,返回成功?
    if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject)) {



            Irp->IoStatus.Status = STATUS_SUCCESS;
            Irp->IoStatus.Information = 0;
            IoCompleteRequest( Irp, IO_NO_INCREMENT );
            return STATUS_SUCCESS;;


    }
    // 对文件系统其他设备的操作,passthru.
    
    if (!devExt->StorageStackDeviceObject)
    {
        IoSkipCurrentIrpStackLocation(Irp);
        return IoCallDriver(devExt->AttachedToDeviceObject, Irp);
    }
    
    if (!(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO)))
    {
        IoSkipCurrentIrpStackLocation(Irp);
        return IoCallDriver(devExt->AttachedToDeviceObject, Irp);
    }
    

        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 );
    }
    //加了3句话
Irp->IoStatus.Status = STATUS_SUCCESS;
            Irp->IoStatus.Information = 0;
            IoCompleteRequest( Irp, IO_NO_INCREMENT );


        return Status;

};
luckyshow00
驱动牛犊
驱动牛犊
  • 注册日期2007-03-12
  • 最后登录2008-11-24
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望36点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-07-04 14:09
我用sfilter改的
luckyshow00
驱动牛犊
驱动牛犊
  • 注册日期2007-03-12
  • 最后登录2008-11-24
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望36点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-07-04 14:28
没有效果....同样在输入密码完成后,系统重起
NTSTATUS SfReadCompletion(IN PDEVICE_OBJECT DeviceObject,
                        IN PIRP Irp,
                        IN PVOID Context)
{
    PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
    
    UNREFERENCED_PARAMETER( DeviceObject );
    
    ASSERT(IS_MY_DEVICE_OBJECT( DeviceObject ));
    
    if(Context) KeSetEvent((PKEVENT)Context, IO_NO_INCREMENT, FALSE);
    return STATUS_SUCCESS;
};
NTSTATUS SfRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
    PIO_STACK_LOCATION irpsp = IoGetCurrentIrpStackLocation(Irp);
    PFILE_OBJECT file_object = irpsp->FileObject;
    PSFILTER_DEVICE_EXTENSION devExt = DeviceObject->DeviceExtension;
    NTSTATUS Status = STATUS_SUCCESS;
    ULONG IsFile = 0;
    
    KEVENT waitEvent;
    

    PAGED_CODE();
     // 对控制设备的操作,返回成功?
    if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject)) {



            Irp->IoStatus.Status = STATUS_SUCCESS;
            Irp->IoStatus.Information = 0;
            IoCompleteRequest( Irp, IO_NO_INCREMENT );
            return STATUS_SUCCESS;;


     }
    // 对文件系统其他设备的操作,passthru.
    
    if (!devExt->StorageStackDeviceObject)
    {
        IoSkipCurrentIrpStackLocation(Irp);
        return IoCallDriver(devExt->AttachedToDeviceObject, Irp);
    }
    
    if (!(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO)))
    {
        IoSkipCurrentIrpStackLocation(Irp);
        return IoCallDriver(devExt->AttachedToDeviceObject, Irp);
    }
    

  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 );
    }
  return Status;

};
luckyshow00
驱动牛犊
驱动牛犊
  • 注册日期2007-03-12
  • 最后登录2008-11-24
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望36点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-07-04 14:42
安全模式下,又冒似没有问题,驱动正常
luckyshow00
驱动牛犊
驱动牛犊
  • 注册日期2007-03-12
  • 最后登录2008-11-24
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望36点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-07-05 10:55
大哥些,进来看下嘛
游客

返回顶部