我有以下用C编写的程序:
#include "stdafx.h"
#include <Windows.h>
void main()
{
char buffer[1000];
int size = sizeof(buffer);
PDWORD required_size;
printf("----Application Privileges----\n\n");
printf("In this program, we are going to obtain information about the application privileges\n\n");
HANDLE process = OpenProcess(SYNCHRONIZE, FALSE, GetCurrentProcessId()); //Opening the current process
HANDLE token; //Creating a handle for the token
OpenProcessToken(process, TOKEN_ADJUST_PRIVILEGES, &token); //Opening the process token
GetTokenInformation(token, TokenPrivileges, buffer, size, required_size); //Obtaining the token information
printf("The following information was obtained with regards to the token privileges: \n\n");
printf("%s\n\n", buffer);
printf("Press enter to exit the program");
getchar();
}
现在,我对使用令牌相对较新。当我尝试执行该程序时,出现以下错误:
运行时检查失败#3 - 正在使用变量'required_size'而未初始化。
我该如何解决这个问题?我想要做的是向用户显示有关当前进程的令牌权限的信息。
我不确切知道GetTokenInformation方法中的最后一个变量(ReturnLength [out])是做什么的。我试过阅读msdn文档,但不明白它的用法。
答案 0 :(得分:3)
required_size
参数是一个“out”参数,意味着它从函数返回信息(即额外的返回值)。您应该将现有DWORD
变量的地址传递给它,并在那里填充数据,但是您传递的是未初始化的指针,它会尝试写入。
您的代码应如下所示:
DWORD required_size;
GetTokenInformation(..., &required_size); // Pass address of required_size
// required_size now contains the required size of the data buffer
答案 1 :(得分:1)
检查我再次给你的example and detailed explanation。您需要先找到缓冲区的长度。然后将缓冲区初始化为您获得的TOKEN_PRIVILEGES结构的大小。这是进行初始化的行:
BYTE* pBuffer = new BYTE[dwLen];