PMRX_CREATE_V_NET_ROOT fungsi panggilan balik (mrx.h)

Rutinitas MRxCreateVNetRoot dipanggil oleh RDBSS untuk meminta agar pengalih mini jaringan membuat struktur V_NET_ROOT dan, dalam beberapa kasus, struktur NET_ROOT.

Sintaks

PMRX_CREATE_V_NET_ROOT PmrxCreateVNetRoot;

NTSTATUS PmrxCreateVNetRoot(
  IN OUT PMRX_CREATENETROOT_CONTEXT Context
)
{...}

Parameter

Context

[in, out] Penunjuk ke konteks panggilan balik yang digunakan oleh pengalih mini jaringan untuk memberi tahu RDBSS ketika panggilan akhirnya selesai. Ini termasuk struktur RX_CONTEXT permintaan di Context-RxContext>. Parameter Konteks mencakup struktur V_NET_ROOT yang akan dibangun di Context-pVNetRoot>. Struktur V_NET_ROOT ini berisi penunjuk ke struktur NET_ROOT di pVNetRoot-pNetRoot>. Struktur NET_ROOT juga berisi penunjuk ke struktur SRV_CALL di pNetRoot-pSrvCall>.

Nilai kembali

RDBSS mengharapkan bahwa MRxCreateVNetRoot mengembalikan STATUS_PENDING pada keberhasilan atau kegagalan. Perilaku ini menghasilkan karena RDBSS mengharapkan panggilan ini selesai secara asinkron. Pengalih mini jaringan harus memetakan STATUS_SUCCESS ke STATUS_PENDING sebagai nilai pengembalian untuk MRxCreateVNetRoot.

Status penyelesaian akhir dikembalikan dalam anggota Context-VirtualNetRootStatus> dan Context-NetRootStatus> setelah panggilan selesai dan rutinitas di anggota Callback struktur Konteks dipanggil oleh pengalih mini jaringan. Anggota ini awalnya berisi STATUS_SUCCESS hingga pengalih mini jaringan mengubah nilai ini setelah selesai. Jika panggilan berhasil diselesaikan, kedua anggota berisi STATUS_SUCCESS.

Jika gagal membuat struktur V_NET_ROOT atau NET_ROOT, salah satu kode kesalahan umum berikut untuk anggotaVirtualNetRootStatus atau NetRootStatus dikembalikan (meskipun kode kesalahan lainnya dimungkinkan):

Menampilkan kode Deskripsi
STATUS_CONNECTION_RESET Koneksi ke sumber daya jarak jauh direset.
STATUS_IO_TIMEOUT Waktu habis terjadi pada permintaan I/O.
STATUS_RETRY Server boot jarak jauh belum siap untuk memenuhi permintaan.
STATUS_UNEXPECTED_NETWORK_ERROR Terjadi kesalahan jaringan yang tidak terduga biasanya disebabkan oleh handel yang tidak valid.

Keterangan

Dua abstraksi penting yang digunakan dalam antarmuka antara RDBSS dan pengalihan mini jaringan adalah struktur SRV_CALL dan struktur NET_ROOT/V_NET_ROOT. Struktur SRV_CALL sesuai dengan konteks yang terkait dengan server yang koneksinya telah dibuat. Struktur NET_ROOT sesuai dengan berbagi di server. Struktur V_NET_ROOT dapat dilihat sebagai bagian dari namespace di bawah struktur NET_ROOT yang diklaim oleh pengalih mini jaringan.

Pembuatan struktur NET_ROOT/V_NET_ROOT biasanya melibatkan setidaknya satu perjalanan pulang pergi jaringan. Operasi ini dapat memakan waktu cukup lama untuk diselesaikan karena koneksi jaringan dengan sumber daya jarak jauh mungkin perlu dibuat. Untuk memastikan bahwa operasi asinkron berlanjut, pembuatan struktur NET_ROOT/V_NET_ROOT dimodelkan sebagai aktivitas dua fase. Setiap panggilan ke pengalihan mini jaringan untuk membuat struktur NET_ROOT/V_NET_ROOT diikuti dengan panggilan kembali dari pengalih mini jaringan ke RDBSS yang menunjukkan ke RDBSS status penyelesaian permintaan ke pengalihan mini jaringan. Karena RDBSS mengharapkan MRxCreateVNetRoot selesai secara asinkron, RDBSS mengharapkan MRxCreateVNetRoot untuk mengembalikan STATUS_PENDING. RDBSS akan diberi tahu menggunakan rutinitas panggilan balik ketika panggilan akhirnya selesai.

MRxCreateVNetRoot harus menangani dua kasus yang menarik:

  • Struktur V_NET_ROOT baru dan struktur NET_ROOT baru terkait sedang dibuat.
  • Struktur V_NET_ROOT baru yang terkait dengan struktur NET_ROOT yang ada sedang dibuat.

Kedua kasus ini dapat dibedakan dengan memeriksa apakah konteks yang terkait dengan struktur NET_ROOT adalah NULL.

