专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »编程综合 » 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  }


标签:reactos
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: