ハイブのロード/アンロードを行います。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 );
}