Implementasi pengalihan mini jaringan MRxCreateVNetRoot diharapkan mengembalikan STATUS_PENDING ke panggilan awal. Ketika pemrosesan selesai, pengalih mini jaringan akan memanggil rutinitas panggilan balik yang diteruskan sebagai bagian dari parameter Konteks untuk memberi tahu RDBSS bahwa panggilan selesai dan mengembalikan status penyelesaian. Rutinitas panggilan balik yang harus dipanggil oleh pengalih mini jaringan ditentukan sebagai anggota Panggilan balik dalam struktur MRX_CREATENETROOT_CONTEXT diteruskan sebagai parameter Konteks . Status penyelesaian akhir panggilan MRxCreateVNetRoot harus disimpan di anggota VirtualNetRootStatus dan NetRootStatus dari parameter Konteks . Perhatikan bahwa status terpisah dikembalikan untuk struktur NET_ROOT dan V_NET_ROOT.

Implementasi MRxCreateVNetRoot dalam mini-redirector jaringan juga dipersulit oleh kebutuhan handel transportasi. Antarmuka terkait transportasi tertentu memerlukan handel untuk dibuat dan digunakan untuk semua komunikasi. Membuat struktur NET_ROOT atau V_NET_ROOT mungkin memerlukan pembuatan handel terkait transportasi untuk komunikasi jaringan. Karena proses membangun koneksi jaringan dapat memakan waktu, setelah koneksi dibuat, masuk akal untuk menggunakan koneksi untuk komunikasi selama mungkin. Setelah handel transportasi ke sumber daya jaringan jarak jauh dibuat, itu dapat digunakan kembali oleh sejumlah permintaan aplikasi lainnya. Ketika aplikasi pengguna berakhir, handel yang terkait dengan proses akan dihapus. Untuk alasan ini, membuat handel transportasi dalam konteks proses mode pengguna sementara yang mungkin berumur pendek tidak masuk akal. Jadi struktur NET_ROOT atau V_NET_ROOT biasanya perlu diinisialisasi dalam konteks proses terkenal yang tidak akan hilang saat handel transportasi ini digunakan untuk komunikasi.

Salah satu metode yang digunakan untuk mengelola ini di mini-redirector jaringan adalah dengan memiliki proses sistem RDBSS yang mengalokasikan handel transportasi ini. Ini mempengaruhi bagaimana rutinitas MRxCreateVNetRoot dijalankan. Jika permintaan ke MRxCreateVNetRoot dikeluarkan dalam konteks proses sistem RDBSS, maka panggilan ini dapat segera dijalankan dan tidak perlu diposting ke antrean kerja. Namun, untuk menghindari masalah, jika permintaan ke MRxCreateVNetRoot berasal dari proses lain, permintaan akan diposting ke antrean kerja sistem menggunakan RxDispatchToWorkerThread untuk eksekusi nanti. RDBSS nantinya akan menggunakan salah satu utas sistemnya untuk memproses permintaan antrean kerja dan menjalankan MRxCreateVNetRoot. Ini memastikan bahwa setiap handel transportasi akan dimiliki oleh proses sistem.

Pengalih mini jaringan dapat menentukan apakah panggilan ke MRxCreateVNetRoot diterima langsung dari RDBSS dengan memanggil RxGetRDBSSProcess. RxGetRDBSSProcess mengembalikan proses RDBBS dan nilai ini dapat dibandingkan dengan proses saat ini yang dikembalikan dengan memanggil IoGetCurrentProcess. Jika panggilan ke MRxCreateVNetRoot tidak dimulai dalam konteks proses sistem RDBSS, maka MRxCreateVNetRoot dapat mengembalikan STATUS_PENDING dan memposting panggilan ke antrean kerja menggunakan RxDispatchToWorkerThread untuk eksekusi nanti oleh RDBSS. Biasanya, panggilan ini akan diposting ke DelayedWorkQueue.

Terserah pada pengalihan mini jaringan untuk memutuskan bagaimana MRxCreateVNetRoot diterapkan. Jika proses ini dapat memakan waktu yang cukup lama, maka panggilan ini harus diselesaikan secara asinkron. Jika handel transportasi diperlukan, maka pengalih mini jaringan mungkin menginginkan proses sistem yang berumur panjang untuk membangun handel ini.

Jika koneksi tidak dapat dibuat, pengalih mini jaringan dapat mencoba mentransisikan struktur NET_ROOT dan V_NET_ROOT ke mode terputus (jika ini didukung) dan membuat koneksi offline.

Ketika MRxCreateVNetRoot selesai, parameter Konteks harus dimodifikasi dengan informasi struktur NET_ROOT dan V_NET_ROOT yang sesuai yang diperbarui dari pengalihan mini jaringan.

Persyaratan

Persyaratan Nilai
Target Platform Desktop
Header mrx.h (termasuk Mrx.h)

Lihat juga

IoGetCurrentProcess

MRxCreateSrvCall

MRxExtractNetRootName

MRxFinalizeNetRoot

MRxFinalizeSrvCall

MRxFinalizeVNetRoot

MRxPreparseName

MRxSrvCallWinnerNotify

RxDispatchToWorkerThread

RxGetRDBSSProcess