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.
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;