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
'My Study > Programming&Theory' 카테고리의 다른 글
Windows 메모리 유효성 체크 (4) | 2013.12.10 |
---|---|
PE text 섹션 속성에 따른 VirtualQuery (2) | 2013.09.25 |
Windows DEP Exception 모니터링 (0) | 2013.09.19 |
MMF을 이용한 Shared Memory (2) | 2013.08.20 |
Time based Keystroke Password (4) | 2013.08.15 |