0

我有以下用 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 文档,但不了解它的用途。

4

2 回答 2

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
于 2012-11-08T15:30:33.323 回答
1

再次查看我给您的示例和详细说明。您需要先找到缓冲区的长度。然后将缓冲区初始化为您获得的 TOKEN_PRIVILEGES 结构的大小。这是执行初始化的行:

BYTE* pBuffer = new BYTE[dwLen];
于 2012-11-08T15:31:15.443 回答