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