Поделиться через


Макет указателя

Макет указателя описывает указатели структуры или массива.

pointer_layout<>

Поле pointer_layout<> состоит из символов формата, FC_PP FC_PAD за которым следует одно или несколько описаний указателя, как описано далее, и завершение с символом формата FC_END:

FC_PP
FC_PAD
{ pointer_instance_layout<> }*
FC_END

Поле pointer_instance_layout<> — это строка формата, описывающая один или несколько экземпляров указателей. Следующие поля используются в этих дескрипторах:

  • offset_in_memory

    Смещение со знаком к расположению указателя в памяти. Для указателя, размещенного в структуре, это смещение является отрицательным смещением от конца структуры (конец несоответствующей части соответствующих структур); для массивов смещение начинается с начала массива.

  • offset_in_buffer

    Смещение со знаком в расположение указателя в буфере. Для указателя, размещенного в структуре, это смещение является отрицательным смещением от конца структуры (конец неконформантной части соответствующих структур): для массивов смещение начинается с начала массива.

  • offset_to_array

    Смещение от заключающей структуры к встроенному массиву, указатели которого обрабатываются. Для массивов верхнего уровня это поле всегда будет равно нулю.

  • iterations

    Общее количество указателей с одинаковым макетом<> .

  • increment

    Увеличение между последовательными указателями во время ПОВТОРА.

  • number_of_pointers

    Количество разных указателей в повторяемом экземпляре.

  • pointer_description

    Описание указателя.

Все макеты экземпляров указателя используют следующие одиночные pointer_instance<8>:

offset_to_pointer_in_memory<2> 
offset_to_pointer_in_buffer<2> 
pointer_description<4>

Ниже приведены дескрипторы экземпляров:

Один экземпляр указателя на простой тип:

FC_NO_REPEAT FC_PAD 
pointer_instance<8>

Исправлен указатель повтора:

FC_FIXED_REPEAT FC_PAD 
iterations<2> 
increment<2> 
offset_to_array<2> 
number_of_pointers<2>
{ pointer_instance<8> }*

Указатель повтора переменной:

FC_VARIABLE_REPEAT (FC_FIXED_OFFSET | FC_VARIABLE_OFFSET) 
increment<2> 
offset_to_array<2> 
number_of_pointers<2> 
{ pointer_instance<8> }*

Для экземпляров повторяющегося повтора и переменной существует набор описаний смещения и указателя для каждого указателя в экземпляре повторения.

Проблемы макета указателей

В этом разделе рассматриваются проблемы, связанные с обработкой соответствующих структур и внедренных указателей. Проблема заключается в том, что компилятор создает макеты указателей для структур и массивов с некоторыми избыточностью. Это полезно, так как информация полезна и как таковая, например, соответствующая структура может ходить по одному макету указателя для обслуживания всех указателей из структуры и из соответствующего массива, являющегося частью соответствующей структуры. Однако некоторые внедренные ситуации требуют, чтобы подсистема NDR выполняла дополнительную работу для обработки всех макетов указателя в правильной последовательности, обрабатывая каждый указатель точно один раз.

Создание компилятором

Каждый объект, обсуждаемый в этом разделе, содержит указатели, например соответствующая структура содержит указатели в части структуры, а также элементы массива. Элемент представляет собой простую структуру с указателем.

  1. Соответствующая структура, один уровень

    Дескриптор соответствия содержит часть PP, в которой описаны все указатели, как из структуры, так и из массива. Список элементов имеет FC_LONG вместо указателя. Дескриптор массива CARRAY содержит элементы посредством использования embedded_complex и дескрипторов указателя вообще. Элемент по-прежнему имеет дескриптор одного указателя. Макет указателя предшествует макету элемента в соответствующей структуре и простых дескрипторах структуры.

  2. Соответствующая структура, два или более уровней

    Описание PP содержит указатели со всех уровней. Он повторно использует то же описание массива, что и внутренняя структура соответствия. Список элементов имеет FC_LONG вместо указателя. Внедренная структура использует внедренный комплекс. Дескриптор соответствующей структуры повторно используется как есть. Размер плоской части структуры также завершается, что означает, что размер структуры верхнего уровня будет включать неструктурированный размер встроенной структуры.

  3. Сложная структура, единый уровень

    Элементы указателя помечаются FC_POINTER. Макет указателя упрощен так, что для каждой записи FC_POINTER в списке существует дескриптор указателя (4 байта). Макет указателя выполняется параллельно с обходом элемента, то есть FC_POINTER приводит к обработке следующего описания указателя. Массив CARRAY имеет макет указателя со всеми дескрипторами массива, а затем элементом, используя внедренный комплекс. Дескриптор элемента повторно используется. Размер плоской части структуры завершается; Другими словами, плоский размер структуры верхнего уровня включает в себя плоский размер внедренной структуры. Макет элемента предшествует макету указателя для сложных структур.

    Поэтому создание описания соответствующего массива отличается в зависимости от того, является ли он массивом внутри соответствующей структуры или внутри сложной структуры.

  4. Сложная структура, 2 или более уровней, сложная в сложном

    Сложная структура верхнего уровня имеет свои указатели-члены, внедренная сложная структура имеет свои указатели-члены. Дескриптор соответствующей структуры повторно используется. Дескриптор массива из верхней части является повторно используемым массивом из внедренной структуры.

  5. Сложная структура со встроенной структурой соответствия

    Структура соответствия верхнего уровня имеет свои указатели-члены. Дескриптор соответствующей структуры повторно используется как есть. Дескриптор массива повторно используется из внедренной структуры соответствия; другими словами, он не имеет указателей на дескриптор массива. Элемент имеет дескриптор указателя.

  6. Массивы структур с указателями

    Массив простых структур с указателями создается как SMFARRAY или CARRAY в зависимости от размера массива, но в обоих случаях он имеет полный макет указателя (FIXED_REPEAT или VARIABLE_REPEAT). Макет указателя поставляется перед макетом элемента.

    Массив сложных структур с указателями создается как BOGUS_ARRAY независимо от того, является ли он фиксированным или размером, и в обоих случаях не имеет макета указателя.

