わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。

ハイブのロード/アンロード

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



実行結果







わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。