다음을 통해 공유


정보 숨기기 방지

경우에 따라 프로그램이 의도적으로 또는 실수로 RPC 마샬링 엔진에서 정보를 숨깁니다. 몇 가지 예는 다음과 같습니다.

  • 데이터 구조를 비분화되지 않은 바이트 블록으로 보내기
  • 메서드의 부작용을 사용하여 와이어를 통해 추가 데이터를 채널로 이동하여 성능 활용
  • 핸들을 DWORD 또는 ULONG으로 전달하여 핸들을 위장하려고 시도

이러한 기술은 애플리케이션을 64비트 Windows로 포팅하기 전에도 호환성 문제를 발생하도록 거의 보장됩니다.

표준 원격 프로시저 호출에서 서버 컨텍스트를 DWORD 로 보내는 대신 컨텍스트 핸들을 사용하여 클라이언트를 대신하여 유지되는 서버 컨텍스트에 불투명 핸들을 제공합니다. 컨텍스트는 서버가 클라이언트에 대한 컨텍스트 핸들을 만들 때 RPC 런타임에 정의된 GUID로 식별됩니다. 와이어를 통해 포인터가 사용되지 않으며 작업은 32비트 또는 64비트 경계에서 완전히 투명합니다. 컨텍스트 핸들 사용에 대한 자세한 내용은 컨텍스트 핸들을 참조하세요.

COM은 자체 컨텍스트 관리를 제공하므로 DCOM 인터페이스는 컨텍스트 핸들을 사용할 수 없습니다. 컨텍스트 핸들을 만드는 대신 COM 개체에 인터페이스 포인터를 전달할 수 있습니다. 그런 다음 인터페이스 포인터를 통해 메서드를 직접 호출하거나 포인터를 다른 호출 내에 배치할 수 있습니다. 서버 개체를 해제하기 위해 클라이언트는 인터페이스 포인터를 통해 인터페이스의 Release 메서드를 호출합니다.

다시 말하지만, 포팅하는 코드의 원래 디자인을 변경할 수 없는 경우가 있을 수 있습니다. 유선에서 DWORD로 포인터를 보내지 않도록 방지할 방법이 없는 경우 DWORD 값과 포인터 간에 일종의 서버 쪽 매핑을 구현해야 합니다. 이 작업을 수행하는 한 가지 방법은 클라이언트 쪽 애플리케이션의 포인터를 ULONG_PTR 또는 DWORD_PTR 같은 포인터 정밀도 형식으로 변경하는 것입니다. 그런 다음 MIDL [call_as] 특성을 사용하여 포인터를 와이어에 DWORD 값으로 배치합니다. 클라이언트 쪽 래퍼는 인수만 전달하면됩니다. 서버 쪽 래퍼는 두 형식 간의 매핑을 처리합니다. 비슷한 방식으로 [transmit_as] 특성 또는 [represent_as] 특성을 사용하여 데이터를 유선 표현을 위해 이전 버전과 호환되는 형식으로 변환할 수 있습니다.

역방향 유선 호환성이 문제가 되지 않거나 핸들이 원격 호출에 사용되지 않고 32비트와 64비트 프로세스 간의 원격 호출이 발생하지 않을 경우 인수를 ULONG64로 다시 정의할 수 있습니다. 필요한 경우 사용자에게 DWORD 를 전달하도록 32비트 애플리케이션을 수정할 수 있습니다. 또는 32비트 Windows의 DWORD 와 64비트 Windows의 ULONG64 를 사용하여 각 플랫폼에 대해 별도의 IDL 파일에서 별도의 스텁을 빌드할 수 있습니다.