문제

32 비트로 실행 해야하는 Windows 응용 프로그램이 있습니다 (내 제어에서 다른 제한 사항 때문에). 그러나 내 응용 프로그램은 설치된 시스템에 따라 32 비트 또는 64 비트 일 수있는 드라이버를 호출하고 액세스해야합니다.

deviceiocontrol () 호출을 통해 드라이버에 액세스하고 포함 파일로 선언 된 데이터 구조를 교환합니다. 데이터 구조에는 "dword_ptr"으로 선언 된 필드가 포함되어 있습니다 (제어하지 않는 파일 포함).

내 문제는 64 비트 시스템에서 운전자가 구조에 64 비트 정수를 포함 할 것으로 예상한다는 것입니다 (DWORD_PTR 선언으로 인해). 그러나 내 32 비트 프로그램은 DWORD_PTR을 32 비트 정수로 본다. 그런 다음 프로그램 버전의 데이터 구조와 해당 구조에 대한 드라이버 이해간에 데이터 불일치가 있습니다.

DeviceioControl ()은 Error_InsolficiTure_Buffer로 실패합니다 (시스템 호출로 전달 된 데이터 영역이 너무 작습니다). 64 비트 버전의 structs를 운전자에게 전달하면이 오류가 발생하지 않는다는 것을 확인했습니다.

이 혼란에 몇 가지 못생긴 옵션이 있습니다. 그러나 누군가가 더 좋은 제안이 있는지 궁금합니다.


해결책:

  • 실제 64 비트 데이터 필드로 공유 구조의 새 사본을 선언합니다 (__int64)
  • OS 아키텍처를 동적으로 확인하십시오 (32/64)
  • DeviceioControl () 호출에 32 비트 또는 64 비트 버전의 구조를 사용하십시오.

단점 :

  • 구조 선언의 64 비트 사본을 수동으로 유지해야합니다. 시간이 지남에 따라 고통이 될 수 있습니다.

내 다른 솔루션은 이것의 변형이지만 언제나 구조 정의의 일부 사본을 유지하는 것과 관련이 있습니다 (예 : COM 서버 옵션 옵션).

편집 : 이것은 Microsoft 드라이버이며 IOIS32BitsProcess (IRP)를 사용하지 않는 것 같습니다!

도움이 되었습니까?

해결책

32 비트 및 64 비트 버전의 구조를 모두 유지하고 특별 처리를 구현합니다. IoIs32BitProcess(irp) 장치 드라이버에서 기능 DEVICE_CONTROL 필요할 때마다 핸들러 및 64 비트 구조로 변환하십시오. 이것이 일반적인 방법입니다.

여기에 있습니다 MSDN에 대한 많은 양의 문서.

나중에 드라이버 소스 코드를 제어 할 수 없다고 언급 한 이후 64 비트에서 32 비트에 대한 자신의 변형을 유지하고 OS 아키텍처를 확인하는 올바른 것을 보내는 것이 좋습니다. 운전자에게는 구조 선언이 제대로 수행되지 않은 것처럼 보입니다.

다른 팁

항상 64 비트 정의를 사용하도록 구조 DEF에 헤더를 포함시킬 때 #define을 조작하는 방법이 있습니까? 그것은 나에게 최선의 선택 인 것 같습니다 (가능하면).

그렇지 않다면, 나는 내 코드에서 64 비트 구조를 섀도 롭게 만들었습니다. 즉, If32bit/if64 비트 물건이 뿌려지는 것이 아니라 더 많은 버그가 발생하는 것처럼 보일 것입니다. 아마도 당신은 다음과 같은 일을 할 수 있습니다.

_ASSERT(sizeof(myStruct) == sizeof(64bitStruct)) 

앱이 시작될 때 최신 헤더를 얻는 경우 앱의 첫 번째 실행은 동기화해야한다는 것을 상기시켜줍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top