2

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 は、作業を完了するために舞台裏でこのスレッドを作成していますか?
4

1 に答える 1

3

これは、ワーカーファクトリの内部実装の一部です。通常、ファクトリごとに1つのスレッドが、すべての待機可能なイベントを待機するために使用されます。イベントが発生すると、ウェイタースレッドはイベントを処理するためにワーカースレッドの1つにジョブをディスパッチします。

これはすべてtpWorkerFactory実装の一部です。

于 2012-10-01T09:09:06.953 に答える