KernelSword
驱动牛犊
驱动牛犊
  • 注册日期2007-07-13
  • 最后登录2014-02-20
  • 粉丝5
  • 关注0
  • 积分322分
  • 威望161点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
阅读:1710回复:3

帮忙看看

楼主#
更多 发布于:2008-06-24 14:36
我想自己发送SCSIOP_WRITE,总是不成功,为什么

NTSTATUS
MyScsiWriteCompletion (
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PKEVENT SynchronizingEvent
    )
{
    *Irp->UserIosb = Irp->IoStatus;
    if (STATUS_SUCCESS != Irp->IoStatus.Status) {
        dprintf("[UsbFilter] MyScsiWriteCompletion : FAILED.\n");
    }
        
    KeSetEvent( SynchronizingEvent, IO_NO_INCREMENT, FALSE );
    
    IoFreeIrp( Irp );
    
    return STATUS_MORE_PROCESSING_REQUIRED;
}

BOOL
MyScsiWriteIRP(
    IN PDEVICE_OBJECT NextDeviceObject,
    IN PBYTE pBuffer
    )
{
    PIRP                irp = NULL;
    PIO_STACK_LOCATION    irpSp = NULL;
    IO_STATUS_BLOCK        ioStatusBlock;
    KEVENT                event;
    NTSTATUS            status;

    SCSI_REQUEST_BLOCK    Srb;
    PCDB                cdb;
    PVOID                Buffer;

    Buffer = ExAllocateFromNPagedLookasideList(&g_CtxLookAsideList);
    RtlCopyMemory(Buffer, pBuffer, 512);

    RtlZeroMemory(&Srb, sizeof(SCSI_REQUEST_BLOCK));
    Srb.Length                = SCSI_REQUEST_BLOCK_SIZE;
    Srb.Function            = SRB_FUNCTION_EXECUTE_SCSI;
    Srb.QueueAction            = 0x20;
    Srb.CdbLength            = 0x0A;
    Srb.SrbFlags            = 0x200280;
    Srb.DataTransferLength    = 512;
    Srb.TimeOutValue        = 10;
    Srb.Cdb[0]                = SCSIOP_WRITE;
    Srb.Cdb[8]                = 0x01;
    Srb.DataBuffer            = Buffer;
            
    KeInitializeEvent( &event, NotificationEvent, FALSE );
    ioStatusBlock.Status        = STATUS_SUCCESS;
    ioStatusBlock.Information    = 0;
    
    irp = IoAllocateIrp( NextDeviceObject->StackSize, FALSE );        
    irp->Tail.Overlay.Thread    = PsGetCurrentThread();    
    irp->RequestorMode            = KernelMode;    
    irp->UserIosb                = &ioStatusBlock;
    irp->UserEvent                = NULL;    
    irp->Flags                    = IRP_SYNCHRONOUS_API;
    
    irpSp                        = IoGetNextIrpStackLocation( irp );    
    irpSp->MajorFunction        = IRP_MJ_SCSI ;
    irpSp->MinorFunction        = 0;
    irpSp->Parameters.Scsi.Srb    = &Srb;

    IoSetCompletionRoutine( irp,
        MyScsiWriteCompletion,
        &event,
        TRUE,
        TRUE,
        TRUE );    
    status = IoCallDriver( NextDeviceObject, irp );
    
    if (STATUS_PENDING == status) {        
        KeWaitForSingleObject( &event,
            Executive,
            KernelMode,
            FALSE,
            NULL );
    }

    ExFreeToNPagedLookasideList(&g_CtxLookAsideList, Buffer);
        
    return NT_SUCCESS(ioStatusBlock.Status);
}


在IRP_MJ_SISC例程中SCSIOP_WRITE操作中
                KeInitializeEvent(&Event, NotificationEvent, FALSE);
                IoCopyCurrentIrpStackLocationToNext(Irp);
                IoSetCompletionRoutine(Irp,
                    (PIO_COMPLETION_ROUTINE)FilterScsiReadWriteCompletionRoutine,
                    &Event,
                    TRUE,
                    TRUE,
                    TRUE);
                status = IoCallDriver(deviceExtension->NextLowerDriver, Irp);
                if (STATUS_PENDING == status) {
                    KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
                    status = Irp->IoStatus.Status;
                }
                MyScsiWriteIRP(deviceExtension->NextLowerDriver, Buffer);

意思就是在SCSIOP_WRITE完成后自己再发送一个WRITE,为什么总是失败啊,能给指点下吗
QQ:606140 www.kernelsword.com
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-07-07 14:19
What's the error?
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2008-07-07 14:27
又写机器狗?没用的
驱动开发者 呵呵
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
地板#
发布于:2008-07-07 14:50
你怎么知道人是机器狗,不会是机器猫?
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
游客

返回顶部