matrix2009
驱动牛犊
驱动牛犊
  • 注册日期2009-09-01
  • 最后登录2011-07-25
  • 粉丝0
  • 关注1
  • 积分20分
  • 威望151点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1609回复:2

如何在SCSI派遣函数中发送自定义的srb?

楼主#
更多 发布于:2009-10-09 10:29
最近在做一个U盘过滤驱动,想根据U盘扇区的某个标识实现禁用U盘的功能。
现在禁用U盘实现了,读取U盘扇区还没有成功。
过滤驱动挂在注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}下, 要在SCSI的派遣函数里禁用,我想在禁用之前读取U盘扇区,需要自己构造srb发给下层驱动,但是不知道具体怎么写?
请大家指点一下
matrix2009
驱动牛犊
驱动牛犊
  • 注册日期2009-09-01
  • 最后登录2011-07-25
  • 粉丝0
  • 关注1
  • 积分20分
  • 威望151点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-10-09 10:54
自己写了一段 不知道行不行
matrix2009
驱动牛犊
驱动牛犊
  • 注册日期2009-09-01
  • 最后登录2011-07-25
  • 粉丝0
  • 关注1
  • 积分20分
  • 威望151点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-10-09 10:55
srb = (PSCSI_REQUEST_BLOCK)ExAllocatePool(NonPagedPool,sizeof(SCSI_REQUEST_BLOCK));
    if(!srb)
        break;
    sense = (PSENSE_DATA)ExAllocatePool(NonPagedPool,sizeof(SENSE_DATA));
    psense=sense;
    if(!sense)
        break;
    memset(srb,0,sizeof(SCSI_REQUEST_BLOCK));
    memset(sense,0,sizeof(SENSE_DATA));

    srb->Length=sizeof(SCSI_REQUEST_BLOCK);
    srb->Function=0;
    srb->DataBuffer=buffer;
    srb->DataTransferLength=BlockCount<<9;    //sector size*number of sector
    srb->QueueAction=SRB_FLAGS_DISABLE_AUTOSENSE;
    srb->SrbStatus=0;
    srb->ScsiStatus=0;
    srb->NextSrb=0;
    srb->SenseInfoBuffer=sense;
    srb->SenseInfoBufferLength=sizeof(SENSE_DATA);

    srb->SrbFlags=SRB_FLAGS_DATA_IN;    
    srb->SrbFlags|=SRB_FLAGS_ADAPTER_CACHE_ENABLE;

    srb->SrbFlags|=SRB_FLAGS_DISABLE_AUTOSENSE;
    srb->TimeOutValue=(srb->DataTransferLength>>10)+1;
    srb->QueueSortKey=DiskPos;
    srb->CdbLength=10;
    srb->Cdb[0] = SCSIOP_READ;
    srb->Cdb[1] = srb->Cdb[1] & 0x1F | 0x80;
    srb->Cdb[2] = (unsigned char)(DiskPos>>0x18)&0xFF;    //
    srb->Cdb[3] = (unsigned char)(DiskPos>>0x10)&0xFF;    //
    srb->Cdb[4] = (unsigned char)(DiskPos>>0x08)&0xFF;    //
    srb->Cdb[5] = (UCHAR)DiskPos;          //填写sector位置
    srb->Cdb[7] = (UCHAR)BlockCount>>0x08;
    srb->Cdb[8] = (UCHAR)BlockCount;
游客

返回顶部