Baca dalam bahasa Inggris

Bagikan melalui


The Header

Header berikut mewakili salah satu gaya header yang dapat dihasilkan oleh versi MIDL saat ini. Untuk kenyamanan, daftar lengkap bidang header disediakan di sini.

(header–Oif )

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>

Ekstensi yang dimulai dengan Windows 2000: <8> untuk 32-bit, <12> untuk 64-bit)

extension_version<1>
INTERPRETER_OPT_FLAGS2<1>
ClientCorrHint<2>
ServerCorrHint<2>
NotifyIndex<2>
[ FloatDoubleMask<2> ]

extension_version<1> menyediakan ukuran bagian ekstensi, dalam byte. Melakukannya memungkinkan mesin NDR saat ini untuk melangkahi bagian ekstensi dengan benar bahkan jika bagian berasal dari versi pengkompilasi yang lebih baru dengan lebih banyak bidang daripada yang dipahami mesin saat ini.

INTERPRETER_OPT_FLAGS2 didefinisikan sebagai berikut:

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;

Anggota HasNewCorrDesc menunjukkan apakah deskriptor korelasi baru digunakan dalam string format yang dihasilkan oleh pengkompilasi. Deskriptor korelasi baru terkait dengan fungsionalitas penolakan serangan. Anggota ClientCorrCheck dan ServerCorrCheck diatur ketika rutinitas memerlukan pemeriksaan korelasi di sisi yang ditunjukkan.

Bendera HasNotify dan HasNotify2 menunjukkan bahwa rutinitas menggunakan fitur pemberitahuan sebagaimana didefinisikan oleh atribut [beri tahu] dan [notify_flag ].

Anggota ClientCorrHint adalah petunjuk ukuran cache di sisi klien dan ServerCorrHint adalah petunjuk di sisi server. Ketika ukuran keluar sebagai nol, ukuran default harus digunakan.

Elemen NotifyIndex adalah indeks untuk memberi tahu rutinitas, jika elemen digunakan.

Elemen FloatDoubleMask mengatasi masalah argumen titik mengambang untuk Windows 64-bit. Bidang ini dihasilkan hanya untuk pangsa 64-bit. Masker diperlukan untuk rutinitas perakitan yang mengunduh/mengunggah register dari/ke tumpukan virtual untuk menangani argumen floating-point dan mendaftar dengan benar. Masker terdiri dari 2 bit per argumen, atau lebih tepatnya per register floating-point. Pengodeannya adalah sebagai berikut: Bit yang paling tidak signifikan sesuai dengan register FP pertama, 2 bit berikutnya sesuai dengan register kedua, dan sebagainya.

Catatan

Untuk rutinitas objek, argumen pertama berakhir di register kedua karena pointer ini adalah yang pertama. Untuk setiap daftarkan arti bit seperti yang ditunjukkan dalam tabel berikut.

 

Bit Makna
01 Nilai float harus dimuat ke register.
10 Nilai ganda harus dimuat ke register.

 

00 dan 11 adalah nilai yang tidak valid untuk bit.

Saat ini ada delapan register FP dalam prosesor Intel Architecture 64-bit, sehingga masker hanya dapat memiliki set bit terendah 16b. Ukuran masker telah diatur ke total 16 bit berdasarkan masker kompiler C yang tersisa tidak berubah.

Header Streamlining untuk Performa

Untuk menyederhanakan kode dan meningkatkan performa, pengkompilasi mencoba menghasilkan header ukuran tetap jika memungkinkan. Secara khusus, header berikut digunakan untuk DCOM asinkron:

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;