意外的RegNotifyChangeKeyValue()行为

时间:2012-02-17 11:16:07

标签: windows winapi

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永远不会被通知。

有人可以为此行为提供解释,或者最好是 指向已发布代码中的错误?

0 个答案:

没有答案