DXGL r213 - Code Review

Jump to navigation Jump to search
Repository:DXGL
Revision:r212‎ | r213 | r214 >
Date:22:18, 13 July 2012
Author:admin
Status:new
Tags:
Comment:
Detect and delete incompatible registry keys.
Modified paths:
  • /cfgmgr/cfgmgr.cpp (modified) (history)
  • /cfgmgr/stdafx.h (modified) (history)

Diff [purge]

Index: cfgmgr/cfgmgr.cpp
@@ -304,6 +304,56 @@
305305 RegCreateKeyEx(HKEY_CURRENT_USER,regkey.c_str(),0,NULL,0,KEY_ALL_ACCESS,NULL,&hKey,NULL);
306306 ReadSettings(hKey,cfg,NULL,false,true,NULL);
307307 RegCloseKey(hKey);
 308+ hKey = NULL;
 309+ HMODULE hKernel32 = LoadLibrary(_T("kernel32.dll"));
 310+ BOOL (WINAPI *iswow64)(HANDLE,PBOOL) = NULL;
 311+ iswow64 = (BOOL(WINAPI*)(HANDLE,PBOOL))GetProcAddress(hKernel32,"IsWow64Process");
 312+ BOOL is64 = FALSE;
 313+ if(iswow64) iswow64(GetCurrentProcess(),&is64);
 314+ FreeLibrary(hKernel32);
 315+ LRESULT error;
 316+ if(is64) error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers"),0,KEY_READ|KEY_WOW64_64KEY,&hKey);
 317+ else error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers"),0,KEY_READ,&hKey);
 318+ if(error == ERROR_SUCCESS)
 319+ {
 320+ GetModuleFileName(NULL,filename,MAX_PATH);
 321+ TCHAR buffer[1024];
 322+ ZeroMemory(buffer,1024*sizeof(TCHAR));
 323+ DWORD sizeout = 1024*sizeof(TCHAR);
 324+ if(RegQueryValueEx(hKey,filename,NULL,NULL,(LPBYTE)buffer,&sizeout) == ERROR_SUCCESS)
 325+ {
 326+ if(_tcsstr(buffer,_T("DWM8And16BitMitigation")))
 327+ {
 328+ MessageBox(NULL,_T("DXGL has detected an incompatible AppCompat flag for the program you are currently running. To continue, the registry value must be deleted.\nIf you see a UAC prompt, you must click Yes."),
 329+ _T("AppCompat error"),MB_OK|MB_ICONHAND);
 330+ error = RegDeleteValue(hKey,filename);
 331+ if(error == ERROR_ACCESS_DENIED)
 332+ {
 333+ tstring command;
 334+ if(is64) command.assign(_T("DELETE \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers\" /reg:64 /f /v "));
 335+ else command.assign(_T("DELETE \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers\" /f /v "));
 336+ command.append(filename);
 337+ SHELLEXECUTEINFO info;
 338+ ZeroMemory(&info,sizeof(SHELLEXECUTEINFO));
 339+ info.cbSize = sizeof(SHELLEXECUTEINFO);
 340+ info.lpVerb = _T("runas");
 341+ info.lpFile = _T("reg.exe");
 342+ info.lpParameters = command.c_str();
 343+ info.nShow = SW_SHOWNORMAL;
 344+ info.fMask = SEE_MASK_NOCLOSEPROCESS;
 345+ ShellExecuteEx(&info);
 346+ WaitForSingleObject(info.hProcess,INFINITE);
 347+ GetExitCodeProcess(info.hProcess,(LPDWORD)&error);
 348+ }
 349+ if(!error)
 350+ {
 351+ MessageBox(NULL,_T("Registry value successfully deleted. Please restart the program."),_T("Success"),MB_OK|MB_ICONINFORMATION);
 352+ exit(0);
 353+ }
 354+ else MessageBox(NULL,_T("Registry value could not be deleted. Your program may crash as a result."),_T("Error"),MB_OK|MB_ICONWARNING);
 355+ }
 356+ }
 357+ }
308358 }
309359 void GetGlobalConfig(DXGLCFG *cfg)
310360 {
Index: cfgmgr/stdafx.h
@@ -23,6 +23,7 @@
2424 #include <stdlib.h>
2525 #include <cstdio>
2626 #include <Windows.h>
 27+#include <ShellAPI.h>
2728 #include <string>
2829 #ifndef LSTATUS
2930 typedef LONG LSTATUS;