AX控件IE相關注冊表修改封裝

/********************************************************************
 created: 2012:5:10   13:04:48
 author:  Insert
 purpose: IE各種註冊表更改
*********************************************************************/
#ifndef __IEREGISTER__H__EC92A9C2_3010_43D0_9E8D_946F9BA37839__
#define __IEREGISTER__H__EC92A9C2_3010_43D0_9E8D_946F9BA37839__

#include <Windows.h>
#include <assert.h>
#include <tchar.h>

#include "shlwapi.h"
#pragma comment(lib, "shlwapi.lib")

#include <intrin.h>
#pragma intrinsic(_ReturnAddress)


#pragma warning(push)
#pragma warning(disable : 4996)

class CIERegister
{
public:
 typedef enum ERegisterType
 {
  RElevationPolicy,//阻止ie保護模式對話框
  RIE7Stats,//阻止ie7安全提示
  RIE8Stats,//阻止ie8安全提示
  RActiveXCompatibility,//解除ie對控件的屏蔽(不出現在加載項)
  RSettings, //解除IE對控件的禁用(加載項中爲禁用)
  RMax,
  RAll,//更改全部相關注冊表
 }ERT;

public:
 static HRESULT Register(HMODULE module = NULL, ERT ert = RAll)
 {
  assert((ert >= RElevationPolicy && ert < RMax) || ert == RAll);

  HMODULE hm = module;

  if (NULL == hm)
  {
   void *callerAddress = _ReturnAddress();
   if(FALSE == ::GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCWSTR)callerAddress, &hm))
   {
    assert(FALSE && "Get module failed!");
    return E_FAIL;
   }
  }

  RegisterFunctionPtr RegisterFunction[RMax] = {
   RegisterElevationPolicy,
   RegisterIE7Stats,
   RegisterIE8Stats,
   RegisterActiveXCompatibility,
   RegisterSettings
  };

  if (RAll != ert)
  {
   return RegisterFunction[ert](hm);
  }

  HRESULT hr[RMax] = {S_OK};

  for (int i = 0; i < RMax; ++i)
  {
   hr[i] = RegisterFunction[i](hm);
  }

  for (int i = 0; i < RMax; ++i)
  {
   if (FAILED(hr[i]))
   {
    return E_FAIL;
   }
  }

  for (int i = 0; i < RMax; ++i)
  {
   if (S_FALSE == hr[i])
   {
    return S_FALSE;
   }
  }

  return S_OK;
 }

