博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
磁盘驱动的简单分析
阅读量:7282 次
发布时间:2019-06-30

本文共 1679 字,大约阅读时间需要 5 分钟。

在atapi.sys的DriverEntry里会调用ScsiPortInitialize。 PCI中有8个条PCI bus。在ScsiPortInitialize中对每条PCI Bus调用一次AtapiFindCompatiblePciController或AtapiFindIsaBusController,用来寻找ATAPI的Controller。如果发现HBA,则调用ScsiPortCreatePortDevice函数创建scsi对象。

系统会分别调用两次AtapiFindCompatiblePciController

分别找到Prime和Second Channel,分别对应着中断14和15,然后分别调用AtapiFindDevices,会分别找到每个Channel的IDE设备。

 

其中AtapiFindCompatiblePciController会调用ScsiPortGetBusData去枚举每一个pci的function。如果发现BaseClass==1且SubClass==1,即被认定为IDE Controller.

(摘在pci2_2.pdf中的Figure D-1: Programming Interface Byte Layout for IDE Controller Class Code)

 

如果AtapiFindCompatiblePciController找到IDE设备后,就调用ScsiPortCreatePortDevice,为其创建一个scsi设备。

因为ATAPI设备室支持scsi command的,所以通过向这个scsi设备发送scsi command可以传送到ATAPI设备,然后被解释执行。

ScsiPortCreatePortDevice会用IoCreateDevice创建一个对象,然后用IoConnectInterrupt为将Prime或者Secondary Channel的的中断与这个设备对象连接,并设置好中断回调函数ScsiPortIsr。

ScsiPortIsr会调用DPC例程,然后在DPC例程中会申请SRB块,并将请求传送进SCSI设备对象。

在disk.sys中的DriverEntry会调用ScsiClassInitialize,它会枚举所创建的scsi设备对象。

ScsiClassInitialize会调用DiskClassFindDevices,
而DiskClassFindDevices还会调用ScsiClassGetCapabilities、ScsiClassGetInquiryData、ScsiClassFindUnclaimedDevices
然后对所有Unclaimed的设备进行DiskClassCreateDeviceObject

 

在DiskClassCreateDeviceObject中,首先创建这个硬盘对象的一个根目录,即\Device\Harddisk0。

然后紧接着调用ScsiClassClaimDevice
然后用ScsiClassCreateDeviceObject创建分区0,即\Device\Harddisk0\Partition0
然后调用ScsiClassReadDriveCapacity询问分区0设备
然后调用IoReadPartitionTable,读取分区表信息,他是调用xHalIoReadPartitionTable来实现的
DiskClassCreateDeviceObject通过读取\Device\Harddisk0\Partition0读取MBR信息,分析出一共有多少个分区。
然后依次对每个分区创建一个设备对象,例如\Device\Harddisk0\Partition1
vfatfs.sys的DriverEntry会调用IoRegisterFileSystem函数。

转载于:https://www.cnblogs.com/fanzi2009/archive/2009/06/03/1495769.html

你可能感兴趣的文章
PHP写入TXT文件函数
查看>>
虚拟机创建GentOS 64以及安装的操作步骤
查看>>
Failed to execute goal on project dubboxdemo-servi
查看>>
成为一名Java架构师的必修课
查看>>
年薪50W+的网络安全人才需要具备哪些条件?
查看>>
php短信接口,免认证限制少的接口,手机短信,短信验证码
查看>>
linux 命令
查看>>
Go Timer实现原理剖析(轻松掌握Timer实现原理)
查看>>
django 内置标签和过滤器
查看>>
mysql主从复制
查看>>
C++多态的概念
查看>>
关于中文乱码问题的一些解决方案和经验
查看>>
Cisco 交换机命令全集
查看>>
Why Namespace? - 每天5分钟玩转 OpenStack(102)
查看>>
review what i studied `date` - 2017-4-19
查看>>
linux系统中如何查看日志 (常用命令)
查看>>
Java IO与NIO 学习
查看>>
SSH登录的时候显示一些实用信息
查看>>
CentOS 7 安装 MySQL
查看>>
Cisco 无线AP 初始化配置WPA加密日记
查看>>