reactos操作系统实现(119)

前端之家收集整理的这篇文章主要介绍了reactos操作系统实现(119)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

前介绍了初始化函数@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@

#002 @H_301_2@NTAPI@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@

#009 @H_301_2@)@H_301_2@

#010 @H_301_2@@H_301_2@

#011 @H_301_2@/*++@H_301_2@

#012 @H_301_2@@H_301_2@

#013 @H_301_2@Routine Description:@H_301_2@

#014 @H_301_2@@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@

#018 @H_301_2@@H_301_2@

#019 @H_301_2@Arguments:@H_301_2@

#020 @H_301_2@@H_301_2@

#021 @H_301_2@DriverObject - Pointer to driver object created by system.@H_301_2@

#022 @H_301_2@@H_301_2@

#023 @H_301_2@PortDeviceObject - Device object use to send requests to port driver.@H_301_2@

#024 @H_301_2@@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@

#027 @H_301_2@@H_301_2@

#028 @H_301_2@Return Value:@H_301_2@

#029 @H_301_2@@H_301_2@

#030 @H_301_2@True is returned if one disk was found and successfully created.@H_301_2@

#031 @H_301_2@@H_301_2@

#032 @H_301_2@--*/@H_301_2@

#033 @H_301_2@@H_301_2@

#034 @H_301_2@{@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@

#046 @H_301_2@@H_301_2@

#047 @H_301_2@PAGED_CODE();@H_301_2@

#048 @H_301_2@@H_301_2@

#049 @H_301_2@//@H_301_2@

#050 @H_301_2@// Call port driver to get adapter capabilities.@H_301_2@

#051 @H_301_2@//@H_301_2@

#052 @H_301_2@@H_301_2@

@H_301_2@

获取底层端口驱动程序的属性@H_301_2@@H_301_2@

#053 @H_301_2@status = ScsiClassGetCapabilities(PortDeviceObject,&portCapabilities);@H_301_2@

#054 @H_301_2@@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@

#058 @H_301_2@}@H_301_2@

#059 @H_301_2@@H_301_2@

#060 @H_301_2@//@H_301_2@

#061 @H_301_2@// Call port driver to get inquiry information to find disks.@H_301_2@

#062 @H_301_2@//@H_301_2@

#063 @H_301_2@@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@

#065 @H_301_2@@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@

#069 @H_301_2@}@H_301_2@

#070 @H_301_2@@H_301_2@

#071 @H_301_2@//@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@

#075 @H_301_2@//@H_301_2@

#076 @H_301_2@@H_301_2@

#077 @H_301_2@adapterDisk = 0;@H_301_2@

#078 @H_301_2@adapterInfo = (PVOID) buffer;@H_301_2@

#079 @H_301_2@@H_301_2@

@H_301_2@

从端口驱动程序里返回的信息分析有几个磁盘。@H_301_2@@H_301_2@

#080 @H_301_2@adapterDisk = ScsiClassFindUnclaimedDevices(InitializationData,adapterInfo);@H_301_2@

#081 @H_301_2@@H_301_2@

#082 @H_301_2@//@H_301_2@

#083 @H_301_2@// Allocate a zone of SRB for disks on this adapter.@H_301_2@

#084 @H_301_2@//@H_301_2@

#085 @H_301_2@@H_301_2@

@H_301_2@

如果没有找到磁盘就返回。@H_301_2@@H_301_2@

#086 @H_301_2@if (adapterDisk == 0) {@H_301_2@

#087 @H_301_2@@H_301_2@

#088 @H_301_2@//@H_301_2@

#089 @H_301_2@// No free disks were found.@H_301_2@

#090 @H_301_2@//@H_301_2@

#091 @H_301_2@@H_301_2@

#092 @H_301_2@return(FALSE);@H_301_2@

#093 @H_301_2@}@H_301_2@

#094 @H_301_2@@H_301_2@

#095 @H_301_2@//@H_301_2@

#096 @H_301_2@// Get the number of disks already initialized.@H_301_2@

#097 @H_301_2@//@H_301_2@

#098 @H_301_2@@H_301_2@

@H_301_2@

获取配置信息。@H_301_2@@H_301_2@

#099 @H_301_2@configurationInformation = IoGetConfigurationInformation();@H_301_2@

