2012-06-12 2 views
2

커널 모드 드라이버를 수행하고 있으며 64 비트에서 코드를 실행할 때 약간의 버그가 발생했습니다.C 및 64 비트 포인터 계산

코드는 32 비트에서 잘 실행되지만, amd64에서 빌드/실행하면 이상한 결과가 나타납니다. 나는 64 비트 포인터에서 약간을 읽고 32 비트 대 16 비트 (win32에서)를 다루었 고 64 비트 아키텍처의 포인터에 관한 기본 사항에 대해서는 빠뜨렸다.

다음은 32 비트에서 정상적으로 작동하는 C 코드입니다. ncImageLoadEventSettings.buffchar*이고 ncILHead->count은 int입니다.

// Calculate offset 
    pnt = (void*)(ncImageLoadEventSettings.buff + sizeof(struct NC_IL_HEAD) + (ncILHead->count * sizeof(struct NC_IL_INFO))); 

이 코드는 32 비트 모드에서 완벽하게 잘 작동 버퍼 (.buff에서 시작)에 구조체 객체를 작성하는 시점의 어드레스를 계산한다.

이 버퍼를 읽는 프로그램은 32 비트입니다. 필자는 64 비트 모드의 구조체가 32 비트 모드의 구조체와 다른 크기라고 읽었습니다.

대부분의 항목이 가비지 인 반면 32 비트 판독기 프로그램은 버퍼의 내용 중 일부를 잘 읽습니다.

주소를 계산하는 적절한 방법입니까, 아니면 해당 버퍼를 읽는 64 비트 대 32 비트 리더 응용 프로그램에 문제가있을 수 있습니까?

+0

MSVC 및 기본 패킹 8과의 정렬 차이가 없습니다. 이러한 구조체에 포인터가 포함되어 있습니까? –

답변