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の中身
-MERGE:_PAGE=PAGE
-MERGE:_TEXT=.text
-SECTION:INIT,d
-OPT:REF
-OPT:ICF
-IGNORE:4010,4037,4039,4065,4070,4078,4087,4089,4198,4221,4108,4088,4218,4218,4235
-INCREMENTAL:NO
-FULLBUILD
/release
-NODEFAULTLIB
/WX
-debugtype:cv
-version:5.1
-osversion:5.1
/opt:nowin98
-STACK:0x40000,0x1000
-map
-driver -driver:wdm
-base:0x10000
-align:0x80
-subsystem:native,5.02
-entry:DriverEntry@8
OBJファイル群
D:\WinDDK\7600.16385.1\lib\wxp\i386\wdm.lib
D:\WinDDK\7600.16385.1\lib\wxp\i386\usbd.lib

注意点としては、 -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 は未解決です
[...]
LIBC.lib(a_str.obj) : error LNK2001: 外部シンボル __security_check_cookie は未解決です
[...]

この問題は、Microsoft Platform SDK のバージョン間の不一致によって発生します。インテルでは、この問題を解決するために Microsoft と作業を行っています。この問題を回避するには、以下のいずれかの方法でアプリケーションをリンクしてください。

    icl hello.c /MD
    icl hello.c -link bufferoverflowu.lib
    icl hello.c /MT bufferoverflowu.lib

Win32 API を使用する一般的なユーザーモードのアプリケーションでは、bufferoverflowu.lib を使用してください。Win32 API を使用できないユーザーモード・サブシステムやサービス用のアプリケーションでは、代わりに bufferoverflow.lib を使用してください。カーネルモード・アプリケーションおよびドライバーは、bufferoverflowk.lib にリンクしてください。
IA-64 システムにおける memset/memcpy 使用時のアライメントされていないアクセスエラー

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の中身
-MERGE:_PAGE=PAGE
-MERGE:_TEXT=.text
-SECTION:INIT,d
-OPT:REF
-OPT:ICF
-IGNORE:4010,4037,4039,4065,4070,4078,4087,4089,4198,4221,4108,4088,4218,4218,4235
-INCREMENTAL:NO
-FULLBUILD
/release
-NODEFAULTLIB
/WX
-debugtype:cv
-version:5.2
-osversion:5.2

/opt:nowin98
-STACK:0x40000,0x1000
-map
-driver -driver:wdm
-base:0x10000
-align:0x80
-subsystem:native,1.10
-entry:DriverEntry
OBJファイル群
D:\WinDDK\7600.16385.1\lib\win7\amd64\wdm.lib
D:\WinDDK\7600.16385.1\lib\win7\amd64\usbd.lib
D:\WinDDK\7600.16385.1\lib\win7\amd64\bufferoverflowK.lib

こうなりましたとさ・ω・

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です