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: НЕТ -OUT: stackc.exe stackc.obj Kernel32.lib advapi32.lib
Я использую Windows XP с пакетом обновления 3 x86.
Для тестирования я выполнил stackc.exe
и запустил редактор реестра (Start->Run "regedit.exe"
), перешел к HKEY_LOCAL_MACHINE\Software\stackoverflow-testing-key
, щелкнул правой кнопкой мыши и выбрал Permissions
, выбрал пользователя, которого я выполнял stackc.exe
, и отказал в разрешении на чтение.Затем я добавил значение к ключу, и stackc.exe
никогда не уведомляется.
Может ли кто-нибудь дать объяснение этому поведению или, предпочтительно, указать на ошибку в опубликованном коде?