ハイブのロード/アンロードを行います。RegLoadKey()関数でハイブのロード、 RegUnLoadKey()関数でハイブのアンロードを行う事が出来ます。 ハイブのロード/アンロードには、管理者権限とSE_RESTORE_NAME特権が必要です。
#include <stdio.h> #include <tchar.h> #include <iostream> #include <windows.h> #include <aclapi.h> /* 特権設定する */ HRESULT EnablePrivilege ( TCHAR* wpPrivilegeName , BOOL bEnable ) { BOOL bRet; // トークンハンドル HANDLE hToken; /* プロセスに関連付けられているアクセストークンを開く */ bRet = ::OpenProcessToken( GetCurrentProcess() , 0 // | TOKEN_ASSIGN_PRIMARY // | TOKEN_DUPLICATE // | TOKEN_IMPERSONATE | TOKEN_QUERY // | TOKEN_QUERY_SOURCE | TOKEN_ADJUST_PRIVILEGES // | TOKEN_ADJUST_GROUPS // | TOKEN_ADJUST_DEFAULT // | TOKEN_ADJUST_SESSIONID , &hToken ); if ( 0 == bRet ) { // エラー return( ::HRESULT_FROM_WIN32( ::GetLastError() ) ); } // ローカル一意識別子 LUID tLuid; /* 指定されたシステムで使われているローカル一意識別子(LUID)を取得 */ bRet = LookupPrivilegeValue( NULL // システムを指定する文字列のアドレス , wpPrivilegeName // 特権を指定する文字列のアドレス , &tLuid // ローカル一意識別子のアドレス ); if ( 0 == bRet ) { // エラー DWORD dwLastError = ::GetLastError(); ::CloseHandle( hToken ); return( ::HRESULT_FROM_WIN32( dwLastError ) ); } TOKEN_PRIVILEGES tTokenPrivileges; tTokenPrivileges.PrivilegeCount = 1; tTokenPrivileges.Privileges[ 0 ].Luid = tLuid; tTokenPrivileges.Privileges[ 0 ].Attributes = ( FALSE != bEnable )? SE_PRIVILEGE_ENABLED : 0; /* 指定したアクセストークン内の特権を設定 */ bRet = ::AdjustTokenPrivileges( hToken , FALSE , &tTokenPrivileges , sizeof( tTokenPrivileges ) , NULL , NULL ); if ( 0 == bRet ) { // エラー DWORD dwLastError = ::GetLastError(); ::CloseHandle( hToken ); return( ::HRESULT_FROM_WIN32( dwLastError ) ); } // トークンハンドルを閉じる ::CloseHandle( hToken ); // 正常終了 return( S_OK ); } /* ハイブのロード/アンロード */ int _tmain ( int argc , _TCHAR* argv[] ) { HRESULT hResult; // 標準出力にユニコード出力する setlocale( LC_ALL, "Japanese" ); // 特権を設定する EnablePrivilege( SE_RESTORE_NAME, TRUE ); DWORD dwResult; /* ハイブのロード */ { dwResult = ::RegLoadKey( HKEY_LOCAL_MACHINE // 開いているレジストリキーのハンドル , L"TestHiveKeyName" // サブキーの名前 , L"i:¥¥TestData¥¥SYSTEM" // レジストリファイルパス ); if ( ERROR_SUCCESS != dwResult ) { // エラー hResult = ::HRESULT_FROM_WIN32( dwResult ); } } /* この時点で、レジストリのHKEY_LOCAL_MACHINE/TestHiveKeyNameへ指定した レジストリファイルがハイブとしてアクセス可能になります。 (※実行結果を参照) */ /* ハイブのアンロード */ { // 指定されたキーとそのサブキーを、レジストリから削除します。 dwResult = ::RegUnLoadKey( HKEY_LOCAL_MACHINE // 開いているレジストリキーのハンドル , L"TestHiveKeyName" // 削除するべきサブキー ); if ( ERROR_SUCCESS != dwResult ) { // エラー hResult = ::HRESULT_FROM_WIN32( dwResult ); } } // 正常終了 return( 0 ); }