GavotteRamdiskの解析 [ドライバ開発]
GavotteRamdiskが中国のサイトを使っているのを見て、ネトウヨの自分は同じ機能を自分で作れないかとちょっと調査してみた。
まず、ベースとなっているのはWDKに入っているRamdiskドライバのソースなのは間違いない。
標準のRamdiskドライバはメモリをExAllocatePoolWithTagを使っている。これだと目的とする3GB越えの場所のメモリを取得できない。
そこで、MmAllocatePagesForMdlを使っているっぽい。これは物理メモリからMDLを作成するもので、これで得たアドレスをMmMapLockedPagesSpecifyCacheなどでアクセスできるようにしているようだ。
http://msdn.microsoft.com/en-us/library/ff554482(VS.85).aspx
PMDL MmAllocatePagesForMdl(
__in PHYSICAL_ADDRESS LowAddress,
__in PHYSICAL_ADDRESS HighAddress,
__in PHYSICAL_ADDRESS SkipBytes,
__in SIZE_T TotalBytes
);
とのことなので、物理アドレスさえわかっていれば使えるようだ。
またSkipBytesに4GB上限をいれている節がある。
Ramdiskの問題としては、電源をオフにすると消えてしまうので、有料版のRamPhantomではその点を強化している。
ExAllocatePoolWithTagの変わりにするだけでいけるならお手軽だなと思いつつ、手軽なデバッグ環境がないので、あくまで調査で終わり。
まず、ベースとなっているのはWDKに入っているRamdiskドライバのソースなのは間違いない。
標準のRamdiskドライバはメモリをExAllocatePoolWithTagを使っている。これだと目的とする3GB越えの場所のメモリを取得できない。
そこで、MmAllocatePagesForMdlを使っているっぽい。これは物理メモリからMDLを作成するもので、これで得たアドレスをMmMapLockedPagesSpecifyCacheなどでアクセスできるようにしているようだ。
http://msdn.microsoft.com/en-us/library/ff554482(VS.85).aspx
PMDL MmAllocatePagesForMdl(
__in PHYSICAL_ADDRESS LowAddress,
__in PHYSICAL_ADDRESS HighAddress,
__in PHYSICAL_ADDRESS SkipBytes,
__in SIZE_T TotalBytes
);
とのことなので、物理アドレスさえわかっていれば使えるようだ。
またSkipBytesに4GB上限をいれている節がある。
Ramdiskの問題としては、電源をオフにすると消えてしまうので、有料版のRamPhantomではその点を強化している。
ExAllocatePoolWithTagの変わりにするだけでいけるならお手軽だなと思いつつ、手軽なデバッグ環境がないので、あくまで調査で終わり。
コメント 0