首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

UsbStorage驱动开发(三)[原创]

UsbStorage驱动开发(二)

在UsbStorage驱动开发(二)文章结尾处有说处理IRP_MJ_DEVICE_CONTROL中的IOCTL_STORAGE_QUERY_PROPERTY,IOCTL_SCSI_PASS_THROUGH,IOCTL_SCSI_PASS_THROUGH_DIRECT,请问怎么处理,谢谢!![em02]
不断追求,坚持不懈,迎难而上。
请帮我分析IOCTL_STORAGE_QUERY_PROPERTY,IOCTL_SCSI_PASS_THROUGH,IOCTL_SCSI_PASS_THROUGH_DIRECT,还有IRP_MJ_DEVICE_CONTROL要处理哪些。
不断追求,坚持不懈,迎难而上。
请问处理IOCTL_STORAGE_QUERY_PROPERTY是否有问题?

case IOCTL_STORAGE_QUERY_PROPERTY: //0x2d1400

query = (PSTORAGE_PROPERTY_QUERY)ioBuffer;
header = (PSTORAGE_DESCRIPTOR_HEADER)ioBuffer;

if ((query->PropertyId == StorageAdapterProperty) && (query->QueryType == PropertyStandardQuery))
{
if (outputBufferLength >= sizeof(STORAGE_DESCRIPTOR_HEADER))
{
header->Version = sizeof(STORAGE_ADAPTER_DESCRIPTOR);//1
header->Size = sizeof(STORAGE_ADAPTER_DESCRIPTOR);
Irp->IoStatus.Information = outputBufferLength;//sizeof(STORAGE_DESCRIPTOR_HEADER);
ntStatus = STATUS_SUCCESS;
BulkUmss_DbgPrint(MidDbgLevel,("sizeof(STORAGE_DESCRIPTOR_HEADER)= %d\n",sizeof(STORAGE_DESCRIPTOR_HEADER)));
}

if (outputBufferLength >= sizeof(STORAGE_ADAPTER_DESCRIPTOR))
{
adapterDescriptor = (PSTORAGE_ADAPTER_DESCRIPTOR)header;

adapterDescriptor->MaximumTransferLength = 0x10 * PAGE_SIZE;
adapterDescriptor->MaximumPhysicalPages = 0x10;
adapterDescriptor->AlignmentMask = 1;
adapterDescriptor->AdapterUsesPio = TRUE;
adapterDescriptor->AdapterScansDown = FALSE;
adapterDescriptor->CommandQueueing = FALSE;
adapterDescriptor->AcceleratedTransfer = FALSE;
adapterDescriptor->BusType = BusTypeUsb;//BusTypeScsi
adapterDescriptor->BusMajorVersion = 1;
adapterDescriptor->BusMinorVersion = 0;

Irp->IoStatus.Information = outputBufferLength;//sizeof(STORAGE_ADAPTER_DESCRIPTOR);
ntStatus = STATUS_SUCCESS;
BulkUmss_DbgPrint(MidDbgLevel,("sizeof(STORAGE_ADAPTER_DESCRIPTOR) = %d\n",sizeof(STORAGE_ADAPTER_DESCRIPTOR)));
}
}
else if ((query->PropertyId == StorageDeviceProperty) && (query->QueryType == PropertyStandardQuery))
{
if (outputBufferLength >= sizeof(STORAGE_DESCRIPTOR_HEADER))
{
header->Version = sizeof(STORAGE_DEVICE_DESCRIPTOR); //1
header->Size = sizeof(STORAGE_DEVICE_DESCRIPTOR);

Irp->IoStatus.Information = outputBufferLength;//sizeof(STORAGE_DESCRIPTOR_HEADER);
ntStatus = STATUS_SUCCESS;
BulkUmss_DbgPrint(MidDbgLevel,("sizeof(STORAGE_DESCRIPTOR_HEADER)= %d\n",sizeof(STORAGE_DESCRIPTOR_HEADER)));
}

if (outputBufferLength >= sizeof(STORAGE_DEVICE_DESCRIPTOR))
{
deviceDescriptor = (PSTORAGE_DEVICE_DESCRIPTOR)header;

deviceDescriptor->DeviceType = DIRECT_ACCESS_DEVICE;//FILE_DEVICE_MASS_STORAGE
deviceDescriptor->DeviceTypeModifier = 0;
deviceDescriptor->RemovableMedia = TRUE;
deviceDescriptor->CommandQueueing = FALSE;
deviceDescriptor->VendorIdOffset = FIELD_OFFSET(STORAGE_DEVICE_DESCRIPTOR,VendorIdOffset);
deviceDescriptor->ProductIdOffset = FIELD_OFFSET(STORAGE_DEVICE_DESCRIPTOR,ProductIdOffset);
deviceDescriptor->ProductRevisionOffset = FIELD_OFFSET(STORAGE_DEVICE_DESCRIPTOR,ProductRevisionOffset);
deviceDescriptor->SerialNumberOffset = FIELD_OFFSET(STORAGE_DEVICE_DESCRIPTOR,SerialNumberOffset);
deviceDescriptor->BusType = BusTypeUsb;
deviceDescriptor->RawPropertiesLength = 0;

/*
fdoExtension = (PDEVICE_EXTENSION)pdoExtension->ParentFdo->DeviceExtension;
pInquiryBuf = fdoExtension->InquiryData;

deviceDescriptor = (PSTORAGE_DEVICE_DESCRIPTOR)header;

deviceDescriptor->DeviceType = pInquiryBuf->DeviceType;//DIRECT_ACCESS_DEVICE;//FILE_DEVICE_MASS_STORAGE
deviceDescriptor->DeviceTypeModifier = pInquiryBuf->DeviceTypeModifier;//0;
deviceDescriptor->RemovableMedia = pInquiryBuf->RemovableMedia;//TRUE;
deviceDescriptor->CommandQueueing = pInquiryBuf->CommandQueue;//FALSE;
deviceDescriptor->VendorIdOffset = FIELD_OFFSET(STORAGE_DEVICE_DESCRIPTOR,VendorIdOffset);
deviceDescriptor->ProductIdOffset = FIELD_OFFSET(STORAGE_DEVICE_DESCRIPTOR,ProductIdOffset);
deviceDescriptor->ProductRevisionOffset = FIELD_OFFSET(STORAGE_DEVICE_DESCRIPTOR,ProductRevisionOffset);
deviceDescriptor->SerialNumberOffset = FIELD_OFFSET(STORAGE_DEVICE_DESCRIPTOR,SerialNumberOffset);
deviceDescriptor->BusType = BusTypeUsb;
deviceDescriptor->RawPropertiesLength = 0;
*/

Irp->IoStatus.Information = outputBufferLength;
ntStatus = STATUS_SUCCESS;

BulkUmss_DbgPrint(MidDbgLevel,("sizeof(STORAGE_DEVICE_DESCRIPTOR)=%d\n",sizeof(STORAGE_DEVICE_DESCRIPTOR)));
BulkUmss_DbgPrint(MidDbgLevel,("sizeof(INQUIRYDATA)=%d\n",sizeof(INQUIRYDATA)));
}
}

