0

0x00000001 から RAM データを読み取り、それをハードディスクのファイルにコピーしようとしています (学習中です!) ので、これを書き、コンパイルして実行しました

#include <ntddk.h>

    void DriverUnload(PDRIVER_OBJECT pDriverObject)
    {
        DbgPrint("Driver Unloaded!");
    }


    NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
    {
            DWORD *pointer;
            pointer = 0x00000001;

            DriverObject->DriverUnload = DriverUnload;

        DbgPrint("Driver Loaded!\n");

            DbgPrint("Data at 0x00000000 is %x\n",*pointer);
        return STATUS_SUCCESS;
    }

だから私はBSODを手に入れました 幸いなことに、私はVmwareを使用してこれを実行していました:-) 私はいつもアプリプログラムだけがメモリから直接読み取る権利を持っていないと思っていました.

ここで私の質問は、ドライバーは直接物理アドレスまたは仮想アドレスを使用しますか??? ドライバー プログラミング (Ring 1 または 2) の場合のように、&pointer が物理または仮想を返す値のタイプを意味します。Ring 3 アプリが仮想アドレスを返すことはわかっています。ええ、私はすでにドライバーの本を読み始めています。もっと早く知りたかっただけです。

4

1 に答える 1

1

いいえ、カーネルは仮想アドレスを使用します。これはリングとは関係ありません。ページ アクセス権にのみ影響します。物理アドレスにアクセスしたい場合は、"MmMapIoSpace" (ここ) カーネル関数を参照してください。返されたポインターは、メモリ アクセスに適しています。

于 2012-01-03T08:47:26.267 に答える