Fungsi MmAdvanceMdl (wdm.h)

Rutinitas MmAdvanceMdl memajukan awal rentang memori virtual MDL dengan jumlah byte yang ditentukan.

Sintaks

NTSTATUS MmAdvanceMdl(
  [in, out] PMDL  Mdl,
  [in]      ULONG NumberOfBytes
);

Parameter

[in, out] Mdl

Menentukan MDL yang akan dimajukan.

[in] NumberOfBytes

Menentukan jumlah byte untuk memajukan awal MDL.

Nilai kembali

MmAdvanceMdl mengembalikan kode NTSTATUS. Nilai yang mungkin dikembalikan meliputi:

Menampilkan kode Deskripsi
STATUS_SUCCESS
Rutinitas berhasil memajukan awal MDL.
STATUS_INVALID_PARAMETER_2
Pemanggil mencoba untuk memajukan awal MDL melewati akhir.

Keterangan

MmAdvanceMdl hanya memajukan awal rentang alamat memori virtual. Alamat akhir tetap sama, dan panjang rentang menyusut sesuai.

Driver tingkat yang lebih tinggi dapat menggunakan MmAdvanceMdl dalam kondisi memori rendah ketika driver tingkat bawah hanya dapat menyelesaikan sebagian permintaan baca/tulis. Driver tingkat yang lebih tinggi dapat menggunakan MmAdvanceMdl untuk maju melewati bagian buffer yang telah dibaca atau ditulis, lalu mengeluarkan kembali IRP untuk menyelesaikan permintaan. (Pengemudi tentu saja dapat mengulangi proses ini sebanyak yang diperlukan.)

Jika MmAdvanceMdl maju melewati halaman awal, halaman apa pun yang dilewatkan MmAdvanceMdl segera dibuka kuncinya, dan alamat virtual sistem yang memetakan MDL dan alamat pengguna juga disesuaikan.

Penggunaan MmAdvanceMdl dapat memperlambat performa sistem. Ini harus digunakan hanya ketika semua kondisi berikut menahan:

  • Driver tingkat yang lebih tinggi, dalam penanganan I/O-nya sendiri, hanya dapat menyelesaikan permintaan I/O tertentu setelah mentransfer sejumlah data tetap, tetapi driver tingkat bawah hanya mentransfer data dalam jumlah yang lebih kecil. (Contohnya adalah driver transportasi jaringan untuk protokol SPX atau NBT. Setiap protokol mendukung pengiriman pesan yang andal untuk pesan yang lebih besar dari satu bingkai Ethernet. Pengemudi transportasi hanya dapat menyelesaikan permintaan baca untuk pesan seperti itu setelah menyusun ulang pesan dari beberapa bingkai Ethernet.)
  • Driver tingkat yang lebih tinggi sudah mencoba dan gagal mengalokasikan MDL baru untuk mentransfer fragmen data dari permintaan I/O yang tidak lengkap. (Jika driver berhasil mengalokasikan MDL baru, driver harus menggunakan MDL dan IoBuildPartialMdl tersebut untuk melakukan permintaan I/O alih-alih MmAdvanceMdl.)
  • Driver tingkat yang lebih tinggi harus terus membuat kemajuan, bahkan dalam kondisi memori rendah.
Driver yang tidak memenuhi kondisi ini harus menggunakan rutinitas IoBuildPartialMdl untuk menyelesaikan operasi I/O yang berhasil sebagian.

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Tersedia di Windows XP dan versi Windows yang lebih baru.
Target Platform Universal
Header wdm.h (termasuk Wdm.h, Ntddk.h, Ntifs.h)
Pustaka NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <=DISPATCH_LEVEL

Lihat juga

IoBuildPartialMdl