RegNotifyChangeKeyValue()
函数可以提供对注册表项安全性更改的警报。
我可能错误地预计它会提醒调用者是否有权限
调用RegNotifyChangeKeyValue()
的用户被更改为拒绝
用户阅读权限。
从测试开始,它不会通知调用者这种变化,也不会
告知用户对密钥的任何后续更改也不会失败
无论如何:来电者完全没有意识到它不再存在
通知任何变化。
代码(stackc.c):
#include <windows.h>
#include <stdio.h>
int main()
{
HKEY h_key;
HANDLE h_event;
DWORD last_error = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
"Software\\stackoverflow-testing-key",
0,
0,
REG_OPTION_NON_VOLATILE,
KEY_READ,
0,
&h_key,
0);
if (ERROR_SUCCESS != last_error)
{
fprintf(stderr, "Failed to create key: %d\n", last_error);
exit(1);
}
RegCloseKey(h_key);
last_error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"Software\\stackoverflow-testing-key",
0,
KEY_NOTIFY,
&h_key);
if (ERROR_SUCCESS != last_error)
{
fprintf(stderr, "Failed to open key: %d\n", last_error);
exit(1);
}
h_event = CreateEvent(0, FALSE, FALSE, 0);
if (h_event)
{
int change_count = 0;
while (change_count < 2)
{
DWORD wait_status;
last_error = RegNotifyChangeKeyValue(
h_key,
FALSE,
REG_NOTIFY_CHANGE_NAME |
REG_NOTIFY_CHANGE_ATTRIBUTES |
REG_NOTIFY_CHANGE_LAST_SET |
REG_NOTIFY_CHANGE_SECURITY,
h_event,
TRUE);
if (ERROR_SUCCESS != last_error)
{
fprintf(stderr, "Failed to notify: %d\n", last_error);
break;
}
wait_status = WaitForSingleObject(h_event, INFINITE);
if (WAIT_FAILED == wait_status)
{
fprintf(stderr, "Wait failed: %d\n", GetLastError());
break;
}
if (WAIT_OBJECT_0 == wait_status)
{
printf("Registry key changed!\n");
change_count++;
}
}
CloseHandle(h_event);
}
RegCloseKey(h_key);
RegDeleteKey(HKEY_LOCAL_MACHINE, "Software\\stackoverflow-testing-key");
return 0;
}
构建命令:
cl.exe -nologo -c -DWIN32 -Zi -MT -W4 -Ox stackc.c -Fo./stackc.obj
link.exe -NOLOGO -INCREMENTAL:NO -OUT:stackc.exe stackc.obj Kernel32.lib advapi32.lib
我正在运行Windows XP Service Pack3 x86。
测试我执行stackc.exe
并运行注册表编辑器
(Start->Run "regedit.exe"
),浏览到
HKEY_LOCAL_MACHINE\Software\stackoverflow-testing-key
并右键单击并选中Permissions
,选择用户
我正在执行stackc.exe
并拒绝读取权限。
然后我为密钥添加了一个值,stackc.exe
永远不会被通知。
有人可以为此行为提供解释,或者最好是 指向已发布代码中的错误?