2009年01月19日

vfd を MinGW でビルドしてみた。

vfdは、ソースコードを公開している 仮想フロッピードライバ。

本来は、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 のはず。
posted by すz at 03:16| Comment(0) | TrackBack(0) | プログラミング
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス: [必須入力]

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/30760564
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック