能力值:
( LV2,RANK:10 )
|
-
-
2 楼
在 DISPATCH_LEVEL 的 IRQL 下访问注册表的函数是不推荐的,因为它可能会导致系统性能下降,安全性隐患以及蓝屏等严重问题发生。因此,在内核中访问注册表的函数应该在 PASSIVE_LEVEL 或者低于 PASSIVE_LEVEL 的 IRQL 中进行。如果一定需要在 DISPATCH_LEVEL 中访问注册表,可以使用 CmRegisterCallbackEx 函数在 PASSIVE_LEVEL 或者低于 PASSIVE_LEVEL 的 IRQL 中注册回调函数,回调函数可以在 DISPATCH_LEVEL 的 IRQL 下执行。 以下是一个使用 CmRegisterCallbackEx 函数注册注册表回调函数的示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | #include <ntddk.h>
#define REG_NOTIFY_CLASS_KEY 3
#define REG_NOTIFY_CLASS_VALUE 4
VOID RegistryCallback(
IN PVOID CallbackContext,
IN PVOID Argument1,
IN PVOID Argument2
)
{
PUNICODE_STRING pKeyName = (PUNICODE_STRING)Argument1;
if (pKeyName != NULL)
{
KdPrint(( "registry key %wZ is modified\n" , pKeyName));
}
}
VOID DriverUnload(
IN PDRIVER_OBJECT DriverObject
)
{
ULONG ulRegCookie = 0;
CmUnRegisterCallback(ulRegCookie);
}
NTSTATUS DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
{
NTSTATUS status;
status = CmRegisterCallbackEx(
RegistryCallback,
&ExNotifyCallback,
DriverObject,
NULL,
&ulRegCookie,
NULL
);
if (!NT_SUCCESS(status))
{
KdPrint(( "Failed to register registry callback function\n" ));
}
DriverObject->DriverUnload = DriverUnload;
return status;
}
|
在以上代码中,我们在驱动入口函数(DriverEntry)中使用 CmRegisterCallbackEx 函数注册了一个回调函数(RegistryCallback),并将当前驱动对象(DriverObject)作为上下文参数传递给回调函数。回调函数会在任意进程在注册表上作出更改时被调用。 在此示例代码中,我们只是简单地使用 KdPrint 函数输出了更改的键名,实际使用中需要根据需要修改回调函数具体实现。 请注意,此示例代码作为一个演示,不适用于所有情况。具体实现需要根据实际情况进行修改和完善。
|
能力值:
( LV9,RANK:195 )
|
-
-
3 楼
caocaofff
在 DISPATCH_LEVEL 的 IRQL 下访问注册表的函数是不推荐的,因为它可能会导致系统性能下降,安全性隐患以及蓝屏等严重问题发生。因此,在内核中访问注册表的函数应该在 PASSIVE_LE ...
这是chatgpt?
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
牛牛牛
|
|
|