MSDNから取得した LookupPrivilegeValue のこのコード サンプルを検討してください(マイナーなコード形式の編集を含む)
BOOL SetPrivilege(HANDLE hToken, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege) {
TOKEN_PRIVILEGES tp;
LUID luid;
if ( !LookupPrivilegeValue(NULL, lpszPrivilege, &luid ) ) {
printf("LookupPrivilegeValue error: %u\n", GetLastError() );
return FALSE;
}
// SET A BREAKPOINT BELOW, notice a new thread was created
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege) {
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
}
else {
tp.Privileges[0].Attributes = 0;
}
// Enable the privilege or disable all privileges.
if ( !AdjustTokenPrivileges( hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES) NULL, (PDWORD) NULL) ) {
printf("AdjustTokenPrivileges error: %u\n", GetLastError() );
return FALSE;
}
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) {
printf("The token does not have the specified privilege. \n");
return FALSE;
}
return TRUE;
}
LookupPrivilegeValue への最初の呼び出しの後に VS 2010/2008 デバッガーを使用すると、_TppWaiterpThread@4 という名前の新しいワーカー スレッドが作成されたことに気付きました。このスレッドは、プロセスが終了するまで存続し、そのスタック トレースは次のようになります。
ntdll.dll!_KiFastSystemCallRet@0()
ntdll.dll!_ZwWaitForMultipleObjects@20() + 0xc bytes
ntdll.dll!_TppWaiterpThread@4() + 0x12c bytes
kernel32.dll!@BaseThreadInitThunk@12() + 0x12 bytes
ntdll.dll!___RtlUserThreadStart@8() + 0x27 bytes
ntdll.dll!__RtlUserThreadStart@8() + 0x1b bytes
Windows 7 x86/x64 でテスト済み (リモート/ローカル デバッグ)。SE_DEBUG_NAME と SE_SYSTEM_NAME の 2 つの権限を設定してみました。これは私が SetPrivilege を呼び出した方法です:
HANDLE hProcess;
hProcess = OpenProcess(PROCESS_ALL_ACCESS, NULL, GetCurrentProcessId());
SetPrivilege(hProcess, SE_SYSTEMTIME_NAME, TRUE);
//SetPrivilege(hProcess, SE_DEBUG_NAME, TRUE);
XP では、この新しいスレッドは表示されません。
だから私の質問は:
- この _TppWaiterpThread スレッドの目的は何ですか?
- LookupPrivilegeValue は、作業を完了するために舞台裏でこのスレッドを作成していますか?