Fungsi NdisAcquireRWLockRead (ndis.h)

Fungsi NdisAcquireRWLockRead mendapatkan kunci baca yang digunakan pemanggil untuk akses baca ke sumber daya yang dibagikan di antara utas driver.

Sintaks

void NdisAcquireRWLockRead(
  [in]  PNDIS_RW_LOCK_EX Lock,
  [out] PLOCK_STATE_EX   LockState,
  [in]  UCHAR            Flags
);

Parameter

[in] Lock

Penunjuk ke variabel NDIS_RW_LOCK_EX buram yang mewakili kunci. Pemanggil dapat menggunakan kunci ini untuk mendapatkan akses tulis atau baca ke sumber daya yang dibagikan antara utas driver non-ISR.

[out] LockState

Penunjuk ke variabel LOCK_STATE_EX buram yang melacak status kunci. Variabel ini ada dalam interval antara waktu yang diperoleh pemanggil dan melepaskan kunci. Pemanggil harus menggunakan variabel jenis LOCK_STATE_EX yang berbeda untuk setiap upaya yang dilakukannya untuk mendapatkan kunci dari utas driver non-ISR yang sama.

[in] Flags

Nilai ULONG yang berisi bendera kunci. Atur parameter ini ke NDIS_RWL_AT_DISPATCH_LEVEL jika IRQL penelepon saat ini DISPATCH_LEVEL. Jika tidak, atur parameter ini ke nol. Untuk informasi selengkapnya tentang pengiriman pelacakan IRQL, lihat Pengiriman Pelacakan IRQL.

Catatan Jika pemanggil tahu IRQL saat ini DISPATCH_LEVEL, atur parameter ini ke NDIS_RWL_AT_DISPATCH_LEVEL. Bendera ini membuat kunci lebih efisien dengan menyebabkannya menghilangkan pemeriksaan untuk IRQL saat ini. Jika IRQL saat ini tidak diketahui, jangan uji IRQL saat ini dengan KeGetCurrentIrql hanya untuk menentukan apakah akan mengatur bendera ini, karena lebih efisien untuk memungkinkan fungsi NdisAcquireRWLockRead menguji IRQL itu sendiri.
 

Nilai kembali

Tidak ada

Keterangan

Driver NDIS memanggil fungsi NdisAcquireRWLockRead untuk mendapatkan akses baca-saja ke sumber daya yang dibagikan di antara utas driver.

Driver harus mengalokasikan variabel jenis NDIS_RW_LOCK_EX dengan fungsi NdisAllocateRWLock sebelum driver memanggil fungsi NdisAcquireRWLockRead .

Setelah driver memanggil NdisAllocateRWLock, driver dapat memanggil NdisAcquireRWLockWrite atau NdisAcquireRWLockRead untuk mendapatkan akses tulis atau baca ke sumber daya. Hanya satu utas driver non-ISR pada satu waktu yang dapat memperoleh akses tulis ke sumber daya. Ketika satu utas non-ISR memiliki akses tulis, semua akses baca dan tulis oleh utas non-ISR lainnya harus menunggu hingga pemegang akses tulis melepaskan kunci. Namun, jika utas non-ISR memiliki akses baca, utas non-ISR lainnya dapat secara bersamaan mendapatkan akses baca.

Kunci NDIS_RW_LOCK_EX tidak mendukung promosi dari baca ke tulis. Setelah prosesor memperoleh NDIS_RW_LOCK_EX untuk akses baca (dengan memanggil NdisAcquireRWLockRead), prosesor yang sama tidak boleh mencoba memperoleh akses tulis (dengan memanggil NdisAcquireRWLockWrite) hingga akses baca sebelumnya dirilis.

Kunci baca NDIS_RW_LOCK_EX dapat diperoleh secara rekursif pada prosesor yang sama. Untuk setiap panggilan ke NdisAcquireRWLockRead, harus ada panggilan yang sesuai ke NdisReleaseRWLock. Kunci hanya dirilis setelah panggilan terakhir ke NdisReleaseRWLock.

Driver tidak dapat menggunakan kunci untuk melindungi sumber daya dari akses baca atau tulis yang dibagikan fungsi lain dengan MiniportInterrupt atau Fungsi MiniportDisableInterruptEx , atau keduanya. Sebaliknya, driver harus memanggil NdisMSynchronizeWithInterruptEx sehingga Fungsi MiniportSynchronizeInterrupt mengakses sumber daya bersama tersebut di DIRQL yang sama dengan MiniportInterrupt atau Fungsi MiniportDisableInterruptEx , atau keduanya.

NdisAcquireRWLockRead selalu menaikkan IRQL ke IRQL = DISPATCH_LEVEL.

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Didukung di NDIS 6.20 dan yang lebih baru.
Target Platform Universal
Header ndis.h (termasuk Ndis.h)
Pustaka Ndis.lib
IRQL <= DISPATCH_LEVEL

Lihat juga

LOCK_STATE_EX

MiniportDisableInterruptEx

MiniportInterrupt

MiniportSynchronizeInterrupt

NDIS_RW_LOCK_EX

NdisAcquireRWLockWrite

NdisAllocateRWLock

NdisMSynchronizeWithInterruptEx

NdisReleaseRWLock