阅读:1556回复:7
应该怎么样来读注册表?
参考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操作一段的,结果还是重起机器。 |
|
|
沙发#
发布于: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 |
|
|
板凳#
发布于:2003-02-17 11:49
看一下DDK,
RtlInitUnicodeString(); RtlZeroMemory(); RtlQueryRegistryValues(); RtlFreeUnicodeString() |
|
|
地板#
发布于:2003-02-17 11:51
打包上传我的程序
这个是我修改后的wdm1 |
|
|
地下室#
发布于:2003-02-17 11:52
4、在上面实验的基础上,在dispatch.cpp的NTSTATUS Wdm1DeviceControl函数中,再增加ReadReg(&servkey)后不通过 这个 if (IrqLevel == PASSIVE_LEVEL) { ReadReg(); }; |
|
|
5楼#
发布于:2003-02-17 11:52
这个是用于测试dispatch的程序
|
|
|
6楼#
发布于:2003-02-17 11:55
readreg only run at passivelevel.
|
|
|
7楼#
发布于:2003-02-18 08:48
ReadReg这个函数必须在PASSIVELEVEL运行?
Dispatch例程中是什么中断级?Dispatch级? 那么,我想要在Dispatch中调用ReadReg应该怎么样做呢? |
|
|