Marshaling użytkownika
Marshal użytkownika ma ciąg formatu podobny do transmit_as:
FC_USER_MARSHAL
flags<1>
quadruple_index<2>
user_type_memory_size<2>
transmitted_type_buffer size<2>
offset_to_the_transmitted_type<2>
Flagi<1> bajtu składają się z górnej flagi nibble i dolnej nibble wyrównania.
Górne 2 bity nibble flagi służą do opisania, czy typ przewodu jest zdefiniowany jako unikatowy wskaźnik, wskaźnik odniesienia lub żaden wskaźnik (nie może to być ptr). Następujące manifesty zostały zdefiniowane w celu ustawienia/pobrania flag:
#define USER_MARSHAL_UNIQUE 0x80
#define USER_MARSHAL_REF 0x40
#define USER_MARSHAL_POINTER 0xc0 /* unique or ref */
#define USER_MARSHAL_IID 0x20 /* JIT compiler only */
Wyrównanie słowa flagi utrzymuje wyrównanie przewodu typu przesyłanego.
Quadruple_index<2> jest indeksem procedury wywołania zwrotnego czterokrotnie funkcji marshala użytkownika. Rutynowe pozycje są następujące: ustalanie rozmiaru, marshaling, unmarshaling i zwalnianie rutynowych.
User_type_memory_size<2> udostępnia rozmiar typu specyficznego dla użytkownika, w tym nieznanych typów.
Transmitted_type_buffer_size<2> wynosi zero, gdy rozmiar jest różny lub rzeczywisty stały rozmiar. Jest to optymalizacja, która umożliwia MIDL pomijanie wywołań zwrotnych podczas określania rozmiaru buforu, a także podczas zwalniania.
Zakres
Sprawdzanie [zakres] zapewnia dodatkowe środki weryfikacji argumentów w warstwie NDR. Deskryptor [zakres] ma następujący format:
FC_RANGE, flags_type <1>
low value<4>
high value<4>
Flagi biorą górne nibble i typ dolnej nibble drugiego bajtu. Niskie i wysokie wartości zależą od typu zmiennej do sprawdzenia.
Flagi są przeznaczone jako pojazd rozszerzający; kompilator ustawił nibble na zero.