Неожиданное поведение RegNotifyChangeKeyValue () - PullRequest
2 голосов
/ 17 февраля 2012

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 никогда не уведомляется.

Может ли кто-нибудь дать объяснение этому поведению или, предпочтительно, указать на ошибку в опубликованном коде?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...