break;
不断追求,坚持不懈,迎难而上。
请帮我分析要不要处理IOCTL_DISK_GET_DRIVE_GEOMETRY,分析其正确性。thanks

case IOCTL_DISK_GET_DRIVE_GEOMETRY: //0x70000 Include ntdddisk.h

if (outputBufferLength>= sizeof(DISK_GEOMETRY))
{
PDISK_GEOMETRY DiskGeometry;
ULONG NumberOfBlocks;

fdoExtension = (PDEVICE_EXTENSION)pdoExtension->ParentFdo->DeviceExtension;
pInquiryBuf = fdoExtension->InquiryData;

NumberOfBlocks = 123207168;//64 * 1024 * 1024; //64M

DiskGeometry = (PDISK_GEOMETRY)ioBuffer;

DiskGeometry->Cylinders.QuadPart = (LONGLONG)((NumberOfBlocks+1) / (0x3f * 0xff * 0x200));
DiskGeometry->MediaType = pInquiryBuf->RemovableMedia;//FixedMedia;
DiskGeometry->TracksPerCylinder = 0xff; //ULONG
DiskGeometry->SectorsPerTrack = 0x3f; //ULONG
DiskGeometry->BytesPerSector = 0x200; //512
//DiskGeometry->Cylinders.QuadPart = (LONGLONG)((NumberOfBlocks+1) / (DiskGeometry->SectorsPerTrack * DiskGeometry->TracksPerCylinder));

BulkUmss_DbgPrint(MaxDbgLevel,("Cylinders.QuadPart =0x%x,MediaType = 0x%x, TracksPerCylinder = 0x%x, SectorsPerTrack =0x%x,BytesPerSector = 0x%x\n", \
DiskGeometry->Cylinders.QuadPart,DiskGeometry->MediaType,DiskGeometry->TracksPerCylinder,\
DiskGeometry->SectorsPerTrack,DiskGeometry->BytesPerSector));

Irp->IoStatus.Information = sizeof(DISK_GEOMETRY);
ntStatus = STATUS_SUCCESS;
}
else
{
ntStatus = STATUS_BUFFER_TOO_SMALL;
}

BulkUmss_DbgPrint(MaxDbgLevel,("IOCTL_DISK_GET_DRIVE_GEOMETRY. \n"));
break;
不断追求,坚持不懈,迎难而上。
返回列表