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パラメーターは「出力」パラメーターであり、関数から情報を返すことを意味します (つまり、追加の戻り値)。既存の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 に答える