首页 »编程综合 » reactos:reactos操作系统实现(91) »正文
reactos:reactos操作系统实现(91)
来源: 发布时间:星期一, 2009年9月28日 浏览:0次 评论:0
驱动 很多配置参数是保存在注册表里 比如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 DefaultPoerDeviceBaseName = L"PoerPort"; #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 we're #026 * running a debug build or a normal build. #027 */ #028 #def DBG #029 DefaultCrashOnCtrlScroll = 1; #030 # #031 DefaultCrashOnCtrlScroll = 0; #032 #end #033
化参数内存 #034 RtlZeroMemory(Parameters, (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 = (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 = (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 = (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 = (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 = (ULONG); #080 #081 Parameters[7].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL; #082 Parameters[7].Name = L"PoerDeviceBaseName"; #083 Parameters[7].EntryContext = &Settings->PoerDeviceBaseName; #084 Parameters[7].DefaultType = REG_SZ; #085 Parameters[7].DefaultData = (PVOID)DefaultPoerDeviceBaseName; #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 = (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 = (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 = (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 = (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 = (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 = (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 = (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 = (ULONG); #143
读取注册表里 值 #144 Status = RtlQueryRegistryValues( #145 RTL_REGISTRY_ABSOLUTE, #146 RegistryPath->Buffer, #147 Parameters, #148 NULL, #149 NULL); #150 保存到Settings里面 #151 (NT_SUCCESS(Status)) #152 { #153 /* Check values */ #154 (Settings->KeyboardDataQueueSize < 1) #155 Settings->KeyboardDataQueueSize = DefaultKeyboardDataQueueSize; #156 (Settings->MouseDataQueueSize < 1) #157 Settings->MouseDataQueueSize = DefaultMouseDataQueueSize; #158 (Settings->NumberOfButtons < 1) #159 Settings->NumberOfButtons = DefaultNumberOfButtons; #160 (Settings->PollingIterations < 0x400) #161 Settings->PollingIterations = DefaultPollingIterations; #162 (Settings->PollingIterationsMaximum < 0x400) #163 Settings->PollingIterationsMaximum = DefaultPollingIterationsMaximum; #164 (Settings->ResendIterations < 1) #165 Settings->ResendIterations = DefaultResendIterations; #166 } #167 (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 (!RtlCreateUnicodeString(&Settings->KeyboardDeviceBaseName, DefaultKeyboardDeviceBaseName) #184 || !RtlCreateUnicodeString(&Settings->PoerDeviceBaseName, DefaultPoerDeviceBaseName)) #185 { #186 WARN_(I8042PRT, "RtlCreateUnicodeString failed\n"); #187 Status = STATUS_NO_MEMORY; #188 } #189 #190 { #191 Status = STATUS_SUCCESS; #192 } #193 } #194
进行调试输出信息 #195 (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, "PoerDeviceBaseName : %wZ\n", &Settings->PoerDeviceBaseName); #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 Status; #214 }
相关文章
读者评论
发表评论
|
|