reactos操作系统实现(91)
驱动程序很多配置参数是保存在注册表里,比如IO资源参数,中断号等内容。因此只有了解注册表的读取,以及相关内容才可以清楚知道键盘驱动程序,主要操作那些相关的端口,还有配置参数。下面来分析函数ReadRegistryEntries的实现,如下: #001 NTSTATUS #002 ReadRegistryEntries( #003 IN PUNICODE_STRING RegistryPath, #004 OUT PI8042_SETTINGS Settings) #005 { #006 RTL_QUERY_REGISTRY_TABLE Parameters[17]; #007 NTSTATUS Status; #008
设置键盘缺省的队列大小。 #009 ULONG DefaultKeyboardDataQueueSize = 0x64;
其它缺省参数。 #010 PCWSTR DefaultKeyboardDeviceBaseName = L"KeyboardPort"; #011 ULONG DefaultMouseDataQueueSize = 0x64; #012 ULONG DefaultMouseResolution = 3; #013 ULONG DefaultMouseSynchIn100ns = 20000000; #014 ULONG DefaultNumberOfButtons = 2; #015 PCWSTR DefaultPointerDeviceBaseName = L"PointerPort"; #016 ULONG DefaultPollStatusIterations = 1; #017 ULONG DefaultOverrideKeyboardType = 4; #018 ULONG DefaultOverrideKeyboardSubtype = 0; #019 ULONG DefaultPollingIterations = 12000; #020 ULONG DefaultPollingIterationsMaximum = 12000; #021 ULONG DefaultResendIterations = 0x3; #022 ULONG DefaultSampleRate = 60; #023 ULONG DefaultCrashOnCtrlScroll; #024 #025 /* Default value for CrashOnCtrlScroll depends if we're #026 * running a debug build or a normal build. #027 */ #028 #ifdef DBG #029 DefaultCrashOnCtrlScroll = 1; #030 #else #031 DefaultCrashOnCtrlScroll = 0; #032 #endif #033
初始化参数内存。 #034 RtlZeroMemory(Parameters,sizeof(Parameters)); #035 #036 Parameters[0].Flags = RTL_QUERY_REGISTRY_SUBKEY; #037 Parameters[0].Name = L"Parameters"; #038 #039 Parameters[1].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL; #040 Parameters[1].Name = L"KeyboardDataQueueSize"; #041 Parameters[1].EntryContext = &Settings->KeyboardDataQueueSize; #042 Parameters[1].DefaultType = REG_DWORD; #043 Parameters[1].DefaultData = &DefaultKeyboardDataQueueSize; #044 Parameters[1].DefaultLength = sizeof(ULONG); #045 #046 Parameters[2].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL; #047 Parameters[2].Name = L"KeyboardDeviceBaseName"; #048 Parameters[2].EntryContext = &Settings->KeyboardDeviceBaseName; #049 Parameters[2].DefaultType = REG_SZ; #050 Parameters[2].DefaultData = (PVOID)DefaultKeyboardDeviceBaseName; #051 Parameters[2].DefaultLength = 0; #052 #053 Parameters[3].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL; #054 Parameters[3].Name = L"MouseDataQueueSize"; #055 Parameters[3].EntryContext = &Settings->MouseDataQueueSize; #056 Parameters[3].DefaultType = REG_DWORD; #057 Parameters[3].DefaultData = &DefaultMouseDataQueueSize; #058 Parameters[3].DefaultLength = sizeof(ULONG); #059 #060 Parameters[4].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL; #061 Parameters[4].Name = L"MouseResolution"; #062 Parameters[4].EntryContext = &Settings->MouseResolution; #063 Parameters[4].DefaultType = REG_DWORD; #064 Parameters[4].DefaultData = &DefaultMouseResolution; #065 Parameters[4].DefaultLength = sizeof(ULONG); #066 #067 Parameters[5].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL; #068 Parameters[5].Name = L"MouseSynchIn100ns"; #069 Parameters[5].EntryContext = &Settings->MouseSynchIn100ns; #070 Parameters[5].DefaultType = REG_DWORD; #071 Parameters[5].DefaultData = &DefaultMouseSynchIn100ns; #072 Parameters[5].DefaultLength = sizeof(ULONG); #073 #074 Parameters[6].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL; #075 Parameters[6].Name = L"NumberOfButtons"; #076 Parameters[6].EntryContext = &Settings->NumberOfButtons; #077 Parameters[6].DefaultType = REG_DWORD; #078 Parameters[6].DefaultData = &DefaultNumberOfButtons; #079 Parameters[6].DefaultLength = sizeof(ULONG); #080 #081 Parameters[7].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL; #082 Parameters[7].Name = L"PointerDeviceBaseName"; #083 Parameters[7].EntryContext = &Settings->PointerDeviceBaseName; #084 Parameters[7].DefaultType = REG_SZ; #085 Parameters[7].DefaultData = (PVOID)DefaultPointerDeviceBaseName; #086 Parameters[7].DefaultLength = 0; #087 #088 Parameters[8].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL; #089 Parameters[8].Name = L"PollStatusIterations"; #090 Parameters[8].EntryContext = &Settings->PollStatusIterations; #091 Parameters[8].DefaultType = REG_DWORD; #092 Parameters[8].DefaultData = &DefaultPollStatusIterations; #093 Parameters[8].DefaultLength = sizeof(ULONG); #094 #095 Parameters[9].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL; #096 Parameters[9].Name = L"OverrideKeyboardType"; #097 Parameters[9].EntryContext = &Settings->OverrideKeyboardType; #098 Parameters[9].DefaultType = REG_DWORD; #099 Parameters[9].DefaultData = &DefaultOverrideKeyboardType; #100 Parameters[9].DefaultLength = sizeof(ULONG); #101 #102 Parameters[10].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL; #103 Parameters[10].Name = L"OverrideKeyboardSubtype"; #104 Parameters[10].EntryContext = &Settings->OverrideKeyboardSubtype; #105 Parameters[10].DefaultType = REG_DWORD; #106 Parameters[10].DefaultData = &DefaultOverrideKeyboardSubtype; #107 Parameters[10].DefaultLength = sizeof(ULONG); #108 #109 Parameters[11].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL; #110 Parameters[11].Name = L"PollingIterations"; #111 Parameters[11].EntryContext = &Settings->PollingIterations; #112 Parameters[11].DefaultType = REG_DWORD; #113 Parameters[11].DefaultData = &DefaultPollingIterations; #114 Parameters[11].DefaultLength = sizeof(ULONG); #115 #116 Parameters[12].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL; #117 Parameters[12].Name = L"PollingIterationsMaximum"; #118 Parameters[12].EntryContext = &Settings->PollingIterationsMaximum; #119 Parameters[12].DefaultType = REG_DWORD; #120 Parameters[12].DefaultData = &DefaultPollingIterationsMaximum; #121 Parameters[12].DefaultLength = sizeof(ULONG); #122 #123 Parameters[13].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL; #124 Parameters[13].Name = L"ResendIterations"; #125 Parameters[13].EntryContext = &Settings->ResendIterations; #126 Parameters[13].DefaultType = REG_DWORD; #127 Parameters[13].DefaultData = &DefaultResendIterations; #128 Parameters[13].DefaultLength = sizeof(ULONG); #129 #130 Parameters[14].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL; #131 Parameters[14].Name = L"SampleRate"; #132 Parameters[14].EntryContext = &Settings->SampleRate; #133 Parameters[14].DefaultType = REG_DWORD; #134 Parameters[14].DefaultData = &DefaultSampleRate; #135 Parameters[14].DefaultLength = sizeof(ULONG); #136 #137 Parameters[15].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL; #138 Parameters[15].Name = L"CrashOnCtrlScroll"; #139 Parameters[15].EntryContext = &Settings->CrashOnCtrlScroll; #140 Parameters[15].DefaultType = REG_DWORD; #141 Parameters[15].DefaultData = &DefaultCrashOnCtrlScroll; #142 Parameters[15].DefaultLength = sizeof(ULONG); #143
读取注册表里的值。 #144 Status = RtlQueryRegistryValues( #145 RTL_REGISTRY_ABSOLUTE, #146 RegistryPath->Buffer, #147 Parameters, #148 NULL, #149 NULL); #150
保存到Settings里面。 #151 if (NT_SUCCESS(Status)) #152 { #153 /* Check values */ #154 if (Settings->KeyboardDataQueueSize < 1) #155 Settings->KeyboardDataQueueSize = DefaultKeyboardDataQueueSize; #156 if (Settings->MouseDataQueueSize < 1) #157 Settings->MouseDataQueueSize = DefaultMouseDataQueueSize; #158 if (Settings->NumberOfButtons < 1) #159 Settings->NumberOfButtons = DefaultNumberOfButtons; #160 if (Settings->PollingIterations < 0x400) #161 Settings->PollingIterations = DefaultPollingIterations; #162 if (Settings->PollingIterationsMaximum < 0x400) #163 Settings->PollingIterationsMaximum = DefaultPollingIterationsMaximum; #164 if (Settings->ResendIterations < 1) #165 Settings->ResendIterations = DefaultResendIterations; #166 } #167 else if (Status == STATUS_OBJECT_NAME_NOT_FOUND) #168 { #169 /* Registry path doesn't exist. Set defaults */ #170 Settings->KeyboardDataQueueSize = DefaultKeyboardDataQueueSize; #171 Settings->MouseDataQueueSize = DefaultMouseDataQueueSize; #172 Settings->MouseResolution = DefaultMouseResolution; #173 Settings->MouseSynchIn100ns = DefaultMouseSynchIn100ns; #174 Settings->NumberOfButtons = DefaultNumberOfButtons; #175 Settings->PollStatusIterations = DefaultPollStatusIterations; #176 Settings->OverrideKeyboardType = DefaultOverrideKeyboardType; #177 Settings->OverrideKeyboardSubtype = DefaultOverrideKeyboardSubtype; #178 Settings->PollingIterations = DefaultPollingIterations; #179 Settings->PollingIterationsMaximum = DefaultPollingIterationsMaximum; #180 Settings->ResendIterations = DefaultResendIterations; #181 Settings->SampleRate = DefaultSampleRate; #182 Settings->CrashOnCtrlScroll = DefaultCrashOnCtrlScroll; #183 if (!RtlCreateUnicodeString(&Settings->KeyboardDeviceBaseName,DefaultKeyboardDeviceBaseName) #184 || !RtlCreateUnicodeString(&Settings->PointerDeviceBaseName,DefaultPointerDeviceBaseName)) #185 { #186 WARN_(I8042PRT,"RtlCreateUnicodeString() failed/n"); #187 Status = STATUS_NO_MEMORY; #188 } #189 else #190 { #191 Status = STATUS_SUCCESS; #192 } #193 } #194
进行调试输出信息。 #195 if (NT_SUCCESS(Status)) #196 { #197 INFO_(I8042PRT,"KeyboardDataQueueSize : 0x%lx/n",Settings->KeyboardDataQueueSize); #198 INFO_(I8042PRT,"KeyboardDeviceBaseName : %wZ/n",&Settings->KeyboardDeviceBaseName); #199 INFO_(I8042PRT,"MouseDataQueueSize : 0x%lx/n",Settings->MouseDataQueueSize); #200 INFO_(I8042PRT,"MouseResolution : 0x%lx/n",Settings->MouseResolution); #201 INFO_(I8042PRT,"MouseSynchIn100ns : %lu/n",Settings->MouseSynchIn100ns); #202 INFO_(I8042PRT,"NumberOfButtons : 0x%lx/n",Settings->NumberOfButtons); #203 INFO_(I8042PRT,"PointerDeviceBaseName : %wZ/n",&Settings->PointerDeviceBaseName); #204 INFO_(I8042PRT,"PollStatusIterations : 0x%lx/n",Settings->PollStatusIterations); #205 INFO_(I8042PRT,"OverrideKeyboardType : 0x%lx/n",Settings->OverrideKeyboardType); #206 INFO_(I8042PRT,"OverrideKeyboardSubtype : 0x%lx/n",Settings->OverrideKeyboardSubtype); #207 INFO_(I8042PRT,"PollingIterations : 0x%lx/n",Settings->PollingIterations); #208 INFO_(I8042PRT,"PollingIterationsMaximum : %lu/n",Settings->PollingIterationsMaximum); #209 INFO_(I8042PRT,"ResendIterations : 0x%lx/n",Settings->ResendIterations); #210 INFO_(I8042PRT,"SampleRate : %lu/n",Settings->SampleRate); #211 } #212 #213 return Status; #214} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |