reactos操作系统实现(148)
来源:互联网 发布:洪泽新闻网农村淘宝 编辑:程序博客网 时间:2024/05/01 06:00
在小端口驱动程序里,主要调用视频驱动程序API来实现相关的功能,下面就来分析小端口驱动程序里调用的初始化函数VideoPortInitialize,它的实现代码在文件reactos/drivers/video/videoprt/videoprt.c里,如下:
#001 ULONG NTAPI
#002 VideoPortInitialize(
#003 IN PVOID Context1,
#004 IN PVOID Context2,
#005 INPVIDEO_HW_INITIALIZATION_DATA HwInitializationData,
#006 IN PVOID HwContext)
#007 {
驱动程序对象参数。
#008 PDRIVER_OBJECTDriverObject = Context1;
注册表路径。
#009 PUNICODE_STRINGRegistryPath = Context2;
#010 NTSTATUS Status;
#011 PVIDEO_PORT_DRIVER_EXTENSION DriverExtension;
#012 BOOLEAN PnpDriver =FALSE, LegacyDetection = FALSE;
#013
#014 TRACE_(VIDEOPRT,"VideoPortInitialize/n");
#015
#016 /*
#017 * As a first thing doparameter checks.
#018 */
#019
首先做参数检查,如果失败就返回出错。
#020 if(HwInitializationData->HwInitDataSize >sizeof(VIDEO_HW_INITIALIZATION_DATA))
#021 {
#022 return STATUS_REVISION_MISMATCH;
#023 }
#024
#025 if(HwInitializationData->HwFindAdapter == NULL ||
#026 HwInitializationData->HwInitialize == NULL ||
#027 HwInitializationData->HwStartIO == NULL)
#028 {
#029 returnSTATUS_INVALID_PARAMETER;
#030 }
#031
根据初始化的数据结构大小来区分不同的系统版本。
#032 switch(HwInitializationData->HwInitDataSize)
#033 {
#034 /*
#035 * NT4 drivers arespecial case, because we must use legacy method
#036 * of detectioninstead of the Plug & Play one.
#037 */
#038
#039 caseSIZE_OF_NT4_VIDEO_HW_INITIALIZATION_DATA:
#040 INFO_(VIDEOPRT,"We were loaded by a Windows NT miniport driver./n");
#041 break;
#042
#043 case SIZE_OF_W2K_VIDEO_HW_INITIALIZATION_DATA:
#044 INFO_(VIDEOPRT,"We were loaded by a Windows 2000 miniport driver./n");
#045 break;
#046
#047 casesizeof(VIDEO_HW_INITIALIZATION_DATA):
#048 INFO_(VIDEOPRT,"We were loaded by a Windows XP or later miniport driver./n");
#049 break;
#050
#051 default:
#052 WARN_(VIDEOPRT,"Invalid HwInitializationData size./n");
#053 returnSTATUS_UNSUCCESSFUL;
#054 }
#055
设置驱动程序处理功能函数。
#056 /* Set dispatchingroutines */
#057 DriverObject->MajorFunction[IRP_MJ_CREATE] =IntVideoPortDispatchOpen;
#058 DriverObject->MajorFunction[IRP_MJ_CLOSE] =IntVideoPortDispatchClose;
#059 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =
#060 IntVideoPortDispatchDeviceControl;
#061 DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] =
#062 IntVideoPortDispatchDeviceControl;
#063 DriverObject->MajorFunction[IRP_MJ_WRITE] =
#064 IntVideoPortDispatchWrite; // ReactOS-specific hack
#065 DriverObject->DriverUnload = IntVideoPortUnload;
#066
检查小端口驱动程序是什么类型。
#067 /* Determine type of theminiport driver */
#068 if((HwInitializationData->HwInitDataSize >=
#069 FIELD_OFFSET(VIDEO_HW_INITIALIZATION_DATA, HwQueryInterface))
#070 &&HwInitializationData->HwSetPowerState
#071 &&HwInitializationData->HwGetPowerState
#072 &&HwInitializationData->HwGetVideoChildDescriptor)
#073 {
这里检测到小端口驱动程序是即插即用驱动程序。
#074 INFO_(VIDEOPRT,"The miniport is a PnP miniport driver/n");
#075 PnpDriver = TRUE;
#076 }
#077
检查是否旧的驱动程序模式。
#078 /* Check if legacydetection should be applied */
#079 if (!PnpDriver ||HwContext)
#080 {
#081 INFO_(VIDEOPRT,"Legacy detection for adapter interface %d/n",
#082 HwInitializationData->AdapterInterfaceType);
#083
#084 /* FIXME: Move thecode for legacy detection
#085 to anotherfunction and call it here */
#086 LegacyDetection =TRUE;
#087 }
#088
#089 /*
#090 * NOTE:
#091 * The driver extensioncan be already allocated in case that we were
#092 * called by legacydriver and failed detecting device. Some miniport
#093 * drivers in that caseadjust parameters and call VideoPortInitialize
#094 * again.
#095 */
#096
尝试获取驱动程序扩展数据。
#097 DriverExtension =IoGetDriverObjectExtension(DriverObject, DriverObject);
#098 if (DriverExtension ==NULL)
#099 {
如果没有分配驱动程序扩展,就在这里分配。
#100 Status = IoAllocateDriverObjectExtension(
#101 DriverObject,
#102 DriverObject,
#103 sizeof(VIDEO_PORT_DRIVER_EXTENSION),
#104 (PVOID*)&DriverExtension);
#105
#106 if(!NT_SUCCESS(Status))
#107 {
#108 return Status;
#109 }
#110
#111 /*
#112 * Save the registrypath. This should be done only once even if
#113 * VideoPortInitializeis called multiple times.
#114 */
#115
保存当前驱动程序在注册表里的路径。
#116 if (RegistryPath->Length != 0)
#117 {
#118 DriverExtension->RegistryPath.Length = 0;
#119 DriverExtension->RegistryPath.MaximumLength =
#120 RegistryPath->Length + sizeof(UNICODE_NULL);
#121 DriverExtension->RegistryPath.Buffer=
#122 ExAllocatePoolWithTag(
#123 PagedPool,
#124 DriverExtension->RegistryPath.MaximumLength,
#125 TAG('U', 'S','T', 'R'));
#126 if(DriverExtension->RegistryPath.Buffer == NULL)
#127 {
#128 RtlInitUnicodeString(&DriverExtension->RegistryPath, NULL);
#129 returnSTATUS_INSUFFICIENT_RESOURCES;
#130 }
#131
#132 RtlCopyUnicodeString(&DriverExtension->RegistryPath,RegistryPath);
#133 INFO_(VIDEOPRT,"RegistryPath: %wZ/n", &DriverExtension->RegistryPath);
#134 }
#135 else
#136 {
#137 RtlInitUnicodeString(&DriverExtension->RegistryPath, NULL);
#138 }
#139 }
#140
#141 /*
#142 * Copy the correctminiport initialization data to the device extension.
#143 */
#144
拷贝初始化数据。
#145 RtlCopyMemory(
#146 &DriverExtension->InitializationData,
#147 HwInitializationData,
#148 HwInitializationData->HwInitDataSize);
#149 if(HwInitializationData->HwInitDataSize <
#150 sizeof(VIDEO_HW_INITIALIZATION_DATA))
#151 {
#152 RtlZeroMemory((PVOID)((ULONG_PTR)&DriverExtension->InitializationData+
#153 HwInitializationData->HwInitDataSize),
#154 sizeof(VIDEO_HW_INITIALIZATION_DATA) -
#155 HwInitializationData->HwInitDataSize);
#156 }
#157 DriverExtension->HwContext = HwContext;
#158
#159 /*
#160 * Plug & Playdrivers registers the device in AddDevice routine. For
#161 * legacy drivers we mustdo it now.
#162 */
#163
旧的驱动程序进行功能回调函数设置。
#164 if (LegacyDetection)
#165 {
#166 PDEVICE_OBJECTDeviceObject;
#167
#168 if(HwInitializationData->HwInitDataSize !=SIZE_OF_NT4_VIDEO_HW_INITIALIZATION_DATA)
#169 {
#170 /* powermanagement */
#171 DriverObject->MajorFunction[IRP_MJ_POWER] =IntVideoPortDispatchPower;
#172 }
#173 Status =IntVideoPortCreateAdapterDeviceObject(DriverObject, DriverExtension,
#174 NULL, &DeviceObject);
#175 INFO_(VIDEOPRT,"IntVideoPortCreateAdapterDeviceObject returned 0x%x/n", Status);
#176 if(!NT_SUCCESS(Status))
#177 return Status;
这里调用函数IntVideoPortFindAdapter来注册本显示驱动程序到对象管理器,以便创建设备DC时使用。
#178 Status =IntVideoPortFindAdapter(DriverObject, DriverExtension, DeviceObject);
#179 INFO_(VIDEOPRT,"IntVideoPortFindAdapter returned 0x%x/n", Status);
#180 if(NT_SUCCESS(Status))
#181 VideoPortDeviceNumber++;
#182 return Status;
#183 }
#184 else
#185 {
即插即用的驱动程序的回调函数设置。
#186 DriverObject->DriverExtension->AddDevice = IntVideoPortAddDevice;
#187 DriverObject->MajorFunction[IRP_MJ_PNP] = IntVideoPortDispatchPnp;
#188 DriverObject->MajorFunction[IRP_MJ_POWER] =IntVideoPortDispatchPower;
#189 DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] =IntVideoPortDispatchSystemControl;
#190
#191 return STATUS_SUCCESS;
#192 }
#193 }
- reactos操作系统实现(148)
- 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)
- 2009年上半年系统分析师上午试题答案(分析与解答))(第1次修订 修订时间:2002年02月02日21时54分)(5月份)
- do{} while(0)的使用
- vmware中linux上网设置——NAT
- [转载]Paxos算法在大型系统中常见的应用场景
- (转载) 到底什么样的杀毒软件好
- reactos操作系统实现(148)
- Class文件格式解析
- Linux nfs 服务端配置
- (转贴) 安全知识:杀毒软件引擎技术之窥探
- ABEND SB37 and ABEND S04E and ABEND S106
- 实现随机整数[a,b),大于等于a,小于b
- iBatis支持三级延迟加载问题?
- JavaScript:Window.ShowModalDialog使用手册
- 利用JS做到隐藏div和显示div!! zz