2012-10-01 59 views
2

考虑从MSDN采取LookupPrivilegeValue此代码示例的目的(含有少量的代码格式编辑)这是什么神秘的_TppWaiterpThread线程

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; 
} 

使用VS二千零八分之二千零十调试器在第一次调用后LookupPrivilegeValue我已经注意到一个名为_TppWaiterpThread @ 4的新工作线程被创建。这个线程住,直到进程退出其堆栈跟踪如下:

[email protected]() 
[email protected]() + 0xc bytes 
[email protected]() + 0x12c bytes 
[email protected]@12() + 0x12 bytes  
[email protected]() + 0x27 bytes 
[email protected]() + 0x1b bytes  

测试在Windows 7 86/64(远程/本地调试)。我尝试设置两个权限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是否在幕后创建此线程以完成其工作?
+1

我认为翻译是通过对smss.exe的RPC调用完成的,线程在那里为RPC服务。 – avakar

+0

@avakar:谢谢!我今天继续分析,LookupPrivilegeValue的堆栈跟踪似乎证实了这一点。 – anonymvs

回答

3

它是工人工厂内部实现的一部分。通常,每个工厂使用一个线程来等待所有等待事件。当一个事件发生时,服务器线程派遣一个工作到其中一个工作线程来处理事件。

这是tpWorkerFactory实现的所有部分。

相关问题