【发布时间】:2012-10-01 08:51:24
【问题描述】:
考虑这个取自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 是否在幕后创建此线程以完成其工作?
【问题讨论】:
-
我认为翻译是通过对 smss.exe 的 RPC 调用完成的,该线程用于为 RPC 提供服务。
-
@avakar:谢谢!我今天继续分析,来自 LookupPrivilegeValue 的堆栈跟踪似乎证实了这一点。
标签: c++ multithreading winapi windows-7 windows-7-x64