private:
 //阻止ie保護模式對話框
 static HRESULT RegisterElevationPolicy(HMODULE module)
 {
  _SEP sep[] = {
   {TEXT("GUID"), TEXT("ToExecuteModule.exe"), (BYTE)_SEP::POLICYVALUE},
  };
  int iSepNum = sizeof(sep) / sizeof(_SEP);

  CONST TCHAR* cszRegisterPath = TEXT("Software\\Microsoft\\Internet Explorer\\Low Rights\\ElevationPolicy\\");

  TCHAR szModulePath[MAX_PATH] = {0};
  if (0 == ::GetModuleFileName(module, szModulePath, MAX_PATH))
  {
   assert(FALSE && "Get the module full path failed!");
   return E_FAIL;
  }
  if (FALSE == ::PathAppend(szModulePath, TEXT("..")))
  {
   assert(FALSE && "Get the module path failed!");
   return E_FAIL;
  }
  ::PathRemoveBackslash(szModulePath);

  HRESULT hr = S_OK;
  HKEY hk;
  for (int i = 0; i < iSepNum; ++i)
  {
   TCHAR szRegisterFullPath[MAX_PATH] = {0};
   _tcscpy(szRegisterFullPath, cszRegisterPath);
   _tcscat(szRegisterFullPath, sep[i].guid);

   if (ERROR_SUCCESS == ::RegCreateKey(HKEY_CURRENT_USER, szRegisterFullPath, &hk))
   {
    ::RegSetValueEx(hk, TEXT("AppName"), 0, REG_SZ, (unsigned char*)sep[i].name, (ULONG)sizeof(TCHAR) * _tcslen(sep[i].name));
    ::RegSetValueEx(hk, TEXT("AppPath"), 0, REG_SZ, (unsigned char*)szModulePath, (ULONG)sizeof(TCHAR) * _tcslen(szModulePath));
    ::RegSetValueEx(hk, TEXT("Policy"), 0, REG_DWORD, (LPBYTE)&sep[i].Policy, sizeof(sep[i].Policy));
    ::RegCloseKey(hk);
    hk = NULL;
   }
   else
   {
    hr = S_FALSE;
   }
  }

  return hr;
 }

 //阻止ie7安全提示
 static HRESULT RegisterIE7Stats(HMODULE /*module*/)
 {
  _SIS7 sis[] =
  {
   {TEXT("CLSID"), (BYTE)_SIS7::FLAGSVALUE}
  };
  int iSisNum = sizeof(sis) / sizeof(_SIS7);


  CONST TCHAR* cszRegisterPathForward = TEXT("SoftWare\\Microsoft\\Windows\\CurrentVersion\\Ext\\Stats\\");
  CONST TCHAR* cszRegisterPathBack = TEXT("\\iexplore");

  HRESULT hr = S_OK;
  HKEY hk;

  for (int i = 0; i < iSisNum; ++i)
  {
   TCHAR szRegisterFullPath[MAX_PATH] = {0};
   _tcscpy(szRegisterFullPath, cszRegisterPathForward);
   _tcscat(szRegisterFullPath, sis[i].classid);
   _tcscat(szRegisterFullPath, cszRegisterPathBack);

   if(ERROR_SUCCESS == ::RegOpenKey(HKEY_CURRENT_USER, szRegisterFullPath, &hk))    
   {
    ::RegSetValueEx(hk, _T("Flags"), 0, REG_DWORD, (LPBYTE)&sis[i].flags, sizeof(sis[i].flags));
    ::RegCloseKey(hk);
    hk = NULL;
   }
   else
   {
    if(ERROR_SUCCESS == ::RegCreateKey(HKEY_CURRENT_USER, szRegisterFullPath, &hk))
    {
     ::RegSetValueEx(hk, _T("Flags"), 0, REG_DWORD, (LPBYTE)&sis[i].flags, sizeof(sis[i].flags));
     ::RegCloseKey(hk);
     hk = NULL;
    }
    else
    {
     hr = S_FALSE;
    }
   }
  }

  return hr;
 }

 //阻止ie8安全提示
 static HRESULT RegisterIE8Stats(HMODULE /*module*/)
 {
  _SIS8 sis[] =
  {
   {TEXT("CLSID")}
  };
  int iSisNum = sizeof(sis) / sizeof(_SIS8);

  CONST TCHAR* cszRegisterPathForward = TEXT("SoftWare\\Microsoft\\Windows\\CurrentVersion\\Ext\\Stats\\");
  CONST TCHAR* cszRegisterPathBack = TEXT("\\iexplore\\AllowedDomains");
  CONST TCHAR* cszRegisterPathBackBack = TEXT("\\*");

  HRESULT hr = S_OK;
  HKEY hk;

  for (int i = 0; i < iSisNum; ++i)
  {
   TCHAR szRegisterFullPath[MAX_PATH] = {0};
   _tcscpy(szRegisterFullPath, cszRegisterPathForward);
   _tcscat(szRegisterFullPath, sis[i].classid);
   _tcscat(szRegisterFullPath, cszRegisterPathBack);

   if(ERROR_SUCCESS == ::RegCreateKey(HKEY_CURRENT_USER, szRegisterFullPath, &hk))
   {
    ::RegCloseKey(hk);
    hk = NULL;
   }
   else
   {
    hr = S_FALSE;
   }

   _tcscat(szRegisterFullPath, cszRegisterPathBackBack);

   if(ERROR_SUCCESS == ::RegCreateKey(HKEY_CURRENT_USER, szRegisterFullPath, &hk))
   {
    ::RegCloseKey(hk);
    hk = NULL;
   }
   else
   {
    hr = S_FALSE;
   }
  }

  return S_OK;
 }

 //解除ie對控件的屏蔽(不出現在加載項)
 static HRESULT RegisterActiveXCompatibility(HMODULE /*module*/)
 {
  _SAXC saxc[] =
  {
   {TEXT("CLSID")}
  };
  int iSacxNum = sizeof(saxc) / sizeof(_SAXC);

  CONST TCHAR* cszRegisterPath = TEXT("Software\\Microsoft\\Internet Explorer\\ActiveX Compatibility\\");

  HRESULT hr = S_OK;

  for (int i = 0; i < iSacxNum; ++i)
  {
   TCHAR szRegisterFullPath[MAX_PATH] = {0};
   _tcscpy(szRegisterFullPath, cszRegisterPath);
   _tcscat(szRegisterFullPath, saxc[i].classid);

   if (ERROR_SUCCESS != ::RegDeleteKey(HKEY_LOCAL_MACHINE, szRegisterFullPath))
   {
    hr = S_FALSE;
   }
  }

  return S_OK;
 }

 //解除IE對控件的禁用(加載項中爲禁用)
 static HRESULT RegisterSettings(HMODULE /*module*/)
 {
  _SS ss[] =
  {
   {TEXT("CLSID")}
  };
  int iSsNum = sizeof(ss) / sizeof(_SS);

  CONST TCHAR* cszRegisterPath = TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Ext\\Settings\\");

  HRESULT hr = S_OK;

  for (int i = 0; i < iSsNum; ++i)
  {
   TCHAR szRegisterFullPath[MAX_PATH] = {0};
   _tcscpy(szRegisterFullPath, cszRegisterPath);
   _tcscat(szRegisterFullPath, ss[i].classid);

   if (ERROR_SUCCESS != ::RegDeleteKey(HKEY_LOCAL_MACHINE, szRegisterFullPath))
   {
    hr = S_FALSE;
   }
  }

  return S_OK;
 }

private:
 typedef HRESULT (*RegisterFunctionPtr) (HMODULE);

 typedef struct SElevationPolicy
 {
  TCHAR   guid[MAX_PATH];
  TCHAR   name[MAX_PATH];
  BYTE    Policy;
  static const int POLICYVALUE = 3;
 }_SEP;

 typedef struct SIE7Stats
 {
  TCHAR   classid[MAX_PATH];
  BYTE    flags;
  static const int FLAGSVALUE = 4;
 }_SIS7;

 typedef struct SIE8Stats
 {
  TCHAR   classid[MAX_PATH];
 }_SIS8;

 typedef struct SActiveXCompatibility
 {
  TCHAR   classid[MAX_PATH];
 }_SAXC;

 typedef struct SSettings
 {
  TCHAR   classid[MAX_PATH];
 }_SS;

private:
 CIERegister(){}
 ~CIERegister(){}
};

#pragma warning(pop)

#endif

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章