상관 관계 설명자
상관 관계 설명자는 다른 인수와 관련된 인수를 기반으로 식을 설명하는 형식 문자열입니다. [size_is()], [length_is()], [switch_is()] 및 [iid_is()]와 같은 특성과 관련된 의미 체계를 처리하는 데 상관 관계 설명자가 필요합니다. 상관 관계 설명자는 배열, 크기 포인터, 공용 구조체 및 인터페이스 포인터와 함께 사용됩니다. 최종 식 값은 각각 크기, 길이, 공용 구조체 비범죄자 또는 IID에 대한 포인터일 수 있습니다. 형식 문자열의 관점에서 상관 관계 설명자는 배열, 공용 구조체 및 인터페이스 포인터와 함께 사용됩니다. 크기가 큰 포인터는 배열에 대한 포인터로 형식 문자열로 설명됩니다.
기본 식 계산을 수행하는 두 가지 루틴이 있습니다. NdrpComputeConformance는 크기, 스위치 및 IID*에 사용되고 NdrpComputeVariance는 길이에 사용됩니다. 공격 거부 기능에 대한 상관 관계 값 유효성 검사를 수행하는 단일 루틴도 있습니다.
상관 관계 설명자는 매우 제한된 식만 지원하도록 설계되었습니다. 복잡한 상황에서 컴파일러는 필요할 때 엔진에서 호출할 식 평가 루틴을 생성합니다.
상관 관계 설명자의 형식은 다음과 같습니다.
correlation_type<1>
correlation_operator<1>
offset<2>
[robust_flags<2>]
상관 관계 설명자 correlation_type<1> 은 두 개의 니블로 구성됩니다. 상위 4비트에서는 식을 찾을 수 있는 위치를 설명하고 하위 4비트에서는 식 값의 형식을 설명합니다.
위쪽 니블은 다음 다섯 가지 값 중 하나를 가질 수 있습니다.
00 FC_NORMAL_CONFORMANCE
10 FC_POINTER_CONFORMANCE
20 FC_TOP_LEVEL_CONFORMANCE
80 FC_TOP_LEVEL_MULTID_CONFORMANCE
40 FC_CONSTANT_CONFORMANCE
-
FC_NORMAL_CONFORMANCE
-
구조체의 필드에 설명된 것과 같은 일반적인 규칙 사례입니다.
-
FC_POINTER_CONFORMANCE
-
구조체의 필드인 특성이 지정된 포인터(size_is(), length_is())의 경우 이는 기본 메모리 포인터가 설정되는 방식에 영향을 줍니다.
-
FC_TOP_LEVEL_CONFORMANCE
-
다른 매개 변수에서 설명하는 최상위 규칙의 경우.
-
FC_TOP_LEVEL_MULTID_CONFORMANCE
-
다른 매개 변수에서 설명하는 다차원 배열의 최상위 규칙.
참고
다차원 크기의 배열 및 포인터는 –Oicf로의 전환을 트리거합니다.
-
FC_CONSTANT_CONFORMANCE
-
상수 값의 경우. 컴파일러는 사용자가 제공한 상수 식의 값을 미리 계산합니다. 이 경우 규칙 설명의 후속 3바이트에는 규칙 크기를 설명하는 긴 3바이트의 하위 3바이트가 포함됩니다. 더 이상 계산이 필요하지 않습니다.
하위 니블은 메모리에서 추출해야 하는 값의 형식을 제공합니다.
FC_LONG | FC_ULONG |
FC_SHORT | FC_USHORT |
FC_SMALL | FC_USMALL |
FC_HYPER
참고
64비트 식은 지원되지 않습니다. FC_HYPER IID*에 대한 포인터 값을 추출하기 위해 64비트 플랫폼의 iid_is() 에만 사용됩니다.
컴파일러는 위에서 언급한 상수 식과 계산 식 루틴을 호출해야 하는 경우(예: FC_CONSTANT_CONFORMANCE 및 FC_CALLBACK 사용되는 경우)에 대해 nibble 형식을 0으로 설정합니다.
size_is_op<1> 필드를 사용하면 다음 작업 중 하나를 규칙 변수에 적용할 수 있습니다.
FC_DEREFERENCE |
FC_DIV_2 | FC_MULT_2 | FC_SUB_1 | FC_ADD_1 |
FC_CALLBACK
FC_DEREFERENCE 상수는 [size_is(*pL)]과 같이 점자인 상관 관계에 사용됩니다. 산술 연산자는 표시된 상수만 사용합니다. FC_CALLBACK 상수는 식 계산 루틴을 호출해야 했음을 나타냅니다.
오프셋<2> 필드는 일반적으로 식 인수 변수에 대한 상대 메모리 오프셋입니다. 식 계산-루틴 인덱스일 수도 있습니다. 이 문서에서 앞서 설명한 것처럼 상수 식의 경우 실제 최종 식 값의 일부입니다.
오프셋<2> 필드를 메모리 오프셋으로 해석하는 것은 식의 복잡성, 식 변수의 위치 및 배열의 경우 배열이 실제로 특성 포인터인지 여부에 따라 달라집니다.
배열이 특성 포인터이고 규칙 변수가 구조체의 필드인 경우 오프셋 필드에는 구조체 시작부터 규칙 설명 필드까지의 오프셋이 포함됩니다. 배열이 특성이 있는 포인터가 아니고 규칙 변수가 구조체의 필드인 경우 오프셋 필드에는 구조체의 부적합 부분 끝에서 규칙 설명 필드까지의 오프셋이 포함됩니다. 일반적으로 규칙 배열은 구조체의 끝에 있습니다.
최상위 규칙의 경우 오프셋 필드에는 스택에 있는 스텁의 첫 번째 매개 변수 위치에서 규격을 설명하는 매개 변수까지의 오프셋이 포함됩니다. –Os 모드에서는 사용되지 않습니다. 오프셋 필드의 해석에는 다른 예외가 있습니다. 이러한 예외는 해당 형식에 대한 설명에 설명되어 있습니다.
오프셋<2> 를 FC_CALLBACK 사용하는 경우 컴파일러에서 생성된 식 계산 루틴 테이블에 인덱스가 포함됩니다. 스텁 메시지는 평가 루틴에 전달된 다음, 규칙 값을 계산하고 스텁 메시지의 MaxCount 필드에 할당합니다.
windows 2000에서 공격 거부 기능과 같은 /strong을 지원하기 위해 robust_flags<2> 필드가 추가되었습니다. 다음 플래그는 첫 번째 바이트에 정의됩니다.
typedef struct _NDR_CORRELATION_FLAGS
{
unsigned char Early : 1;
unsigned char Split : 1;
unsigned char IsIidIs : 1;
unsigned char DontCheck : 1;
unsigned char Unused : 4;
} NDR_CORRELATION_FLAGS;
초기 플래그는 초기 및 후반 상관 관계를 나타냅니다. 초기 상관 관계는 식 인수가 설명된 인수 앞에 오는 경우입니다. 예를 들어 size 인수는 크기의 포인터 인수 앞에 있습니다. 지연 상관 관계는 식 인수가 관련 인수 다음에 오는 경우입니다. 엔진은 즉시 초기 상관 관계 값의 유효성을 검사하고, 말기 상관 관계 값은 경계 해제가 완료된 후 확인을 위해 저장됩니다.
분할 플래그는 [in] 및 [out] 인수 간에 비동기 분할을 나타냅니다. 예를 들어 크기 인수는 [in]일 수 있지만 크기가 큰 포인터는 [out]일 수 있습니다. DCOM 비동기 컨텍스트에서 이러한 인수는 서로 다른 스택에 있으므로 엔진에서 이를 알고 있어야 합니다.
IsIidIs 플래그는 iid_is() 상관 관계를 나타냅니다. NdrComputeConformance 루틴은 IID에 대한 포인터를 식 값으로 가져오도록 속지만 유효성 검사 루틴은 이러한 값(포인터)을 비교할 수 없으므로 플래그는 실제 IID를 비교해야 했음을 나타냅니다.
분산 설명 및 기타 배열 특성
분산 설명 필드 형식은 규칙 설명 필드와 동일합니다. 차이점은 다른 스텁 메시지 필드가 NDR 엔진에서 임시 변수로 사용된다는 것입니다. 분산 설명의 경우 평가되는 길이이며 해당 필드를 ActualLength라고 합니다.
분산을 사용하면 시작 오프셋은 일반적으로 0이고 엔진은 그에 따라 조정됩니다. first_is() 특성이 규칙적인 다양한 배열에 적용되는 경우 식 계산 루틴에 대한 콜백이 강제로 적용됩니다.