Bagikan melalui


PMRX_CREATE_SRVCALL fungsi panggilan balik (mrx.h)

Rutinitas MRxCreateSrvCall dipanggil oleh RDBSS untuk meminta agar pengalih mini jaringan membuat struktur SRV_CALL dan membangun koneksi dengan server.

Sintaks

PMRX_CREATE_SRVCALL PmrxCreateSrvcall;

NTSTATUS PmrxCreateSrvcall(
  IN OUT PMRX_SRV_CALL SrvCall,
  IN OUT PMRX_SRVCALL_CALLBACK_CONTEXT SrvCallCallBackContext
)
{...}

Parameter

SrvCall

[in, out] Penunjuk ke struktur SRV_CALL yang akan dibuat.

SrvCallCallBackContext

[in, out] Penunjuk ke konteks panggilan balik yang digunakan oleh pengalih mini jaringan untuk memberi tahu RDBSS ketika permintaan MRxCreateSrvCall akhirnya selesai. Parameter SrvCallCallBackContext menunjuk ke struktur MRX_SRVCALLDOWN_STRUCTURE yang berisi struktur RX_CONTEXT untuk permintaan ini, serta rutinitas Callback yang dipanggil pengalih mini ketika permintaan MRxCreateSrvCall akhirnya selesai.

Nilai kembali

RDBSS mengharapkan MRxCreateSrvCall untuk 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 MRxCreateSrvCall.

Status penyelesaian akhir dikembalikan di anggota SrvCallCallBackContext-Status> setelah panggilan selesai dan rutinitas di anggota Callback dalam struktur MRX_SRVCALLDOWN_STRUCTURE dipanggil oleh pengalih mini jaringan. Anggota ini awalnya berisi STATUS_BAD_NETWORK_PATH hingga pengalih mini jaringan mengubah nilai ini setelah selesai.

Anggota SrvCallCallBackContext-Status> berisi STATUS_SUCCESS pada keberhasilan setelah panggilan selesai atau salah satu kode kesalahan umum berikut tentang kegagalan (meskipun kode kesalahan lainnya dimungkinkan):

Menampilkan kode Deskripsi
STATUS_BAD_NETWORK_PATH Jalur jaringan yang ditentukan buruk.
STATUS_NETWORK_UNREACHABLE Jaringan tidak dapat dijangkau.

Keterangan

Dua abstraksi penting yang digunakan dalam antarmuka antara RDBSS dan pengalihan mini jaringan adalah struktur SRV_CALL dan struktur NET_ROOT. Struktur SRV_CALL sesuai dengan konteks yang terkait dengan server setelah koneksi dibuat. Struktur NET_ROOT sesuai dengan berbagi di server (ini juga dapat dilihat sebagai bagian dari namespace layanan yang telah diklaim oleh pengalih mini jaringan).

Pembuatan struktur SRV_CALL 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 SRV_CALL dimodelkan sebagai aktivitas dua fase. Setiap panggilan ke pengalihan mini jaringan untuk membuat struktur SRV_CALL disertai dengan panggilan dari pengalih mini jaringan ke RDBSS yang menentukan status penyelesaian permintaan. RDBSS mengasumsikan bahwa MRxCreateSrvCall akan diselesaikan secara asinkron. Jadi RDBSS mengharapkan MRxCreateSrvCall untuk mengembalikan STATUS_PENDING. RDBSS akan diberi tahu menggunakan rutinitas panggilan balik ketika panggilan akhirnya selesai.

Implementasi pengalihan mini jaringan MRxCreateSrvCall diharapkan mengembalikan STATUS_PENDING ke panggilan awal. Ketika pemrosesan selesai, pengalih mini jaringan memanggil rutinitas panggilan balik yang diteruskan sebagai bagian dari parameter SrvCallCallBackContext untuk memberi tahu RDBSS bahwa panggilan telah selesai dan untuk mengembalikan status penyelesaian. Rutinitas panggilan balik yang dipanggil pengalih mini jaringan ditentukan sebagai anggota Callback di MRX_SRVCALLDOWN_STRUCTURE parameter SrvCallCallBackContext . Status penyelesaian akhir panggilan harus disimpan di anggota Status parameter SrvCallCallBackContext .

Jika berhasil, pengalih mini jaringan juga harus menyimpan beberapa nilai di anggota RecommunicateContext dari SrvCallCallBackContext. Nilai yang disimpan dalam anggota RecommunicateContext adalah nilai yang akan diteruskan RDBSS ke MRxSrvCallWinnerNotify dalam parameter RecommunicateContext jika MRxCreateSrvCall berhasil. Pengalih mini jaringan juga harus mengisi data yang sesuai dalam parameter SrvCall untuk struktur SRV_CALL yang dibuat. Perhatikan bahwa parameter SrvCall yang diteruskan ke MRxCreateSrvCall sama dengan anggota SrvCall dalam MRX_SRVCALLDOWN_STRUCTURE parameter SrvCallCallBackContext . Parameter SrvCall yang sama ini juga diteruskan ke MRxSrvCallWinnerNotify dalam parameter SrvCall .

Implementasi MRxCreateSrvCall 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 SRV_CALL 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, membangun handel transportasi dalam konteks proses mode pengguna sementara yang bisa berumur pendek tidak masuk akal. Jadi struktur SRV_CALL biasanya perlu diinisialisasi dalam konteks proses terkenal yang tidak akan hilang saat handel transportasi ini digunakan untuk komunikasi.

Salah satu metode yang digunakan untuk mengatasi potensi masalah dengan handel transportasi adalah dengan memiliki proses sistem RDBSS yang mengalokasikan handel transportasi. Ini mempengaruhi bagaimana rutinitas MRxCreateSrvCall dijalankan. Jika permintaan ke MRxCreateSrvCall 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 MRxCreateSrvCall 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 MRxCreateSrvCall. Ini memastikan bahwa setiap handel transportasi akan dimiliki oleh proses sistem.

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

Terserah pengembang pengarah mini jaringan untuk memutuskan bagaimana MRxCreateSrvCall diterapkan. Jika proses untuk membuat SRV_CALL dapat memakan waktu yang cukup lama, maka MRxCreateSrvCall harus diselesaikan secara asinkron. Jika handel transportasi diperlukan, maka pengalih mini jaringan perlu menemukan proses sistem yang berumur panjang untuk membangun handel ini.

Ketika panggilan ini selesai, parameter SrvCall harus dimodifikasi dengan informasi struktur SRV_CALL yang diperbarui dari pengalih mini jaringan.

Pengalih mini jaringan yang menunjukkan dukungan sebagai penyedia UNC akan menerima klaim awalan dari Beberapa Penyedia UNC (MUP) sebagai panggilan ke MRxCreateSrvCall. Untuk informasi selengkapnya tentang Penamaan DAN MUP UNC, lihat Dukungan untuk Penamaan dan MUP UNC.

Persyaratan

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

Lihat juga

IoGetCurrentProcess

MRxCreateVNetRoot

MRxExtractNetRootName

MRxFinalizeNetRoot

MRxFinalizeSrvCall

MRxFinalizeVNetRoot

MRxPreparseName

MRxSrvCallWinnerNotify

RxDispatchToWorkerThread

RxGetRDBSSProcess