本来は、MicroSoft が出している DDK (ドライバ開発キット)と Visual C++ が必要なわけだが ... MinGW だけでなんとかならないかやってみた。
なお、対象としているのは、w32api-3.11.tar.gz 。/mingw/installed.ini を確認のこと。
0) ソース集め
とりあえず ドライバをビルドしたいだけなので、inc と sys のファイルを集めてきた。
あと MinGW だと 改行は、CR+LF ではなく、LFなので、全部変換。
1) imports.h の編集
vfd では、いろいろな バージョンの DDK に対応するために、ntverp.h をインクルードして、古いバージョンだと ddk のインクルードを使用せずに自前のものを使用するようになっている。
MinGWでは、ntverp.h がないので、インクルードしないようにして、あとの部分はすなおに ddk をインクルードするように変更。
ntifs.h も MinGW で存在するので、ntifs.h 相当分もコメント。
あと、#pragma も gcc とは関係ないのでコメント。
これで結構コンパイルが通る。足りない define が
RTL_REGISTRY_OPTIONAL
IOCTL_DISK_EJECT_MEDIA
の 2 つ。
RTL_REGISTRY_OPTIONAL に関しては、ググるとどうも 0x80000000 らしいので、imports.h で define 。
IOCTL_DISK_EJECT_MEDIA は、参照しているソースをコメント。
この 2 つの対応で コンパイルは通ってしまった。
さて、これをどうやってリンクするのだろう?
ググってみると、MinGW cross-compilation adventure.が参考になるとのこと。
とりあえず gcc の リンクオプションは、
-shared -Wl,--entry,_DriverEntry@8 -nostartfiles -nostdlib -lntoskrnl -lhal -lndis
らしい。実際にやってみると .. いくつかのシンボルが undefined になった。
2) undefined シンボルの対処(1)
まず対処したのは、
SeCreateClientSecurity
vfddrv.h に
PSECURITY_CLIENT_CONTEXT SecurityContext;
というのがある。コメントを見ると network drive 上のファイルにアクセスするときの対応らしい。
基本的な動作には関係なさそうなので、SecurityContext 自体を コメントして、それを使っている C ソースを全部コメント。
3) undefined シンボルの対処(2)
上の対処をすると、undefined は 1つのみになる。
PsRevertToSelf
乱暴だがとりあえずコメント。
とても動くことは期待できないのだが、以上で、とにもかくにも sys ファイルを生成できた。
→ http://nmj.sumomo.ne.jp/arc/vfd21mingw-001.tgz
(追記)
vfd はとりあえず保留。→ filedisk を MinGW でビルド (wk002) こっちに移行。
filedisk は動作したので、vfd も同じようにすれば OK のはず。