Как записать 32-битный D-Word в реестр Windows на C++
Я пытаюсь отключить Защитника Windows с помощью приложения C32 Win32API. Для этого мне нужно записать D Word в реестр (DisableAntiSpyware = 1). Я всегда делаю это вручную после установки новой Windows. Вот мой код, но он не работает. Может быть, кто-то может сказать мне, почему или что не так с этим. Спасибо!
Хорошо, я немного изменил код, все еще не работает...
case 1:
//::MessageBeep(MB_ICONERROR);
::MessageBox(hWnd, L"Button was Pressed",L"Button was clicked?",MB_OK);
LONG
SetRegValue
(
const wchar_t* path
, const wchar_t *name
, const BYTE *value
);
{
LONG status;
HKEY hKey;
DWORD value = 0x00000001;
status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"\\SOFTWARE\\Policies\\Microsoft\\Windows Defender", 0, KEY_ALL_ACCESS, &hKey);
if ((status == ERROR_SUCCESS) && (hKey != NULL))
{
status = RegSetValueEx(hKey, L"test", 0, REG_DWORD, (const BYTE*)&value,sizeof(value));
RegCloseKey(hKey);
}
return status;
::MessageBeep(MB_ICONERROR);
}
}
}
break;
2 ответа
Открывая ключ реестра, вы должны запрашивать только те права, которые вам действительно нужны. Так замени KEY_ALL_ACCESS
с KEY_SET_VALUE
вместо этого, поскольку все, что вы делаете, - это записываете значение. Но даже в этом случае вам может потребоваться запустить приложение с повышенными разрешениями для записи в HKEY_LOCAL_MAHCINE
, если вы заранее не предоставите учетной записи пользователя право записи для ключа Защитника Windows.
Кроме того, если ваш код скомпилирован как 32-битный и работает на 64-битной системе, и ему нужно записать в 64-битный реестр, то вы должны включить KEY_WOW64_64KEY
в противном случае вы можете быть подвержены Рефлексу Реестра/ Перенаправлению Реестра.
Попробуйте что-то более похожее на это:
case 1:
{
::MessageBox(hWnd, L"Button was Pressed", L"Button was clicked?", MB_OK);
DWORD value = 1;
DWORD flags = KEY_SET_VALUE;
#if !defined(_WIN64)
BOOL bIsWow64Process = FALSE;
if (IsWow64Process(GetCurrentProcess(), &bIsWow64Process) && bIsWow64Process)
flags |= KEY_WOW64_64KEY;
#endif
HKEY hKey;
LONG status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"\\SOFTWARE\\Policies\\Microsoft\\Windows Defender", 0, flags, &hKey);
if ((status == ERROR_SUCCESS) && (hKey != NULL))
{
status = RegSetValueEx(hKey, L"DisableAntiSpyware", 0, REG_DWORD, (const BYTE*)&value, sizeof(value));
RegCloseKey(hKey);
}
::MessageBeep(MB_ICONERROR);
}
break;
Вы не можете написать на любой ключ в HKEY_LOCAL_MACHINE
если программа не запущена с повышенными привилегиями, то есть в режиме администратора. Призыв к RegOpenKeyEx
или же RegSetValueEx
не удастся.