Windowsのnative APIの呼び方

を調査。普通はDevice Driver Kitとか使うみたいなんだけど。
Visual Studioとかでは、そもそもプロトタイプ(関数の引数とか返り値の型とか)がヘッダに無いので、それはどこかで調べてくる必要がある。(件のWINDOWS NT/2000 NATIVE API REFERENCEの本とかで)
で、リンクするのにどうするかなんだけど、昔はntdll.libを指定すればよかったらしい。んだけど、Visual Studio 2005ではこの方法は使えなかったので、いろいろ調べてみると、GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")), "NtCreateProcess"))とかして、呼び出したい関数のアドレスを得るものみたい(たとえば、この辺に例がある)。
ntdll.dllは必ずロードされるので、このモジュールからNtCreateProcessのアドレスをGetProcAddressで取り出すそうな。
この場合、関数へのポインタが得られるだけなので、その関数の型をtypedefするとかして、その関数へのポインタの正しい型で変数を定義しないといけないのが面倒。
ちょっと試したところ、まぁ動くみたいだけど。

それはそうと、WINDOWS NT/2000 NATIVE API REFERENCEにのってるforkの実装は、かなりWindowsのバージョンに依存するらしいことが発覚。Win32サブシステムに接続するところで、Win32サブシステム側でプロセスの初期化をしてもらわないといけないんだけど、初期済みかどうかはある変数に格納されていると。で、fork直後は値はすべて親プロセスと同じなので、初期化済みになっていますねと。仕方が無いので、その変数の値を「未初期化」に変えないといけないんだけど、この部分のアドレスがハードコードされている。orz このアドレス、本当にバージョンによって違うらしい。

あーもー、どうしよ。Windows上のforkはあきらめるか?