다음을 통해 공유


64비트 드라이버에서 32비트 I/O 지원

Windows 기반 Windows(WOW64)를 사용하면 Microsoft Win32 사용자 모드 애플리케이션을 64비트 Windows에서 실행할 수 있습니다. Win32 함수 호출을 가로채고 64비트 커널로 전환하기 전에 매개 변수를 32비트 포인터 형식에서 64비트 포인터 형식으로 적절하게 변환하여 이 작업을 수행합니다. unking이라고 하는 이 변환은 DeviceIoControl에 전달된 데이터 버퍼라는 한 가지 중요한 예외를 제외하고 모든 Win32 함수에 대해 자동으로 수행됩니다. InputBufferOutputBuffer 매개 변수가 가리키는 이러한 버퍼의 내용은 드라이버별 구조이므로 삭제되지 않습니다.

참고 버퍼 내용이 삭제되지는 않지만 버퍼 포인터는 64비트 포인터로 변환됩니다.

사용자 모드 애플리케이션은 DeviceIoControl 을 호출하여 지정된 커널 모드 드라이버에 직접 I/O 요청을 보냅니다. 이 요청에는 I/O 제어 코드(IOCTL) 또는 FSCTL(파일 시스템 제어 코드) 및 입력 및 출력 데이터 버퍼에 대한 포인터가 포함됩니다. 이러한 데이터 버퍼의 형식은 IOCTL 또는 FSCTL에 따라 다릅니다. 이 형식은 커널 모드 드라이버에 의해 정의됩니다. 버퍼 형식은 임의이며 WOW64가 아닌 드라이버에 알려지므로 데이터를 unking하는 작업은 드라이버에 남아 있습니다.

다음이 모두 true인 경우 64비트 드라이버는 32비트 I/O를 지원해야 합니다.

  • 드라이버는 IOCTL(또는 FSCTL)을 사용자 모드 애플리케이션에 노출합니다.

  • IOCTL에서 사용하는 I/O 버퍼 중 하나 이상에는 포인터 정밀도 데이터 형식이 포함되어 있습니다.

  • 포인터 정밀도 버퍼 데이터 형식을 사용하지 않도록 IOCTL 코드를 쉽게 다시 작성할 수 없습니다.