>156
1)ユーザーモードでアドレスを指定してVirtualAlloc()を呼び仮想空間を確保。
2)そのアドレス値をカーネルモードに渡し、MmAllocateContiguousMemory()で物理空間を確保。
  確保できなかったら1)に戻る。
3)CR3レジスタから確保した仮想アドレスのテーブルを探す。そのテーブルを書き直し
  確保した物理アドレスにマップする。物理→仮想アドレス変換はMmGetVirtualForPhysical()を使う。

試していないけど