Deskriptor Korelasi

Deskriptor korelasi adalah string format yang menjelaskan ekspresi berdasarkan satu argumen yang terkait dengan argumen lain. Deskriptor korelasi diperlukan untuk menangani semantik yang terkait dengan atribut seperti [size_is()], [length_is()], [switch_is()] dan [iid_is()]. Deskriptor korelasi digunakan dengan array, pointer berukuran, penyatuan, dan penunjuk antarmuka. Nilai ekspresi akhirnya dapat berupa ukuran, panjang, penyatuan yang diskriminan, atau penunjuk ke IID, masing-masing. Dalam hal string format, deskriptor korelasi digunakan dengan array, union, dan pointer antarmuka. Penunjuk berukuran dijelaskan dalam string format sebagai penunjuk ke array.

Ada dua rutinitas yang melakukan perhitungan ekspresi dasar: NdrpComputeConformance digunakan untuk ukuran, sakelar, dan IID* sementara NdrpComputeVariance digunakan untuk panjang. Ada juga satu rutinitas untuk melakukan validasi nilai korelasi untuk fungsionalitas penolakan serangan.

Deskriptor korelasi telah dirancang untuk mendukung hanya ekspresi yang sangat terbatas. Untuk situasi yang rumit, kompilator menghasilkan rutinitas evaluasi ekspresi untuk dipanggil oleh mesin saat diperlukan.

Deskriptor korelasi memiliki format berikut:

correlation_type<1>
correlation_operator<1>
offset<2>
[robust_flags<2>]

Deskriptor korelasi correlation_type<1> terdiri dari dua nibble: 4 bit atas menjelaskan di mana ekspresi dapat ditemukan dan 4 bit yang lebih rendah menjelaskan jenis nilai ekspresi.

Nibble atas dapat memiliki salah satu dari lima nilai ini:

00  FC_NORMAL_CONFORMANCE
10  FC_POINTER_CONFORMANCE
20  FC_TOP_LEVEL_CONFORMANCE
80  FC_TOP_LEVEL_MULTID_CONFORMANCE
40  FC_CONSTANT_CONFORMANCE

FC_NORMAL_CONFORMANCE

Kasus kesuaian normal, seperti yang dijelaskan dalam bidang struktur.

FC_POINTER_CONFORMANCE

Untuk pointer atribut (size_is(), length_is()) yang merupakan bidang dalam struktur. Ini mempengaruhi cara penunjuk memori dasar diatur.

FC_TOP_LEVEL_CONFORMANCE

Untuk kesuaian tingkat atas yang dijelaskan oleh parameter lain.

FC_TOP_LEVEL_MULTID_CONFORMANCE

Untuk kesamaan tingkat atas dari array multidimensi yang dijelaskan oleh parameter lain.

Catatan

Array dan pointer berukuran multidimensi memicu pengalihan ke –Oicf.

 

FC_CONSTANT_CONFORMANCE

Untuk nilai konstanta. Pengkompilasi menghitung nilai dari ekspresi konstanta yang disediakan oleh pengguna. Jika demikian, 3 byte berikutnya dalam deskripsi kesesuaian berisi 3 byte yang lebih rendah dari panjang yang menjelaskan ukuran kesesuaian. Tidak diperlukan komputasi lebih lanjut.

Nibble yang lebih rendah memberikan jenis nilai yang perlu diekstraksi dari memori:

FC_LONG | FC_ULONG | 
FC_SHORT | FC_USHORT | 
FC_SMALL | FC_USMALL | 
FC_HYPER

Catatan

Ekspresi 64-bit tidak didukung. FC_HYPER hanya digunakan untuk iid_is() pada platform 64-bit untuk mengekstrak nilai pointer untuk IID*.

Kompilator mengatur jenis nibble ke nol untuk kasus berikut: ekspresi konstanta yang disebutkan di atas dan ketika rutinitas ekspresi evaluasi perlu dipanggil, misalnya, ketika FC_CONSTANT_CONFORMANCE dan FC_CALLBACK digunakan.

 

Bidang size_is_op<1> memungkinkan salah satu operasi berikut diterapkan ke variabel kesesuaian:

FC_DEREFERENCE | 
FC_DIV_2 | FC_MULT_2 | FC_SUB_1 | FC_ADD_1 | 
FC_CALLBACK

