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 }
- reactos操作系统实现(118)
- reactos操作系统实现(1)
- reactos操作系统实现(2)
- reactos操作系统实现(3)
- reactos操作系统实现(4)
- reactos操作系统实现(5)
- reactos操作系统实现(6)
- reactos操作系统实现(7)
- reactos操作系统实现(8)
- reactos操作系统实现(9)
- reactos操作系统实现(10)
- reactos操作系统实现(11)
- reactos操作系统实现(12)
- reactos操作系统实现(13)
- reactos操作系统实现(14)
- reactos操作系统实现(15)
- reactos操作系统实现(16)
- reactos操作系统实现(17)
- October 28th Wednesday
- linux下一个用eXosip实现的sip通信的UAC和UAS的例子(调试成功)
- hibernate自定义主键
- SGI源码注释之stl_vector.h初窥
- Maven Dependency设置
- reactos操作系统实现(118)
- 10月26日工作日志
- 10月27日工作日志
- delphi获取Windows系统的进程运行信息
- DayDayUp
- 买家,教你个消费技巧
- 关于多维数组做参数 的问题
- java 对EXCEL 的操作
- HTML 4.0 语法教学 [笔记2.3] 表单和序列