c++ - 这个神秘的 _TppWaiterpThread 线程的目的是什么

标签 c++ multithreading winapi windows-7 windows-7-x64

考虑取自 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。这就是我调用 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 是否在幕后创建此线程以完成其工作?

最佳答案

它是 worker 工厂内部实现的一部分。通常,每个工厂一个线程用于等待所有可等待事件。当事件发生时,等待线程将作业分派(dispatch)给其中一个工作线程以处理该事件。

这是 tpWorkerFactory 的全部内容实现。

关于c++ - 这个神秘的 _TppWaiterpThread 线程的目的是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12670097/

相关文章:

c++ - 使用netbeans编译C++

使用 C/C++ 创建 "invisible"windows 程序

c++ - 使用作业对象限制 Windows 进程内存/执行时间 - 我的代码有什么问题?

windows - GetLastError返回ERROR_OPERATION_ABORTED时,GetOverlappedResult的lpNumberOfBytesTransfered参数是否有效?

c++ - 函数调用中字符串的变量名,C++

c++ - 字符串文字与 const char* 函数重载

c++ - 解析为多个 vector 成员

java - 如何在单页 PDF 中打印多个 jasper 报告

multithreading - 在 Python 中使用多线程运行 Iperf 服务器和客户端会导致段错误

multithreading - 有没有办法监控resilience4j线程池?