Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Följande rubrik representerar ett av huvudformaten som kan genereras av den aktuella versionen av MIDL. För enkelhetens skull finns den fullständiga listan med rubrikfält här.
(–Oif rubrik)
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>
Tillägg som börjar med Windows 2000: <8> för 32-bitars, <12> för 64-bitars)
extension_version<1>
INTERPRETER_OPT_FLAGS2<1>
ClientCorrHint<2>
ServerCorrHint<2>
NotifyIndex<2>
[ FloatDoubleMask<2> ]
Extension_version<1> innehåller storleken på tilläggsavsnittet i byte. Detta gör det möjligt för den aktuella NDR-motorn att gå över tilläggsavsnittet korrekt även om avsnittet skulle komma från en senare kompilatorversion med fler fält än vad den aktuella motorn förstår.
INTERPRETER_OPT_FLAGS2 definieras enligt följande:
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- medlem anger om nya korrelationsbeskrivningar används i de formatsträngar som genereras av kompilatorn. Den nya korrelationsbeskrivningen är relaterad till denial-of-attack-funktionen. ClientCorrCheck och ServerCorrCheck medlemmar anges när rutinen behöver korrelationskontrollen på den angivna sidan.
Flaggorna HasNotify och HasNotify2 anger att rutinen använder aviseringsfunktionen enligt definitionen i [notify] respektive [notify_flag] attribut.
ClientCorrHint medlem är ett tips om cachestorlek på klientsidan och ServerCorrHint är ett tips på serversidan. När storleken visas som noll ska en standardstorlek användas.
Elementet NotifyIndex är ett index till en aviseringsrutin, om ett används.
Elementet FloatDoubleMask åtgärdar problemet med ett flyttalargument för 64-bitars Windows. Det här fältet genereras endast för 64-bitars stubs. Masken behövs för de sammansättningsrutiner som laddar ned/laddar upp register från/till den virtuella stacken för att hantera flyttalsargument och registreras korrekt. Masken består av 2 bitar per argument, eller snarare per flyttalsregister. Kodningen är följande: De minst signifikanta bitarna motsvarar det första FP-registret, nästa 2 bitar motsvarar det andra registret och så vidare.
Not
För objektrutiner hamnar det första argumentet i det andra registret på grund av att den här pekaren är först. För varje register är innebörden av bitar som visas i följande tabell.
Bitar | Betydelse |
---|---|
01 | Ett flyttalvärde ska läsas in i registret. |
10 | Ett dubbelt värde ska läsas in i registret. |
00 och 11 är ogiltiga värden för bitarna.
För närvarande finns det åtta FP-register i en Intel Architecture 64-bitars processor, därför kan masken bara ha 16b lägsta bitar inställda. Maskstorleken har ställts in på totalt 16 bitar baserat på att C-kompilatormasken förblir oförändrad.
Huvudströmlinering för prestanda
För att förenkla koden och förbättra prestandan försöker kompilatorn generera en rubrik med fast storlek när det är möjligt. I synnerhet används följande rubrik för asynkron 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;