Windows 64bit OS에서 IPC를 사용해 프로세스간 통신을 하고 있었습니다.

IPC 서버는 64bit 프로세스 하나만 존재하며 열린 IPC로 메시지를 전송하는 클라이언트는 32bit/64bit 둘다 있습니다.


그리고 전송되는 메시지 구조체는 다음과 같습니다. ( 예를 든 것입니다 )

( 32bit/64bit 프로그램에 정의 된 구조체 형태는 같습니다 )


typedef struct _TEST {

ULONG ulNum;

ULONG_PTR ulptrNum;

BOOL bStatus;

} TEST;


딱 봐도 평범해보입니다.


32bit 프로세스에서 IPC 서버로 메시지를 보내기 전 다음과 같이 구조체가 채워져있다고 가정하겠습니다.


-----------

0xaaaaaaaa    ; 구조체 주변 다른 지역변수 값

-----------

0x123456768    ; ulNum

-----------

0x87654321    ; ulptrNum

-----------

0x00000001    ; bStatus

-----------

0xbbbbbbbb    ; 구조체 주변 다른 지역변수 값

-----------


만약 위 형태로 채워진 구조체를 64bit 프로세스로 보내게 되면 정상적으로 처리할 수 있을까요???


정답은 아닙니다.


64bit 프로세스에선 위 구조체를 받으면 다음과 같이 인식하게 됩니다.


-----------

0xaaaaaaaa    ; 구조체 주변 다른 지역변수 값

-----------

0x123456768                ; ulNum

-----------

0x00000001`87654321    ; ulptrNum

-----------

0xbbbbbbbb                ; bStatus

-----------

0xcccccccc    ; 구조체 주변 다른 지역변수 값

-----------


차이점을 아시겠나요?


ULONG_PTR은 32bit에선 4Byte, 64bit에선 8Byte로 정의되서 컴파일 되기 때문에

서로 다른 환경의 프로세스끼리 ULONG_PTR 구조체를 가지고 통신을 해버리면 꼬이게 됩니다.


이거 때문에 또... 삽질을 했군요. 조심합시다 :D

Posted by Ezbeat