헤더
다음 헤더는 현재 버전의 MIDL에서 생성할 수 있는 헤더 스타일 중 하나를 나타냅니다. 편의를 위해 헤더 필드의 전체 목록이 여기에 제공됩니다.
(–Oif 헤더)
handle_type<1>
Oi_flags<1>
[rpc_flags<4>]
proc_num<2>
stack_size<2>
[explicit_handle_description<>]
constant_client_buffer_size<2>
constant_server_buffer_size<2>
INTERPRETER_OPT_FLAGS<1>
number_of_params<1>
Windows 2000부터 확장: <32비트용 8> 개, <64비트용 12> 개)
extension_version<1>
INTERPRETER_OPT_FLAGS2<1>
ClientCorrHint<2>
ServerCorrHint<2>
NotifyIndex<2>
[ FloatDoubleMask<2> ]
extension_version<1> 은 확장 섹션의 크기를 바이트 단위로 제공합니다. 이렇게 하면 섹션이 현재 엔진이 이해하는 것보다 더 많은 필드가 있는 이후 컴파일러 버전에서 온 경우에도 현재 NDR 엔진이 확장 섹션을 올바르게 단계별로 실행할 수 있습니다.
INTERPRETER_OPT_FLAGS2 다음과 같이 정의됩니다.
typedef struct
{
unsigned char HasNewCorrDesc : 1; // 0x01
unsigned char ClientCorrCheck : 1; // 0x02
unsigned char ServerCorrCheck : 1; // 0x04
unsigned char HasNotify : 1; // 0x08
unsigned char HasNotify2 : 1; // 0x10
unsigned char Unused : 3;
} INTERPRETER_OPT_FLAGS2, *PINTERPRETER_OPT_FLAGS2;
HasNewCorrDesc 멤버는 컴파일러에서 생성된 형식 문자열에 새 상관 관계 설명자가 사용되는지 여부를 나타냅니다. 새로운 상관 관계 설명자는 공격 거부 기능과 관련이 있습니다. ClientCorrCheck 및 ServerCorrCheck 멤버는 루틴에 표시된 쪽의 상관 관계 검사 필요할 때 설정됩니다.
HasNotify 및 HasNotify2 플래그는 루틴이 각각 [notify] 및 [notify_flag] 특성에 정의된 알림 기능을 사용함을 나타냅니다.
ClientCorrHint 멤버는 클라이언트 쪽의 캐시 크기 힌트이며 ServerCorrHint는 서버 쪽에 대한 힌트입니다. 크기가 0으로 나오면 기본 크기를 사용해야 합니다.
NotifyIndex 요소는 알림 루틴(사용되는 경우)에 대한 인덱스입니다.
FloatDoubleMask 요소는 64비트 Windows의 부동 소수점 인수 문제를 해결합니다. 이 필드는 64비트 스텁에 대해서만 생성됩니다. 부동 소수점 인수를 처리하고 제대로 등록하려면 가상 스택에서 다운로드/업로드하는 어셈블리 루틴에 마스크가 필요합니다. 마스크는 인수당 2비트 또는 부동 소수점 레지스터별로 구성됩니다. 코딩은 다음과 같습니다. 가장 중요하지 않은 비트는 첫 번째 FP 레지스터에 해당하고, 다음 2비트에서는 두 번째 레지스터에 해당합니다.
참고
개체 루틴의 경우 첫 번째 인수는 이 포인터가 첫 번째이기 때문에 두 번째 레지스터에서 끝납니다. 각 레지스터에 대해 비트의 의미는 다음 표와 같습니다.
비트 | 의미 |
---|---|
01 | float 값을 레지스터에 로드해야 합니다. |
10 | double 값은 레지스터에 로드되어야 합니다. |
00 및 11은 비트에 대한 잘못된 값입니다.
현재 Intel 아키텍처 64비트 프로세서에는 8개의 FP 레지스터가 있으므로 마스크는 16b 최저 비트만 설정할 수 있습니다. 마스크 크기는 변경되지 않은 상태로 남아 있는 C 컴파일러 마스크에 따라 총 16비트로 설정되었습니다.
코드를 단순화하고 성능을 향상시키기 위해 컴파일러는 가능한 한 고정 크기 헤더를 생성하려고 시도합니다. 특히 다음 헤더는 비동기 DCOM에 사용됩니다.
typedef struct _NDR_DCOM_OI2_PROC_HEADER
{
unsigned char HandleType; // The Oi header
INTERPRETER_FLAGS OldOiFlags; //
unsigned short RpcFlagsLow; //
unsigned short RpcFlagsHi; //
unsigned short ProcNum; //
unsigned short StackSize; //
// expl handle descr is never generated //
unsigned short ClientBufferSize; // The Oi2 header
unsigned short ServerBufferSize; //
INTERPRETER_OPT_FLAGS Oi2Flags; //
unsigned char NumberParams; //
} NDR_DCOM_OI2_PROC_HEADER, *PNDR_DCOM_OI2_PROC_HEADER;