2

私のコード:

MEMORY_BASIC_INFORMATION meminf;
::VirtualQuery(box.pBits, &meminf, sizeof(meminf));

結果:

   meminf:
    BaseAddress 0x40001000 void *
    AllocationBase 0x00000000 ボイド *
    AllocationProtect 0x00000000 unsigned long
    RegionSize 0x0de0f000 unsigned long
    状態 0x00010000 unsigned long
    0x00000001 unsigned long を保護
    タイプ 0x00000000 unsigned long

ノート:

(1) AllocationBase が NULL で、BaseAddress が NULL でない
(2) AllocationProtect が 0 (保護値ではない)

VirtualQueryのバグですか?

4

2 に答える 2

1

これはバグではありません。状態のドキュメントVirtualQuery():

戻り値は、情報バッファーに返された実際のバイト数です。

関数が失敗した場合、戻り値はゼロです。拡張エラー情報を取得するには、GetLastError を呼び出します。可能性のあるエラー値には、ERROR_INVALID_PARAMETER が含まれます。

構造内のデータを使用する前に関数の結果が等しいことを確認するsizeof(meminf)か、次のコードが正しいことを行うようにする値で構造を初期化します。関数が 0 を返した場合、データは構造体にコピーされていないため、以前に含まれていたデータは引き続き含まれます。初期化しないと、これはスタック上のランダムなバイトになります。

于 2010-03-12T23:06:39.247 に答える
1

この関数にカーネル モード ポインターを渡すと、情報が返されない場合があります。戻り値を確認してください。

于 2009-12-21T13:35:48.333 に答える