前介绍了初始化函数ScsiClassInitialize,那么在这个函数里使用下面的语句来查找SCSI的磁盘,如下:

if (InitializationData->ClassFindDevices(DriverObject, Argument2, InitializationData,portDeviceObject, portNumber))

其实这里的函数InitializationData->ClassFindDevices就是函数FindScsiDisks的调用,要了解这个函数的作用,一定要仔细地分析它的代码,才可以理解它,看看它是怎么样实现查找SCSI硬盘的,实现代码如下:

#001  BOOLEAN

#002  NTAPI

#003  FindScsiDisks(

#004      IN PDRIVER_OBJECT DriverObject,

#005      IN PUNICODE_STRING RegistryPath,

#006      IN PCLASS_INIT_DATA InitializationData,

#007      IN PDEVICE_OBJECT PortDeviceObject,

#008      IN ULONG PortNumber

#009      )

#010

#011  /*++

#012

#013  Routine Description:

#014

#015      This routine gets a port drivers capabilities, obtains the

#016      inquiry data, searches the SCSI bus for the port driver and creates

#017      the device objects for the disks found.

#018

#019  Arguments:

#020

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

#022

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

#024

#025      PortNumber - Number for port driver.  Used to pass on to

#026                   CreateDiskDeviceObjects() and create device objects.

#027

#028  Return Value:

#029

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

#031

#032  --*/

#033

#034  {

#035      PIO_SCSI_CAPABILITIES portCapabilities;

#036      PULONG diskCount;

#037      PCONFIGURATION_INFORMATION configurationInformation;

#038      PCHAR buffer;

#039      PSCSI_INQUIRY_DATA lunInfo;

#040      PSCSI_ADAPTER_BUS_INFO  adapterInfo;

#041      PINQUIRYDATA inquiryData;

#042      ULONG scsiBus;

#043      ULONG adapterDisk;

#044      NTSTATUS status;

#045      BOOLEAN foundOne = FALSE;

#046

#047      PAGED_CODE();

#048

#049      //

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

#051      //

#052

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

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

#054

#055      if (!NT_SUCCESS(status)) {

#056          DebugPrint((1,"FindScsiDevices: ScsiClassGetCapabilities failed/n"));

#057          return(FALSE);

#058      }

#059

#060      //

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

#062      //

#063

获取端口驱动程序的配置信息。

#064      status = ScsiClassGetInquiryData(PortDeviceObject, (PSCSI_ADAPTER_BUS_INFO *) &buffer);

#065

#066      if (!NT_SUCCESS(status)) {

#067          DebugPrint((1,"FindScsiDevices: ScsiClassGetInquiryData failed/n"));

#068          return(FALSE);

#069      }

#070

#071      //

#072      // Do a quick scan of the devices on this adapter to determine how many

#073      // disks are on this adapter.  This is used to determine the number of

#074      // SRB zone elements to allocate.

#075      //

#076

#077      adapterDisk = 0;

#078      adapterInfo = (PVOID) buffer;

#079

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

#080      adapterDisk = ScsiClassFindUnclaimedDevices(InitializationData, adapterInfo);

#081

#082      //

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

#084      //

#085

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

#086      if (adapterDisk == 0) {

#087

#088          //

#089          // No free disks were found.

#090          //

#091

#092          return(FALSE);

#093      }

#094

#095      //

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

#097      //

#098

获取配置信息。

#099      configurationInformation = IoGetConfigurationInformation();

配置信息里的磁盘个数。

#100      diskCount = &configurationInformation->DiskCount;

#101

#102      //

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

#104      //

#105

找适配器里所有总线磁盘。

#106      for (scsiBus=0; scsiBus < (ULONG)adapterInfo->NumberOfBuses; scsiBus++) {

#107

#108          //

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

#110          //

#111

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

#113

#114          //

#115          // Search list for unclaimed disk devices.

#116          //

#117

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

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

#119

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

#121

#122              if (((inquiryData->DeviceType == DIRECT_ACCESS_DEVICE) ||

#123                  (inquiryData->DeviceType == OPTICAL_DEVICE)) &&

#124                  inquiryData->DeviceTypeQualifier == 0 &&

#125                  (!lunInfo->DeviceClaimed)) {

#126

#127                  DebugPrint((1,

#128                              "FindScsiDevices: Vendor string is %.24s/n",

#129                              inquiryData->VendorId));

#130

#131                  //

#132                  // Create device objects for disk

#133                  //

#134

每找到一个磁盘设备,就创建一个磁盘对象。

#135                  status = CreateDiskDeviceObject(DriverObject,

#136                                                  RegistryPath,

#137                                                  PortDeviceObject,

#138                                                  PortNumber,

#139                                                  diskCount,

#140                                                  portCapabilities,

#141                                                  lunInfo,

#142                                                  InitializationData);

#143

#144                  if (NT_SUCCESS(status)) {

#145

#146                      //

#147                      // Increment system disk device count.