@H_301_2@

配置信息里的磁盘个数。@H_301_2@@H_301_2@

#100 @H_301_2@diskCount = &configurationInformation->DiskCount;@H_301_2@

#101 @H_301_2@@H_301_2@

#102 @H_301_2@//@H_301_2@

#103 @H_301_2@// For each SCSI bus this adapter supports ...@H_301_2@

#104 @H_301_2@//@H_301_2@

#105 @H_301_2@@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@

#107 @H_301_2@@H_301_2@

#108 @H_301_2@//@H_301_2@

#109 @H_301_2@// Get the SCSI bus scan data for this bus.@H_301_2@

#110 @H_301_2@//@H_301_2@

#111 @H_301_2@@H_301_2@

#112 @H_301_2@lunInfo = (PVOID) (buffer + adapterInfo->BusData[scsiBus].InquiryDataOffset);@H_301_2@

#113 @H_301_2@@H_301_2@

#114 @H_301_2@//@H_301_2@

#115 @H_301_2@// Search list for unclaimed disk devices.@H_301_2@

#116 @H_301_2@//@H_301_2@

#117 @H_301_2@@H_301_2@

@H_301_2@

搜索一个磁盘总线上所有设备。@H_301_2@@H_301_2@

#118 @H_301_2@while (adapterInfo->BusData[scsiBus].InquiryDataOffset) {@H_301_2@

#119 @H_301_2@@H_301_2@

#120 @H_301_2@inquiryData = (PVOID)lunInfo->InquiryData;@H_301_2@

#121 @H_301_2@@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@

#126 @H_301_2@@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@

#130 @H_301_2@@H_301_2@

#131 @H_301_2@//@H_301_2@

#132 @H_301_2@@H_301_2@// Create device objects for disk@H_301_2@

#133 @H_301_2@//@H_301_2@

#134 @H_301_2@@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@

#143 @H_301_2@@H_301_2@

#144 @H_301_2@if (NT_SUCCESS(status)) {@H_301_2@

#145 @H_301_2@@H_301_2@

#146 @H_301_2@//@H_301_2@

#147 @H_301_2@// Increment system disk device count.@H_301_2@

#148 @H_301_2@//@H_301_2@

#149 @H_301_2@@H_301_2@

@H_301_2@

增加系统磁盘设备个数。@H_301_2@@H_301_2@

#150 @H_301_2@(*diskCount)++;@H_301_2@

#151 @H_301_2@foundOne = TRUE;@H_301_2@

#152 @H_301_2@@H_301_2@

#153 @H_301_2@}@H_301_2@

#154 @H_301_2@}@H_301_2@

#155 @H_301_2@@H_301_2@

#156 @H_301_2@//@H_301_2@

#157 @H_301_2@@H_301_2@// Get next LunInfo.@H_301_2@

#158 @H_301_2@//@H_301_2@

#159 @H_301_2@@H_301_2@

@H_301_2@

获取一下磁盘设备。@H_301_2@@H_301_2@

#160 @H_301_2@if (lunInfo->NextInquiryDataOffset == 0) {@H_301_2@

#161 @H_301_2@break;@H_301_2@

#162 @H_301_2@}@H_301_2@

#163 @H_301_2@@H_301_2@

#164 @H_301_2@lunInfo = (PVOID) (buffer + lunInfo->NextInquiryDataOffset);@H_301_2@

#165 @H_301_2@@H_301_2@

#166 @H_301_2@}@H_301_2@

#167 @H_301_2@}@H_301_2@

#168 @H_301_2@@H_301_2@

#169 @H_301_2@//@H_301_2@

#170 @H_301_2@// Buffer is allocated by ScsiClassGetInquiryData and must be free returning.@H_301_2@

#171 @H_301_2@//@H_301_2@

#172 @H_301_2@@H_301_2@

#173 @H_301_2@ExFreePool(buffer);@H_301_2@

#174 @H_301_2@@H_301_2@

#175 @H_301_2@return(foundOne);@H_301_2@

#176 @H_301_2@@H_301_2@

#177} // end FindScsiDisks()@H_301_2@

原文链接:https://www.f2er.com/react/308407.html

猜你在找的React相关文章