在Reactos里,磁盘类的驱动程序是由disk.sys实现的。从文件系统上输出和读取的调用,就是需要通过这个驱动程序来实现,在这个驱动程序下面就是PCIIDE和ATAPI的驱动程序了,后面这些驱动程序,在前面已经分析过,现在来学习disk类驱动程序。
10.4.1 DriverEntry入口函数
分析这个程序还是从这个驱动程序的入口函数开始,这个函数是初始化SCSI的硬盘类驱动程序,具体实现代码如下:
#001 NTSTATUS
#002 NTAPI
#003 DriverEntry(
#004 IN PDRIVER_OBJECT DriverObject,
#005 IN PUNICODE_STRING RegistryPath
#006 )
#007
#008 /*++
#009
#010 Routine Description:
#011
#012 This routine initializes the SCSI hard disk class driver.
#013
#014 Arguments:
#015
#016 DriverObject - Pointer to driver object created by system.
#017
#018 RegistryPath - Pointer to the name of the services node for this driver.
#019
#020 Return Value:
#021
#022 The function value is the final status from the initialization operation.
#023
#024 --*/
#025
#026 {
#027 CLASS_INIT_DATA InitializationData;
#028
#029 //
#030 // Zero InitData
#031 //
#032
清空初始化结构。
#033 RtlZeroMemory (&InitializationData, sizeof(CLASS_INIT_DATA));
#034
#035 //
#036 // Set sizes
#037 //
#038
设置结构的大小。
#039 InitializationData.InitializationDataSize = sizeof(CLASS_INIT_DATA);
设置驱动程序使用空间的大小。
#040 InitializationData.DeviceExtensionSize = DEVICE_EXTENSION_SIZE;
#041
指明这个驱动程序对象是磁盘驱动程序。
#042 InitializationData.DeviceType = FILE_DEVICE_DISK;
#043 InitializationData.DeviceCharacteristics = 0;
#044
#045 //
#046 // Set entry points
#047 //
#048
设置类调用的回调函数。
#049 InitializationData.ClassError = ScsiDiskProcessError;
#050 InitializationData.ClassReadWriteVerification = ScsiDiskReadWriteVerification;
#051 InitializationData.ClassFindDevices = FindScsiDisks;
#052 InitializationData.ClassFindDeviceCallBack = ScsiDiskDeviceVerification;
#053 InitializationData.ClassDeviceControl = ScsiDiskDeviceControl;
#054 InitializationData.ClassShutdownFlush = ScsiDiskShutdownFlush;
#055 InitializationData.ClassCreateClose = NULL;
#056
#057 //
#058 // Call the class init routine
#059 //
#060
调用ScsiClassInitialize函数初始化驱动程序对象。
#061 return ScsiClassInitialize( DriverObject, RegistryPath, &InitializationData);
#062
#063 } // end DriverEntry()