阅读:1609回复:2
如何在SCSI派遣函数中发送自定义的srb?
最近在做一个U盘过滤驱动,想根据U盘扇区的某个标识实现禁用U盘的功能。
现在禁用U盘实现了,读取U盘扇区还没有成功。 过滤驱动挂在注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}下, 要在SCSI的派遣函数里禁用,我想在禁用之前读取U盘扇区,需要自己构造srb发给下层驱动,但是不知道具体怎么写? 请大家指点一下 |
|
沙发#
发布于:2009-10-09 10:54
自己写了一段 不知道行不行
|
|
板凳#
发布于: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; |
|