制御ソフトを x64に移植したら動かなくなったでござるの巻

x64 ドライバを突然移植するように言われて苦労したメモ

Windows 2000 / XP用の制御機器のソースを Windows 7 (64Bit)で動かすためにドライバを移植したのはいいんですが、アプリケーションが 32bit だと、 64bitドライバの制御ができないことが判明…。

仕方ないので、アプリも x64 に移植することになりました。

Windows XP(32bit)のアプリを x64でコンパイルしたら、なぜか制御用のコンピューターが暴走してしまうようになりました。


仕方がないので、トレースして、制御機器が応答なしになる場所を突き止めたところ、データパケットを送信したところで、固まってることが判明しました。

#pragma pack(1)
typedef struct {
    UCHAR    uPage;
    UCHAR    uAddress;
    USHORT    uData;
} REGXP_REG, *PREGXP_REG;
#pragma pack()

#pragma pack(1)
typedef struct STRUCT_REGXP_INFO {
    short            sVer;
    short            sSize;
    PREGXP_REG    spReg;
} REGXP_INFO, *PREGXP_INFO;
#pragma pack()

ありふれた構造体です。
危機に送出するデータは固定サイズなのでマシンが変更されても変わらないはず…

…なのですが
送信するパケットサイズを見ると…あれ、 x64と x86で違うじゃん…

DWORD sendSize = sizeof(PREGXP_INFO) - sizeof(REGXP_REG);

問題の該当コードがこれ。

本来はポインターのサイズを指定するところが、実体のサイズになってた・ω・;
x86 だと ポインターも中のサイズも 4バイトなんだけど、 x64でコンパイルすると、
アドレス空間が 8バイトなので、 sendSize が4バイト増えてしまうという落ちでした。

おすすめ

コメントを残す

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