Hi all,
I’m trying to write a StorPort driver according to example from
http://www.osronline.com/article.cfm?article=538. The difference is the
example is a virtual StorPort driver, mine is a non-virtual StorPort
driver. When I handle SCSIOP_INQUIRY, I used the following code:
case SCSIOP_INQUIRY:
{// 0x12
PCDB pCdb = (PCDB) &PSrb->Cdb;
PUCHAR pBuffer = (PUCHAR)
OsrSpGetSrbDataAddress(PSrb,DeviceExtension);
PINQUIRYDATA pInquiryData;
if(!pBuffer || PSrb->DataTransferLength < INQUIRYDATABUFFERSIZE) {
PSrb->SrbStatus = SRB_STATUS_ERROR;
return;
}
// We don’t support this, so abort the request.
//
if(pCdb->CDB6INQUIRY3.EnableVitalProductData) {
DebugPrint((1,“SCSIOP_INQUIRY: EVPD bit set, not
supported.\n”));
ProcessScsiCommandError(PSrb);
return;
}
//
// If the evpd bit is not set, PageCode better be 0.
//
if(pCdb->CDB6INQUIRY3.PageCode) {
DebugPrint((1,“SCSIOP_INQUIRY: EVPD bit not set, PageCode not
0. Error.\n”));
ProcessScsiCommandError(PSrb);
return;
}
pInquiryData = (PINQUIRYDATA) pBuffer;
//
// Zero out the buffer before filling it in.
//
memset(pInquiryData,0,PSrb->DataTransferLength);
pInquiryData->DeviceType = DIRECT_ACCESS_DEVICE;
pInquiryData->DeviceTypeQualifier = DEVICE_CONNECTED;
pInquiryData->DeviceTypeModifier = 0;
pInquiryData->RemovableMedia = TRUE;
pInquiryData->Versions = 2; // SCSI-2 support
pInquiryData->ResponseDataFormat = 2; // Same as Version??
according to SCSI book
pInquiryData->Wide32Bit = TRUE; // 32 bit wide transfers
pInquiryData->Synchronous = TRUE; // Synchronous commands
pInquiryData->CommandQueue = FALSE; // Does not support tagged
commands
pInquiryData->AdditionalLength = INQUIRYDATABUFFERSIZE-5; //
Amount of data we are returning
pInquiryData->LinkedCommands = FALSE; // No Linked Commands
StorPortMoveMemory((PUCHAR)
&pInquiryData->VendorId[0],OSR_INQUIRY_VENDOR_ID,
strlen(OSR_INQUIRY_VENDOR_ID));
StorPortMoveMemory((PUCHAR)
&pInquiryData->ProductId[0],OSR_INQUIRY_PRODUCT_ID,
strlen(OSR_INQUIRY_PRODUCT_ID));
StorPortMoveMemory((PUCHAR)
&pInquiryData->ProductRevisionLevel[0],OSR_INQUIRY_PRODUCT_REVISION,
strlen(OSR_INQUIRY_PRODUCT_REVISION));
//
// INQUIRYDATABUFFERSIZE does not account for us sending back this,
so we won’t
// if you do, you’ll overrun the buffer and get a verifier crash…
//
//Irp->IoStatus.Information = sizeof(INQUIRYDATA);
PSrb->SrbStatus = SRB_STATUS_SUCCESS;
PSrb->DataTransferLength = INQUIRYDATABUFFERSIZE;
DebugPrint((1,“Handle SCSIOP_INQUIRY successfully!\n”));
break;
}
After my driver is loaded, system create a new SCSI Disk Device in device
manager. However, there is question mark on its icon. I checked the
property of this device and the ‘Hardware Ids’ is as below:
SCSI\Disk____________________________
SCSI\Disk________________________
SCSI\Disk________
SCSI________________________
Could you let me know what the problem is ?
Thanks.
Marvin