Мониторинг реестра с использованием RegNotifyChangeKeyValue - PullRequest
0 голосов
/ 09 апреля 2019

Приведенный ниже код предназначен для отслеживания изменений, произошедших в реестре (добавление, удаление, изменение), ожидание до тех пор, пока не произойдет какое-либо изменение

Теперь ищем вывод, в каком ключе выполняется действие изменения При изменениях в реестре имя ключа должно быть на выходе

void __cdecl _tmain(int argc, TCHAR *argv[])
{
    DWORD  dwFilter = REG_NOTIFY_CHANGE_NAME |
        REG_NOTIFY_CHANGE_ATTRIBUTES |
        REG_NOTIFY_CHANGE_LAST_SET |
        REG_NOTIFY_CHANGE_SECURITY| REG_NOTIFY_THREAD_AGNOSTIC;

    HANDLE hEvent;
    HKEY   hMainKey;
    HKEY   hKey;
    LONG   lErrorCode;


    RegOpenKeyEx(HKEY_LOCAL_MACHINE,
        TEXT("SOFTWARE\\444\\1"), 0, KEY_NOTIFY | KEY_CREATE_SUB_KEY | KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE | KEY_WOW64_64KEY, &hKey);


    // Create an event.
    hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    if (hEvent == NULL)
    {
        _tprintf(TEXT("Error in CreateEvent (%d).\n"), GetLastError());
        return;
    }

    // Watch the registry key for a change of value.
    lErrorCode = RegNotifyChangeKeyValue(hKey,
        TRUE,
        dwFilter,
        hEvent,
        TRUE);
    if (lErrorCode != ERROR_SUCCESS)
    {
        _tprintf(TEXT("Error in RegNotifyChangeKeyValue (%d).\n"), lErrorCode);
        return;
    }

    // Wait for an event to occur.
    _tprintf(TEXT("Waiting for a change in the specified key...\n"));
    if (WaitForSingleObject(hEvent, INFINITE) == WAIT_FAILED)
    {
        _tprintf(TEXT("Error in WaitForSingleObject (%d).\n"), GetLastError());
        return;
    }
    else
    {
        //Get chile events for the event key ... In this case select. Display the key name and values.

        _tprintf(TEXT("\nChange has occurred.\n"));

        std::cout << hEvent << std::endl;
        _tprintf(TEXT("the modified key is",hEvent));//this was commited

        Sleep(2000);
        return;

    }

    // Close the key.
    lErrorCode = RegCloseKey(hKey);
    if (lErrorCode != ERROR_SUCCESS)
    {
        _tprintf(TEXT("Error in RegCloseKey (%d).\n"), GetLastError());
        return;
    }

    // Close the handle.
    if (!CloseHandle(hEvent))
    {
        _tprintf(TEXT("Error in CloseHandle.\n"));
        return;
    }
    system("pause");
}
...