/* * getpriv.c - Get privilege to save/restore registry subkeys. * */ #include #include "regerror.h" int adjust_prcs_priv(HANDLE prcs_token, char *priv_name) { LUID priv_id; TOKEN_PRIVILEGES *priv_array; /* 付与する特権構造体を作成する */ if (!LookupPrivilegeValue(NULL, priv_name, &priv_id)) { print_win32_error("LookupPrivilegeValue", GetLastError()); return 0; } if (!(priv_array = (TOKEN_PRIVILEGES *)malloc(sizeof(TOKEN_PRIVILEGES)))) { print_win32_error("malloc", ERROR_NOT_ENOUGH_MEMORY); SetLastError(ERROR_NOT_ENOUGH_MEMORY); return 0; } priv_array->PrivilegeCount = 1; priv_array->Privileges[0].Luid = priv_id; priv_array->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; /* アクセストークンに特権を付与する */ if (!AdjustTokenPrivileges(prcs_token, FALSE, priv_array, 0, NULL, NULL)) { print_win32_error("AdjustTokenPrivileges", GetLastError()); free(priv_array); return 0; } /* 特権構造体を解放する */ free(priv_array); return 1; } int get_priv(char *priv_name) { HANDLE process; HANDLE prcs_token; /* カレントスレッドをオープンする */ if (!(process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId()))) { print_win32_error("OpenProcess", GetLastError()); return 0; } /* カレントスレッドのアクセストークンを取得する */ if (!OpenProcessToken(process, TOKEN_ADJUST_PRIVILEGES, &prcs_token)) { print_win32_error("OpenProcessToken", GetLastError()); CloseHandle(process); return 0; } /* カレントスレッドのアクセストークンに特権を付与する */ if (!adjust_prcs_priv(prcs_token, priv_name)) { CloseHandle(prcs_token); CloseHandle(process); return 0; } /* カレントスレッドのアクセストークンを解放する */ CloseHandle(prcs_token); /* カレントスレッドをクローズする */ CloseHandle(process); return 1; }