zl程序教程

您现在的位置是:首页 >  系统

当前栏目

reactos操作系统实现(117)

操作系统 实现 reactos 117
2023-09-14 09:10:38 时间

Reactos里,磁盘类的驱动程序是由disk.sys实现的。从文件系统上输出和读取的调用,就是需要通过这个驱动程序来实现,在这个驱动程序下面就是PCIIDEATAPI的驱动程序了,后面这些驱动程序,在前面已经分析过,现在来学习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()