前介绍了初始化函数@H_301_2@ScsiClassInitialize@H_301_2@,那么在这个函数里使用下面的语句来查找SCSI@H_301_2@的磁盘,如下:@H_301_2@
if (InitializationData->ClassFindDevices(DriverObject,Argument2,InitializationData,portDeviceObject,portNumber))@H_301_2@
其实这里的函数InitializationData->ClassFindDevices@H_301_2@就是函数FindScsiDisks@H_301_2@的调用,要了解这个函数的作用,一定要仔细地分析它的代码,才可以理解它,看看它是怎么样实现查找SCSI@H_301_2@硬盘的,实现代码如下:@H_301_2@@H_301_2@
#001 @H_301_2@BOOLEAN@H_301_2@
#003 @H_301_2@FindScsiDisks(@H_301_2@
#004 @H_301_2@IN PDRIVER_OBJECT DriverObject,@H_301_2@
#005 @H_301_2@IN PUNICODE_STRING RegistryPath,@H_301_2@
#006 @H_301_2@IN PCLASS_INIT_DATA InitializationData,@H_301_2@
#007 @H_301_2@IN PDEVICE_OBJECT PortDeviceObject,@H_301_2@
#008 @H_301_2@IN ULONG PortNumber@H_301_2@
#013 @H_301_2@Routine Description:@H_301_2@
#015 @H_301_2@This routine gets a port drivers capabilities,obtains the@H_301_2@
#016 @H_301_2@inquiry data,searches the SCSI bus for the port driver and creates@H_301_2@
#017 @H_301_2@the device objects for the disks found.@H_301_2@
#019 @H_301_2@Arguments:@H_301_2@
#021 @H_301_2@DriverObject - Pointer to driver object created by system.@H_301_2@
#023 @H_301_2@PortDeviceObject - Device object use to send requests to port driver.@H_301_2@
#025 @H_301_2@PortNumber - Number for port driver. @H_301_2@Used to pass on to@H_301_2@
#026 @H_301_2@CreateDiskDeviceObjects() and create device objects.@H_301_2@
#028 @H_301_2@Return Value:@H_301_2@
#030 @H_301_2@True is returned if one disk was found and successfully created.@H_301_2@
#035 @H_301_2@PIO_SCSI_CAPABILITIES portCapabilities;@H_301_2@
#036 @H_301_2@PULONG diskCount;@H_301_2@
#037 @H_301_2@PCONFIGURATION_INFORMATION configurationInformation;@H_301_2@
#038 @H_301_2@PCHAR buffer;@H_301_2@
#039 @H_301_2@PSCSI_INQUIRY_DATA lunInfo;@H_301_2@
#040 @H_301_2@PSCSI_ADAPTER_BUS_INFO @H_301_2@adapterInfo;@H_301_2@
#041 @H_301_2@PINQUIRYDATA inquiryData;@H_301_2@
#042 @H_301_2@ULONG scsiBus;@H_301_2@
#043 @H_301_2@ULONG adapterDisk;@H_301_2@
#044 @H_301_2@NTSTATUS status;@H_301_2@
#045 @H_301_2@BOOLEAN foundOne = FALSE;@H_301_2@
#047 @H_301_2@PAGED_CODE();@H_301_2@
#050 @H_301_2@// Call port driver to get adapter capabilities.@H_301_2@
@H_301_2@
获取底层端口驱动程序的属性。@H_301_2@@H_301_2@
#053 @H_301_2@status = ScsiClassGetCapabilities(PortDeviceObject,&portCapabilities);@H_301_2@
#055 @H_301_2@if (!NT_SUCCESS(status)) {@H_301_2@
#056 @H_301_2@DebugPrint((1,"FindScsiDevices: ScsiClassGetCapabilities Failed/n"));@H_301_2@
#057 @H_301_2@return(FALSE);@H_301_2@
#061 @H_301_2@// Call port driver to get inquiry information to find disks.@H_301_2@
@H_301_2@
获取端口驱动程序的配置信息。@H_301_2@@H_301_2@
#064 @H_301_2@status = ScsiClassGetInquiryData(PortDeviceObject,(PSCSI_ADAPTER_BUS_INFO *) &buffer);@H_301_2@
#066 @H_301_2@if (!NT_SUCCESS(status)) {@H_301_2@
#067 @H_301_2@DebugPrint((1,"FindScsiDevices: ScsiClassGetInquiryData Failed/n"));@H_301_2@
#068 @H_301_2@return(FALSE);@H_301_2@
#072 @H_301_2@// Do a quick scan of the devices on this adapter to determine how many@H_301_2@
#073 @H_301_2@// disks are on this adapter. @H_301_2@This is used to determine the number of@H_301_2@
#074 @H_301_2@// SRB zone elements to allocate.@H_301_2@
#077 @H_301_2@adapterDisk = 0;@H_301_2@
#078 @H_301_2@adapterInfo = (PVOID) buffer;@H_301_2@
@H_301_2@
从端口驱动程序里返回的信息分析有几个磁盘。@H_301_2@@H_301_2@
#080 @H_301_2@adapterDisk = ScsiClassFindUnclaimedDevices(InitializationData,adapterInfo);@H_301_2@
#083 @H_301_2@// Allocate a zone of SRB for disks on this adapter.@H_301_2@
@H_301_2@
如果没有找到磁盘就返回。@H_301_2@@H_301_2@
#086 @H_301_2@if (adapterDisk == 0) {@H_301_2@
#089 @H_301_2@// No free disks were found.@H_301_2@
#092 @H_301_2@return(FALSE);@H_301_2@
#096 @H_301_2@// Get the number of disks already initialized.@H_301_2@
@H_301_2@
#099 @H_301_2@configurationInformation = IoGetConfigurationInformation();@H_301_2@
@H_301_2@
#100 @H_301_2@diskCount = &configurationInformation->DiskCount;@H_301_2@
#103 @H_301_2@// For each SCSI bus this adapter supports ...@H_301_2@
@H_301_2@
找适配器里所有总线磁盘。@H_301_2@@H_301_2@
#106 @H_301_2@for (scsiBus=0; scsiBus < (ULONG)adapterInfo->NumberOfBuses; scsiBus++) {@H_301_2@
#109 @H_301_2@// Get the SCSI bus scan data for this bus.@H_301_2@
#112 @H_301_2@lunInfo = (PVOID) (buffer + adapterInfo->BusData[scsiBus].InquiryDataOffset);@H_301_2@
#115 @H_301_2@// Search list for unclaimed disk devices.@H_301_2@
@H_301_2@
搜索一个磁盘总线上所有设备。@H_301_2@@H_301_2@
#118 @H_301_2@while (adapterInfo->BusData[scsiBus].InquiryDataOffset) {@H_301_2@
#120 @H_301_2@inquiryData = (PVOID)lunInfo->InquiryData;@H_301_2@
#122 @H_301_2@if (((inquiryData->DeviceType == DIRECT_ACCESS_DEVICE) ||@H_301_2@
#123 @H_301_2@(inquiryData->DeviceType == OPTICAL_DEVICE)) &&@H_301_2@
#124 @H_301_2@inquiryData->DeviceTypeQualifier == 0 &&@H_301_2@
#125 @H_301_2@(!lunInfo->DeviceClaimed)) {@H_301_2@
#127 @H_301_2@DebugPrint((1,@H_301_2@
#128 @H_301_2@"FindScsiDevices: Vendor string is %.24s/n",@H_301_2@
#129 @H_301_2@inquiryData->VendorId));@H_301_2@
#132 @H_301_2@@H_301_2@// Create device objects for disk@H_301_2@
@H_301_2@
每找到一个磁盘设备,就创建一个磁盘对象。@H_301_2@@H_301_2@
#135 @H_301_2@status = CreateDiskDeviceObject(DriverObject,@H_301_2@
#136 @H_301_2@RegistryPath,@H_301_2@
#137 @H_301_2@@H_301_2@PortDeviceObject,@H_301_2@
#138 @H_301_2@PortNumber,@H_301_2@
#139 @H_301_2@diskCount,@H_301_2@
#140 @H_301_2@portCapabilities,@H_301_2@
#141 @H_301_2@@H_301_2@lunInfo,@H_301_2@
#142 @H_301_2@InitializationData);@H_301_2@
#144 @H_301_2@if (NT_SUCCESS(status)) {@H_301_2@
#147 @H_301_2@// Increment system disk device count.@H_301_2@
@H_301_2@
#150 @H_301_2@(*diskCount)++;@H_301_2@
#151 @H_301_2@foundOne = TRUE;@H_301_2@
#157 @H_301_2@@H_301_2@// Get next LunInfo.@H_301_2@
@H_301_2@
#160 @H_301_2@if (lunInfo->NextInquiryDataOffset == 0) {@H_301_2@
#164 @H_301_2@lunInfo = (PVOID) (buffer + lunInfo->NextInquiryDataOffset);@H_301_2@
#170 @H_301_2@// Buffer is allocated by ScsiClassGetInquiryData and must be free returning.@H_301_2@
#173 @H_301_2@ExFreePool(buffer);@H_301_2@
#175 @H_301_2@return(foundOne);@H_301_2@
#177} // end FindScsiDisks()@H_301_2@
原文链接:https://www.f2er.com/react/308407.html