Dela via


Rubriken

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;