x64 ドライバを突然移植するように言われて苦労したメモ
Windows XP 向けドライバの .c と .h だけのソースファイルを渡されて Windows 7(x64) で動作する ドライバを作るように言われたよ ・ω・; ひー
結構苦労したので、とりあえず、手持ちの Visual Studio 2005 でコンパイルする手順をまとめてみたよ。
・まず、 WDK 7.1を入手
Download Windows Driver Kit Version 7.1.0 from Official Microsoft Download Center
とりあえず、これをダウンロードしてインストール。Build Environment だけ導入。
・XP向けのバイナリを吐けるように試行錯誤するの巻
まず、元のバイナリを出力できるように試行錯誤
リソースコンパイル
rc -l 409 -DSXS_ASSEMBLY_NAME="""""" -DSXS_ASSEMBLY_VERSION="""""" -DSXS_ASSEMBLY_LANGUAGE="""""" -DSXS_PROCESSOR_ARCHITECTURE="""x86""" -DSXS_TARGET="""ドライバ名.sys""" -DSYSTEM_COMPATIBLE_ASSEMBLY_NAME="""Microsoft.Windows.SystemCompatible""" -DLSYSTEM_COMPATIBLE_ASSEMBLY_NAME=L"""Microsoft.Windows.SystemCompatible""" -z "MS Sans Serif,Helv/MS Shell Dlg" -r -fo 出力先\ドライバ名.res ライバ名.rc |
コンパイル
cl -nologo -Id:\WinDDK\7600.16385.1\inc\mfc42 -Id:\WinDDK\7600.16385.1\inc -Id:\WinDDK\7600.16385.1\inc\api -Id:\WinDDK\7600.16385.1\src\usb\inc -Id:\WinDDK\7600.16385.1\src\wdm\usb\inc -Id:\WinDDK\7600.16385.1\inc\ddk -Id:\WinDDK\7600.16385.1\inc\crt -D_X86_=1 -Di386=1 -DSTD_CALL -DCONDITION_HANDLING=1 -DNT_INST=0 -DWIN32=100 -D_NT1X_=100 -DWINNT=1 -D_WIN32_WINNT=0x0501 /DWINVER=0x0501 -D_WIN32_IE=0x0600 -DWIN32_LEAN_AND_MEAN=1 -DDEVL=0 -D__BUILDMACHINE__=WinDDK -DFPO=0 -DNDEBUG -D_DLL=1 /DDRIVER /c /Zp8 /Gy -cbstring /W3 /WX /Gz /Gm- /GR- /GF /Gs- -Z7 /Od /Oi /Oy- -FId:\WinDDK\7600.16385.1\inc\api\warning.h ソースファイル群 |
リンク
link -out:ドライバ出力先 -machine:ix86 @link.x86
link.x86の中身 |
注意点としては、 -Gs- オプションをつけないと @__security_check_cookie@4 がリンク時に出まくって悩まされること…。
とりあえず、行けたので、今度は x64版にチャレンジ
そのままコンパイルしたところリンカで 『fatal error LNK1112: モジュールのコンピュータの種類 'X86' は対象コンピュータの種類 'x64' と競合しています。』に悩まされる。
D:\mvs8\VC\bin\x86_amd64\cl -nologo -Id:\WinDDK\7600.16385.1\inc\mfc42 -Id:\WinDDK\7600.16385.1\inc -Id:\WinDDK\7600.16385.1\inc\api -Id:\WinDDK\7600.16385.1\src\usb\inc -Id:\WinDDK\7600.16385.1\src\wdm\usb\inc -Id:\WinDDK\7600.16385.1\inc -Id:\WinDDK\7600.16385.1\inc\ddk -Id:\WinDDK\7600.16385.1\inc\crt -D_AMD64_=1 -DSTD_CALL -DCONDITION_HANDLING=1 -DNT_INST=0 -DWIN64=100 -D_NT1X_=100 -DWINNT=1 -D_WIN32_WINNT=0x0502 /DWINVER=0x0502 -D_WIN32_IE=0x0600 -DWIN32_LEAN_AND_MEAN=1 -DDEVL=0 -D__BUILDMACHINE__=WinDDK -DFPO=0 -DNDEBUG -D_DLL=1 /DDRIVER /c /Zp8 /Gy -cbstring /W3 /Gz /Gm- /GR- /GF /Gs- -Z7 /Od /Oi /Oy- -FId:\WinDDK\7600.16385.1\inc\api\warning.h ソースファイル群 |
結論は cl.exe を 『x86_amd64版にしないといけない』でした
さらにリンク『error LNK2001: 外部シンボル "__security_check_cookie" は未解決です』に悩まされる
インテル(R) C++ コンパイラー 10.1 Windows* 版リリースノート
解決方法がインテルのサイトに…
Platform SDK 使用時の IA-64 システムまたはインテルR 64 対応システムのリンクエラー
IA-64 システムまたはインテルR 64 対応システムで Microsoft Platform SDK を使用してビルドを行うと、以下のようなリンクエラーが発生します。 LIBC.lib(a_str.obj) : error LNK2001: 外部シンボル __security_cookie は未解決です この問題は、Microsoft Platform SDK のバージョン間の不一致によって発生します。インテルでは、この問題を解決するために Microsoft と作業を行っています。この問題を回避するには、以下のいずれかの方法でアプリケーションをリンクしてください。 icl hello.c /MD Win32 API を使用する一般的なユーザーモードのアプリケーションでは、bufferoverflowu.lib を使用してください。Win32 API を使用できないユーザーモード・サブシステムやサービス用のアプリケーションでは、代わりに bufferoverflow.lib を使用してください。カーネルモード・アプリケーションおよびドライバーは、bufferoverflowk.lib にリンクしてください。 IA-64 システムで動作する Microsoft Windows Server 2003 の一部のバージョンでは、C ライブラリー・ルーチンの memset および memcpy の呼び出しは、アライメントされていないアクセス例外になります。この問題は、引数がアライメント・ベース 2 以上のデータ型へのポインターであるにもかかわらず、実際の引数がアライメントされていない場合に発生します。この問題を回避するには、引数を適切にアライメントしてください。 |
D:\WinDDK\7600.16385.1\lib\win7\amd64\bufferoverflowK.lib Link時に結合することで回避できた!
DriverEntry@8 が見つからない件。
どうやら x64だと『DriverEntry』 でいいらしい
link -out:ドライバ出力先 -machine:x64 @link.x64
link.x64の中身 |
こうなりましたとさ・ω・
Comments