Что делает обработчик NDR

В этом разделе описывается поведение подсистемы NDR.

Проход маршалинга

  1. Соответствующие структуры и внедренная структура соответствия.

    Структура верхнего уровня ведет себя как одноуровневая структура.

  2. Внедренная сложная структура с соответствующим массивом

    Любая сложная структура заставляет внешнюю структуру быть сложной структурой. Внедренная структура никогда не маршалирует свой массив. Каждая структура всегда проходит через внедренные указатели, просто маршалинг членов и член, происходящий в FC_POINTER.

  3. Сложная структура со соответствующей структурой

    Наиболее внедренная структура соответствия маршалирует соответствующий массив и все указатели. Подсистема NDR никогда не спускается к более глубоким вложенным структурам, если есть какие-либо; это упрощает решение, так как соответствующая структура является конечным объектом насколько это касается маршалинг внедренных объектов. Сложная структура верхнего уровня пропускает маршалинг массива.

Unmarshaling, bufsizing and freeing проходит

Размыкание симметрично маршалингу; первая операция, выполняемая для сложных структур, заключается в том, чтобы узнать расположение указателей в буфере с помощью вызова функции NdrComplexStructBufferSize . Затем он немаршалирует указатели параллельно, что позволяет той же схеме для правильного использования указателей. Не должно быть путаницы о размерах объектов и профсоюзов; Изображение памяти не должно использоваться для объектов и союзов размера только для содержимого буфера.

Флаги, используемые для маршалинга и отмены правильно, используются таким же образом в буфизации и освобождении, чтобы убедиться, что указатели ходят ровно один раз.

Сквозная передача endianness

Во-первых, проход эндианности несколько похож на маршалинг/unmarshaling; для обработки сложных структур требуются два прохода. Первый проход преобразует плоскую часть и находит расположение указателей в буфере, аналогично тому, как буфизация выполняет эту операцию для размыкания. Затем второй проход преобразует указатели.

Endianness передается следующим образом: каждая структура и каждый элемент должны быть ступить, пока конечный элемент или элемент не является простым типом. Это отличается от немарширования; Например, в немаршлинге никогда не требуется обрабатывать соответствующие структуры, внедренные в соответствующие структуры, или любой член соответствующей структуры, в этом случае. Еще одна проблема заключается в том, что преобразование не является идемпотентной операцией, следовательно, unmarshaling pass может переосмыслить некоторые части без вреда, в то время как преобразование должно выполняться строго один раз на основе любого простого типа.

Таким образом, алгоритм эндианности можно суммировать следующим образом. NDR имеет представление о структуре соответствия верхнего уровня и флаге, чтобы пометить это соответствующим образом. При первом переходе, например для преобразования плоской части и получения расположения указателей, это понятие не будет использоваться. NDR будет спускаться через плоские части всех уровней структур и никогда не входить в обработку указателя. Наконец, NDR преобразовывает массив на верхнем уровне.

При переходе во второй раз флаг будет использоваться для пометки прохода внедренного указателя, чтобы избежать ввода более глубоких уровней соответствующих структур, то наиболее соответствующая структура. Таким образом, флаг будет принудительно использовать общее поведение маршалинга или отмены маршалинга, что позволяет избежать убывания на более глубоких уровнях соответствующих структур.

Второй проход для сложных структур с соответствующими массивами работает следующим образом: сложные структуры работают распространенным способом; это означает, что более глубокие уровни никогда не будут смотреть или пропускать их соответствующий размер или их соответствующие массивы, и скорее просто ходить их члены без касания массива.

Для сложных структур со соответствующими структурами необходимо знать, является ли она верхней и находится ли она в сложной структуре. Плоская часть массива обрабатывается самой соответствующей структурой. Во втором проходе верхняя наиболее соответствующая структура пропускает плоскую часть и проходит через макет указателя и возвращается. Самая сложная структура будет пропускать ее плоскую часть, а также пропускать макет указателя.

Надежный аспект эндианности прогулки

Эндианность проверка для обычных вне буферных условий и выполняет другие проверка некоррелизованной природы. Проверка, предназначенные для коррелированных значений (например, аргумента изменения размера и соответствующего размера), нельзя выполнить с помощью этого шага. Они выполняются позже при отмене параметров.