#148                      //

#149

增加系统磁盘设备个数。

#150                      (*diskCount)++;

#151                      foundOne = TRUE;

#152

#153                  }

#154              }

#155

#156              //

#157              // Get next LunInfo.

#158              //

#159

获取一下磁盘设备。

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

#161                  break;

#162              }

#163

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

#165

#166          }

#167      }

#168

#169      //

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

#171      //

#172

#173      ExFreePool(buffer);

#174

#175      return(foundOne);

#176

#177  } // end FindScsiDisks()

转载于:https://www.cnblogs.com/ajuanabc/archive/2009/10/29/2463648.html

reactos操作系统实现(119)相关推荐

  1. reactos操作系统实现 2

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 对于开发 ...

  2. reactos操作系统实现(2)

    对于开发一个操作系统是一个漫长的过程,并不像一个Hello world程序那么快捷,那么明了.因此对开发OS的基本知识,基本技能也需要比较高深一些,特别对一些名词和概念,更需要深入地了解.由于操作系统 ...

  3. reactos操作系统实现(47)

    当光盘变成记录数据以后,就开始使用光盘来分发操作系统了.毕竟光盘有着储存数据量大,成本便宜的优势.下面就来分析Reactos是怎么样通过光盘的格式来引导操作系统的. 现今的计算机BIOS,会在开机时根 ...

  4. reactos操作系统实现 1

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! reac ...

  5. reactos操作系统实现 3

    有人说,reactos不是实时操作系统,不能做嵌入式系统,难道真的不能做嵌入式系统吗?其实不是这样的,嵌入式系统本来就包括有两类系统,一种是要求实时性强,一种是要求实时性弱的.这两种都是嵌入式系统.因 ...

  6. reactos操作系统实现(1)

    reactos是什么操作系统呢?它是一个开源的操作系统,并且是兼容Windows XP的应用程序和驱动程序的操作系统.意思就是说,直接安装一个reactos之后,把第三方的驱动程序安装好后,就可以运行 ...

  7. reactos操作系统实现(3)

    有人说,reactos不是实时操作系统,不能做嵌入式系统,难道真的不能做嵌入式系统吗?其实不是这样的,嵌入式系统本来就包括有两类系统,一种是要求实时性强,一种是要求实时性弱的.这两种都是嵌入式系统.因 ...

  8. reactos操作系统实现(12)

    有了上面的知识,就来分析ReactOS里引导任务是怎么样设置全局描述符表.其工作过程如下图所示: 由于CPU初始化运行后,就当作为一个任务在运行.这里主要设置这个任务的运行保存环境,以便CPU可以交给 ...

  9. reactos操作系统实现(6)

    硬盘引导的流程与相应源码文件名称: 引导序号 引导过程 引导执行代码位数 目标文件名称 1. 主引导代码(Master Boot Record (MBR) code),主要寻找活动分区,然后读入引导扇 ...

最新文章

  1. 冒泡排序 java_Java中的冒泡排序
  2. mysql修改表结构权限_mysql 修改表结构操作
  3. 房奴房贷断供,房子真的会被收走吗?
  4. Eclipse 反编译之 JadClipse
  5. vue+webpack实现一个todolist
  6. SpringBoot整合JavaMail---发送邮件
  7. python实现鼠标键盘事件_鼠标与键盘操作事件
  8. 考勤系统需求分析(软件工程)
  9. 转:visio 2013 激活软件 -- 记录
  10. SimpleDateFormat 使用TimeZone
  11. 用shell脚本在consul注册exporter服务
  12. 通过网页版邮箱的实现“联系我们”
  13. Android视频媒体播放器
  14. 第九篇:ROS的gazebo三维物理仿真环境联合使用
  15. Roxe:大涨时毅然销毁99% ROC 专注解决跨境汇款难题
  16. 论文阅读《Learning for Disparity Estimation through Feature Constancy》
  17. 网站域名在微信端被封禁了怎么办?这样几步就能解封!
  18. python写梦幻西游脚本精灵_python写的梦幻手游辅助工具,非外 挂
  19. Linux 串口工具 cutecom
  20. Ubuntu 21.04 使用Docker部署深度学习项目(cuda11.2+cudnn8.8+deepface)

热门文章

  1. C++实现行列式的相关操作
  2. 华为HCIE这么多的认证方向,哪个方向最有价值,含金量最高?
  3. 网吧大哥服务器维修,《绝地求生》服务器又崩溃!网吧老板快要哭了
  4. 【华为上机真题】分子弹
  5. 视频直播:职场如何升职加薪?
  6. 智慧渔业海洋鱼类捕捉系统
  7. 苹果apple通过双重认证帐户恢复获取AppID访问权限
  8. python tkinter label靠左对齐_如何在Tkinter网格中左对齐标签和输入框
  9. 【Windows 问题系列第 7 篇】电脑卡跟C盘容量有关系吗?
  10. 逗比学CTF.day2