AtapiHwInitialize函数初始化不是ATAPT设备,设置它支持多块传送。接着判断那些设备是CD-ROM设备,还清除忙状态。具体实现代码如下: #001 BOOLEAN #002 NTAPI #003 AtapiHwInitialize( #004 IN PVOID HwDeviceExtension #005 ) #006 #007 /*++ #008
AtapiInterrupt函数是实现ATAPI的中断功能,主要根据SRB来判断是读取数据还是写入数据,然后对IDE设备读取或写入数据,还需要处理很多出错的情况。具体实现代码如下: #001 BOOLEAN #002 NTAPI #003 AtapiInterrupt( #004 IN PVOID HwDeviceExtension #005 ) #006 #007
AtapiStartIo函数主要处理同步的IO请求包。具代的实现代码如下: #001 BOOLEAN #002 NTAPI #003 AtapiStartIo( #004 IN PVOID HwDeviceExtension, #005 IN PSCSI_REQUEST_BLOCK Srb #006 ) #007 #008 /*++ #009 #010
IdeSendSmartCommand函数主要发送IDE的命令。具体实现代码如下: #001 ULONG #002 NTAPI #003 IdeSendSmartCommand( #004 IN PVOID HwDeviceExtension, #005 IN PSCSI_REQUEST_BLOCK Srb #006 ) #007 #008 /*++ #00
IdeReadWrite函数主要实现了IDE设备的读和写命令发送。具体实现函数如下: #001 ULONG #002 NTAPI #003 IdeReadWrite( #004 IN PVOID HwDeviceExtension, #005 IN PSCSI_REQUEST_BLOCK Srb #006 ) #007 #008 /*++ #009 #01
下面来分析PCIIDE和PCIIDEX驱动程序,这两个都是PCI的IDE总线驱动程序。 先从PCIIDE的入口函数开始,具体实现代码如下: #001 NTSTATUS NTAPI #002 DriverEntry( #003 IN PDRIVER_OBJECT DriverObject, #004 IN PUNICODE_STRING RegistryPath) #005 {
PciIdeXAddDevice函数是用来添加PCIIDEX的设备,设置一个功能设备,并读取PCI总线的配置参数。具体实现代码如下: #001 NTSTATUS NTAPI #002 PciIdeXAddDevice( #003 IN PDRIVER_OBJECT DriverObject, #004 IN PDEVICE_OBJECT Pdo) #005 { #006
PciIdeXFdoPnpDispatch函数主要处理PCIIDE即插即用的消息处理。具体实现代码如下: #001 NTSTATUS NTAPI #002 PciIdeXFdoPnpDispatch( #003 IN PDEVICE_OBJECT DeviceObject, #004 IN PIRP Irp) #005 { #006 ULONG MinorFuncti
PciIdeXFdoStartDevice函数是用来处理即插即用的启动设备消息,主要设置了DMA操作和保存设备端口的基地址,这里就是启动PCIIDE的物理设备,具体实现代码如下: #001 static NTSTATUS #002 PciIdeXFdoStartDevice( #003 IN PDEVICE_OBJECT DeviceObject, #004 IN PIRP I
在Reactos里,磁盘类的驱动程序是由disk.sys实现的。从文件系统上输出和读取的调用,就是需要通过这个驱动程序来实现,在这个驱动程序下面就是PCIIDE和ATAPI的驱动程序了,后面这些驱动程序,在前面已经分析过,现在来学习disk类驱动程序。 10.4.1 DriverEntry入口函数 分析这个程序还是从这个驱动程序的入口函数开始,这个函数是初始化SCSI的硬盘类驱动程序,具体实现
ScsiClassInitialize函数初始化驱动程序对象,主要是找到合适的端口驱动程序,并设置它来处理磁盘的命令,具体实现代码如下: #001 ULONG #002 NTAPI #003 ScsiClassInitialize( #004 IN PVOID Argument1, #005 IN PVOID Argume
前介绍了初始化函数ScsiClassInitialize,那么在这个函数里使用下面的语句来查找SCSI的磁盘,如下: if (InitializationData->ClassFindDevices(DriverObject, Argument2, InitializationData,portDeviceObject, portNumber)) 其实这里的函数InitializationDat
CreateDiskDeviceObject函数主要就是为了物理设备创建磁盘对象,并且查找磁盘上每个分区和创建相应的对象。具体实现代码如下: #001 NTSTATUS #002 NTAPI #003 CreateDiskDeviceObject( #004 IN PDRIVER_OBJECT DriverObject, #005 IN PUNICODE_STRING
CreatePartitionDeviceObjects函数是通过分析MBR扇区的数据,然后来创建所有分区对象。具体实现代码如下: #001 NTSTATUS #002 NTAPI #003 CreatePartitionDeviceObjects( #004 IN PDEVICE_OBJECT PhysicalDeviceObject, #005 IN PUNICOD
IoReadPartitionTable函数是读取磁盘分区表数据。它的实现代码如下: #001 NTSTATUS #002 FASTCALL #003 IoReadPartitionTable(IN PDEVICE_OBJECT DeviceObject, #004 IN ULONG SectorSize, #005
目前,Reactos主要使用FAT的文件系统,因此下面就先来分析这个文件系统,以便了解这个文件系统的功能。这个文件系统的实现是在驱动程序FASTFAT.SYS里实现的,所以来分析这个驱动程序的源码,就可以了解FAT文件系统了。 6.2.1 FAT文件系统驱动程序入口函数 FAT的文件系统是当作一个驱动程序来加载到系统里,因此它也有驱动程序的形式了,也就是它的入口点函数,还是DriverEnt
从上面的入口函数里可以看到,很多消息处理函数都是调用函数VfatBuildRequest来处理的,具体实现代码如下: #001 NTSTATUS NTAPI VfatBuildRequest ( #002 IN PDEVICE_OBJECT DeviceObject, #003 IN PIRP Irp) #004 { #005 NTSTATUS S
VfatCreate函数创建或者打开一个文件。具体实现代码如下: #001 NTSTATUS #002 VfatCreate (PVFAT_IRP_CONTEXT IrpContext) #003 /* #004 * FUNCTION: Create or open a file #005 */ #006 { #007 NTSTATUS Status; #008 #00
VfatCreateFile函数主要用来创建或者打开一个文件,具体实现如下: #001 static NTSTATUS #002 VfatCreateFile ( PDEVICE_OBJECT DeviceObject, PIRP Irp ) #003 /* #004 * FUNCTION: Create or open a file #005 */ #006 { #007
从上面的代码里可以看到调用函数VfatAddEntry来添加文件或目录的入口,其实现的代码如下: #001 NTSTATUS #002 VfatAddEntry( #003 IN PDEVICE_EXTENSION DeviceExt, #004 IN PUNICODE_STRING NameU, #005 IN PVFATFCB *Fcb, #006