reactos操作系统实现(118)

来源:互联网 发布:平成骑士最终形态数据 编辑:程序博客网 时间:2024/04/30 13:47

 ScsiClassInitialize函数初始化驱动程序对象,主要是找到合适的端口驱动程序,并设置它来处理磁盘的命令,具体实现代码如下:

#001  ULONG

#002  NTAPI

#003  ScsiClassInitialize(

#004      IN  PVOID            Argument1,

#005      IN  PVOID            Argument2,

#006      IN  PCLASS_INIT_DATA InitializationData

#007      )

#008 

#009  /*++

#010 

#011  Routine Description:

#012 

#013      This routine is calledby a class driver during its

#014      DriverEntry routine toinitialize the driver.

#015 

#016  Arguments:

#017 

#018      Argument1          - Driver Object.

#019      Argument2          - Registry Path.

#020      InitializationData -Device-specific driver's initialization data.

#021 

#022  Return Value:

#023 

#024      A valid return code for aDriverEntry routine.

#025 

#026  --*/

#027 

#028  {

#029 

#030 

 

驱动程序对象。

#031      PDRIVER_OBJECT  DriverObject = Argument1;

#032      ULONG           portNumber = 0;

#033      PDEVICE_OBJECT  portDeviceObject;

#034      NTSTATUS        status;

#035      STRING          deviceNameString;

#036      UNICODE_STRING  unicodeDeviceName;

#037      PFILE_OBJECT    fileObject;

#038      CCHAR           deviceNameBuffer[256];

#039      BOOLEAN         deviceFound = FALSE;

#040 

#041      DebugPrint((3,"/n/nSCSIClass Driver/n"));

#042 

#043      //

#044      // Validate the lengthof this structure. This is effectively a

#045      // version check.

#046      //

#047 

 

判断初始化的数据结构大小是否与函数处理的一样,如果不一样版本就返回出错。

#048      if(InitializationData->InitializationDataSize > sizeof(CLASS_INIT_DATA)) {

#049 

#050         DebugPrint((0,"ScsiClassInitialize: Class driver wrongversion/n"));

#051          return (ULONG)STATUS_REVISION_MISMATCH;

#052      }

#053 

#054      //

#055      // Check that eachrequired entry is not NULL. Note that Shutdown, Flush and Error

#056      // are not requiredentry points.

#057      //

#058 

 

判断初始化的函数是否正确设置了。

#059      if((!InitializationData->ClassFindDevices) ||

#060         (!InitializationData->ClassDeviceControl) ||

#061          (!((InitializationData->ClassReadWriteVerification)||

#062            (InitializationData->ClassStartIo)))) {

#063 

#064          DebugPrint((0,

#065             "ScsiClassInitialize: Class device-specific driver missing requiredentry/n"));

#066 

#067          return (ULONG)STATUS_REVISION_MISMATCH;

#068      }

#069 

#070      //

#071      // Update driver objectwith entry points.

#072      //

#073 

 

设置驱动程序功能调用的函数。

#074     DriverObject->MajorFunction[IRP_MJ_CREATE] = ScsiClassCreateClose;

#075     DriverObject->MajorFunction[IRP_MJ_CLOSE] = ScsiClassCreateClose;

#076     DriverObject->MajorFunction[IRP_MJ_READ] = ScsiClassReadWrite;

#077     DriverObject->MajorFunction[IRP_MJ_WRITE] = ScsiClassReadWrite;

#078     DriverObject->MajorFunction[IRP_MJ_SCSI] =ScsiClassInternalIoControl;

#079     DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =ScsiClassDeviceControlDispatch;

#080     DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] =ScsiClassShutdownFlush;

#081      DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS]= ScsiClassShutdownFlush;

#082 

 

如果StartIO函数,就需要设置顺序操作IO函数。

#083      if(InitializationData->ClassStartIo) {

#084         DriverObject->DriverStartIo = InitializationData->ClassStartIo;

#085      }

#086 

#087      //

#088      // Open port driver controller deviceobjects by name.

#089      //

#090 

 

通设备名称来打开端口设备驱动对象。

#091      do {

#092 

#093         sprintf(deviceNameBuffer, "//Device//ScsiPort%lu",portNumber);

#094 

#095          DebugPrint((2,"ScsiClassInitialize: Open Port %s/n", deviceNameBuffer));

#096 

#097         RtlInitString(&deviceNameString, deviceNameBuffer);

#098 

#099          status =RtlAnsiStringToUnicodeString(&unicodeDeviceName,

#100                                               &deviceNameString,

#101                                               TRUE);

#102 

#103          if(!NT_SUCCESS(status)){

#104              break;

#105          }

#106 

 

通过设备名称来获取端口驱动程序。

#107          status =IoGetDeviceObjectPointer(&unicodeDeviceName,

#108                                             FILE_READ_ATTRIBUTES,

#109                                            &fileObject,

#110                                            &portDeviceObject);

#111 

#112          if(NT_SUCCESS(status)) {

#113 

#114              //

#115              // Call thedevice-specific driver's FindDevice routine.

#116              //

#117 

 

查找这个设备是否匹配。

#118              if(InitializationData->ClassFindDevices(DriverObject, Argument2,InitializationData,

#119                                                       portDeviceObject,portNumber)) {

#120 

 

如果找到设备就设置返回成功标志。

#121                  deviceFound= TRUE;

#122              }

#123          }

#124 

#125          //

#126          // Check next SCSIadapter.

#127          //

#128  

#129          portNumber++;

#130 

#131      }while(NT_SUCCESS(status));

#132 

#133      return deviceFound ?STATUS_SUCCESS : STATUS_NO_SUCH_DEVICE;

#134  }

原创粉丝点击