c++ - GetTokenInformation 在第一次调用中返回 ERROR_INSUFFICIENT_BUFFER
问题描述
从我读到的 MS 文档中,您应该调用 func 两次,第一次是获取令牌长度,第二次是获取其信息。我的问题是它在第一次调用中失败(错误 122)但仍然写入 32 的长度。
const char* CSystemHelper::ReturnUserByProcessHandle(const PROCESSENTRY32 &PENTRY) {
HANDLE hToken, tHandle;
DWORD ErrorCode;
if ((tHandle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, PENTRY.th32ProcessID)) == 0) {
ErrorCode = GetLastError();
CMessage::DEFAULT_MESSAGE(ErrorCode);
return "UNIDENTIFIED";
}
if (!OpenProcessToken(tHandle, TOKEN_QUERY, &hToken)) {
ErrorCode = GetLastError();
CMessage::DEFAULT_MESSAGE(ErrorCode);
return "UNIDENTIFIED";
}
DWORD len = 0;
// this call fails, but len is set to 32
if (!GetTokenInformation(hToken, TokenOwner, NULL, 0, &len)) {
ErrorCode = GetLastError();
CMessage::DEFAULT_MESSAGE(ErrorCode);
CloseHandle(hToken);
return "UNIDENTIFIED";
}
PTOKEN_OWNER TOKENOWNER = (PTOKEN_OWNER)LocalAlloc(LPTR, len);
if (!TOKENOWNER) {
LocalFree(TOKENOWNER);
CloseHandle(hToken);
return "UNIDENTIFIED";
}
if (!GetTokenInformation(hToken, TokenOwner, TOKENOWNER, len, &len)) {
LocalFree(TOKENOWNER);
CloseHandle(hToken);
return "UNIDENTIFIED";
}
char Username[256] = { 0 }, LocalDomain[256] = { 0 };
DWORD UsernameLength = 256, LocalDomainLength = 256;
SID_NAME_USE SIDNAMEUSE;
if (!LookupAccountSidA(NULL, TOKENOWNER->Owner, Username, &UsernameLength, LocalDomain, &LocalDomainLength, &SIDNAMEUSE)){
LocalFree(TOKENOWNER);
CloseHandle(hToken);
return "UNIDENTIFIED";
}
return Username;
}
如果这很重要,则通过不会引发任何错误的 processentry 打开句柄
解决方案
是的。这是正常操作。
当 TokenInformation 参数为空时,GetTokenInformation 函数返回 122(ERROR_INSUFFICIENT_BUFFER)。
所以你的代码必须像这样改变。
DWORD len = 0;
// this call fails, but len is set to 32
if (GetTokenInformation(hToken, TokenOwner, NULL, 0, &len)) {
ErrorCode = GetLastError();
if (ErrorCode != ERROR_INSUFFICIENT_BUFFER || len == 0)
{
CMessage::DEFAULT_MESSAGE(ErrorCode);
CloseHandle(hToken);
return "UNIDENTIFIED";
}
}
PTOKEN_OWNER TOKENOWNER = (PTOKEN_OWNER)LocalAlloc(LPTR, len);
if (!TOKENOWNER) {
LocalFree(TOKENOWNER);
CloseHandle(hToken);
return "UNIDENTIFIED";
}
推荐阅读
- python - 递归错误:麻烦
- python-3.x - 与 readline() 或计数器一起使用时 range() 函数出现问题 - 仅读取和处理文件中的最后一行
- javascript - GatsbyJS 不正确地呈现 URL
- git - `host.name.edu:XXXX` 是 `.ssh/config` 文件的无效格式吗?
- opengl - 有没有办法将数组缓冲区的一部分复制到另一个缓冲区?
- arrays - 在 Swift 5 中,如何有效地提取和使用多维数组中的元素?
- java - 如何将多个条形码图像添加到一个图像png?
- typescript - 打字稿:过滤keyof类型参数
- amazon-web-services - Powershell - gzip 大文件并使用流加载到 s3
- azure - Azure DevOps Code Review 有没有办法不立即发表评论?