Udostępnij za pośrednictwem


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.