Konstanta FC_DEREFERENCE digunakan untuk korelasi menjadi pointee, seperti untuk [size_is(*pL)]. Operator aritmatika hanya menggunakan konstanta yang ditunjukkan. Konstanta FC_CALLBACK menunjukkan bahwa rutinitas evaluasi ekspresi perlu dipanggil.

Bidang offset<2> biasanya merupakan offset memori relatif ke variabel argumen ekspresi. Ini juga bisa menjadi evaluasi ekspresi–indeks rutin. Seperti disebutkan sebelumnya dalam dokumen ini, untuk ekspresi konstan itu adalah bagian dari nilai ekspresi akhir yang sebenarnya.

Interpretasi bidang offset<2> sebagai offset memori tergantung pada kompleksitas ekspresi, lokasi variabel ekspresi, dan dalam kasus array, apakah array sebenarnya adalah penunjuk yang diatribusikan.

Jika array adalah penunjuk atribut dan variabel kesuaian adalah bidang dalam struktur, bidang offset berisi offset dari awal struktur hingga bidang yang menjelaskan kesuaian. Jika array bukan penunjuk yang diatribusikan dan variabel kesamaan adalah bidang dalam struktur, bidang offset berisi offset dari akhir bagian struktur yang tidak sesuai dengan bidang yang menjelaskan kesamaan. Biasanya, array yang sesuai ada di akhir struktur.

Untuk kesamaan tingkat atas, bidang offset berisi offset dari lokasi parameter pertama stub pada tumpukan ke parameter yang menjelaskan kesamaan. Ini tidak digunakan dalam mode –Os . Ada pengecualian lain untuk interpretasi bidang offset; pengecualian tersebut dijelaskan dalam deskripsi jenis tersebut.

Saat offset<2> digunakan dengan FC_CALLBACK, ini berisi indeks dalam tabel rutin evaluasi ekspresi yang dihasilkan oleh pengkompilasi. Pesan stub diteruskan ke rutinitas evaluasi, yang kemudian menghitung nilai kesesuaian dan menetapkannya ke bidang MaxCount dari pesan stub.

Bidang robust_flags<2> telah ditambahkan untuk Windows 2000 untuk mendukung /robust, seperti fitur penolakan serangan. Bendera berikut ditentukan pada byte pertama:

typedef  struct  _NDR_CORRELATION_FLAGS
  {
  unsigned char   Early     : 1;
  unsigned char   Split     : 1;
  unsigned char   IsIidIs   : 1;
  unsigned char   DontCheck : 1;
  unsigned char   Unused    : 4;
  } NDR_CORRELATION_FLAGS;

Bendera Awal menunjukkan korelasi awal versus terlambat. Korelasi awal adalah ketika argumen ekspresi mendahului argumen yang dijelaskan, misalnya argumen ukuran sebelum argumen pointer berukuran. Korelasi terlambat adalah ketika argumen ekspresi muncul setelah argumen terkait. Mesin segera melakukan validasi nilai korelasi awal, nilai korelasi terlambat disimpan untuk diperiksa setelah unmarshaling selesai.

Bendera Split menunjukkan pemisahan asinkron di antara argumen [in] dan [out]. Misalnya, argumen ukuran mungkin [in] sementara penunjuk berukuran mungkin [keluar]. Dalam konteks asinkron DCOM, argumen ini kebetulan berada di tumpukan yang berbeda, sehingga mesin harus menyadari hal ini.

Bendera IsIidIs menunjukkan korelasi iid_is(). Rutinitas NdrComputeConformance ditipu untuk mendapatkan pointer ke IID sebagai nilai ekspresi, tetapi rutinitas validasi tidak dapat membandingkan nilai tersebut (mereka akan menjadi penunjuk) sehingga bendera menunjukkan bahwa IID aktual perlu dibandingkan.

Deskripsi Varians dan Atribut Array Lainnya

Format bidang deskripsi varians identik dengan bidang deskripsi kesesuaian. Perbedaannya adalah bidang pesan stub yang berbeda digunakan oleh mesin NDR sebagai variabel sementara. Dalam kasus deskripsi varians, panjangnya adalah panjang yang dievaluasi dan bidang yang sesuai disebut ActualLength.

Dengan varians, offset awal biasanya nol dan mesin disesuaikan. Jika atribut first_is() diterapkan ke array yang bervariasi yang sesuai, panggilan balik ke rutinitas evaluasi ekspresi dipaksa.