RedFox_4U
驱动大牛
驱动大牛
  • 注册日期2002-11-27
  • 最后登录2003-03-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1556回复:7

应该怎么样来读注册表?

楼主#
更多 发布于:2003-02-17 11:40
参考Chris Cant书上的例子WDM1
1、在wdm1.h中增加
extern UNICODE_STRING servkey;

2、在INIT.CPP中增加
UNICODE_STRING servkey;
....
NTSTATUS DriverEntry{
...
servkey.Buffer = (PWSTR) ExAllocatePool(PagedPool, RegistryPath->Length + sizeof(WCHAR));
if (!servkey.Buffer)
return STATUS_INSUFFICIENT_RESOURCES;
servkey.MaximumLength = RegistryPath->Length + sizeof(WCHAR);
RtlCopyUnicodeString(&servkey, RegistryPath);
...
}

3、在dispatch.cpp中
NTSTATUS Wdm1DeviceControl{
...
case IOCTL_WDM1_GET_REG:
ReadReg(&servkey);
break;
...
}

其中,servkey为我自己定义的一个UNICODE_STRING,目的是为了存储DriverEntry中的参数RegistryPath
ReadReg()为WDM1例子中的文件ReadReg.cpp中的函数void ReadReg( IN PUNICODE_STRING DriverRegistryPath){...}可以读出来注册表中的数据,这个我实验过,在init.cpp中用ReadReg(RegistryPath)通过。
使用wdm1例子附带的测试程序wdm1test,当然是增加了IOCTL_WDM1_GET_REG操作一段的,结果还是重起机器。
------------------------
RedFox_4U
驱动大牛
驱动大牛
  • 注册日期2002-11-27
  • 最后登录2003-03-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-02-17 11:48
注:我做过如下实验
1、在init.cpp的DriverEntry中直接使用ReadReg(RegistryPath)通过
2、在增加了servkey,并已经拷贝了RegistryPath内容后,在init.cpp的DriverEntry中使用ReadReg(&servkey)通过
3、在增加了servkey,并已经拷贝了RegistryPath内容后,在dispatch.cpp的NTSTATUS Wdm1DeviceControl函数中,使用DebugPrint(\"path is %T\",&servkey),结果表明servkey中确实已经存储了正确的RegistryPath
4、在上面实验的基础上,在dispatch.cpp的NTSTATUS Wdm1DeviceControl函数中,再增加ReadReg(&servkey)后不通过

其中,DebugPrint为书上例子的打印工具用于测试。
其中,为了测试dispatch.cpp中的内容,使用测试程序wdm1test
------------------------
ice_fire333
驱动老牛
驱动老牛
  • 注册日期2002-10-08
  • 最后登录2007-08-13
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望4点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-02-17 11:49
看一下DDK,
RtlInitUnicodeString();
RtlZeroMemory();
RtlQueryRegistryValues();
RtlFreeUnicodeString()
赵客缦胡缨,吴钩霜雪明。银鞍照白马,飒沓如流星。   十步杀一人,千里不留行。事了拂衣去,深藏身与名。   闲过信陵饮,脱剑膝前横。将炙啖朱亥,持觞劝侯嬴。   三杯吐然诺,五岳倒为轻。眼花耳热后,意气素霓生。   救赵挥金槌,邯郸先震惊。千秋二壮士,煊赫大梁城。   纵死侠骨香,不惭世上英。谁能书阁下。白首太玄经。
RedFox_4U
驱动大牛
驱动大牛
  • 注册日期2002-11-27
  • 最后登录2003-03-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-02-17 11:51
打包上传我的程序
这个是我修改后的wdm1
附件名称/大小 下载次数 最后更新
2003-02-17_wdm1.rar (117KB)  11
------------------------
ice_fire333
驱动老牛
驱动老牛
  • 注册日期2002-10-08
  • 最后登录2007-08-13
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望4点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-02-17 11:52
 
4、在上面实验的基础上,在dispatch.cpp的NTSTATUS Wdm1DeviceControl函数中,再增加ReadReg(&servkey)后不通过


这个
if (IrqLevel == PASSIVE_LEVEL)
                {
                 ReadReg();
       };
赵客缦胡缨,吴钩霜雪明。银鞍照白马,飒沓如流星。   十步杀一人,千里不留行。事了拂衣去,深藏身与名。   闲过信陵饮,脱剑膝前横。将炙啖朱亥,持觞劝侯嬴。   三杯吐然诺,五岳倒为轻。眼花耳热后,意气素霓生。   救赵挥金槌,邯郸先震惊。千秋二壮士,煊赫大梁城。   纵死侠骨香,不惭世上英。谁能书阁下。白首太玄经。
RedFox_4U
驱动大牛
驱动大牛
  • 注册日期2002-11-27
  • 最后登录2003-03-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-02-17 11:52
这个是用于测试dispatch的程序
附件名称/大小 下载次数 最后更新
2003-02-17_wdm1test.rar (11KB)  6
------------------------
ice_fire333
驱动老牛
驱动老牛
  • 注册日期2002-10-08
  • 最后登录2007-08-13
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望4点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-02-17 11:55
readreg only run at passivelevel.
赵客缦胡缨,吴钩霜雪明。银鞍照白马,飒沓如流星。   十步杀一人,千里不留行。事了拂衣去,深藏身与名。   闲过信陵饮,脱剑膝前横。将炙啖朱亥,持觞劝侯嬴。   三杯吐然诺,五岳倒为轻。眼花耳热后,意气素霓生。   救赵挥金槌,邯郸先震惊。千秋二壮士,煊赫大梁城。   纵死侠骨香,不惭世上英。谁能书阁下。白首太玄经。
RedFox_4U
驱动大牛
驱动大牛
  • 注册日期2002-11-27
  • 最后登录2003-03-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-02-18 08:48
ReadReg这个函数必须在PASSIVELEVEL运行?

Dispatch例程中是什么中断级?Dispatch级?

那么,我想要在Dispatch中调用ReadReg应该怎么样做呢?
------------------------
游客

返回顶部