制御ソフトを 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) |
ありふれた構造体です。
危機に送出するデータは固定サイズなのでマシンが変更されても変わらないはず…
…なのですが
送信するパケットサイズを見ると…あれ、 x64と x86で違うじゃん…
DWORD sendSize = sizeof(PREGXP_INFO) - sizeof(REGXP_REG); |
問題の該当コードがこれ。
本来はポインターのサイズを指定するところが、実体のサイズになってた・ω・;
x86 だと ポインターも中のサイズも 4バイトなんだけど、 x64でコンパイルすると、
アドレス空間が 8バイトなので、 sendSize が4バイト増えてしまうという落ちでした。
Comments