Makro KeAcquireSpinLock (wdm.h)
Rutinitas KeAcquireSpinLock memperoleh kunci putar sehingga pemanggil dapat menyinkronkan akses ke data bersama dengan cara multiprosesor aman dengan menaikkan IRQL.
Sintaks
void KeAcquireSpinLock(
SpinLock,
OldIrql
);
Parameter
SpinLock
Arahkan ke kunci putar KSPIN_LOCK yang diinisialisasi tempat pemanggil menyediakan penyimpanan.
OldIrql
Penunjuk ke variabel KIRQL yang diatur ke IRQL saat ini ketika panggilan ini terjadi.
Nilai kembali
Tidak ada
Keterangan
KeAcquireSpinLock pertama-tama mengatur ulang IRQL ke DISPATCH_LEVEL lalu memperoleh kunci. IRQL sebelumnya ditulis ke OldIrql setelah kunci diperoleh.
Nilai OldIrql harus ditentukan ketika kunci putar dilepaskan dengan KeReleaseSpinLock.
Sebagian besar driver menggunakan variabel lokal untuk menyimpan nilai IRQL lama. Driver juga dapat menggunakan lokasi memori bersama, seperti variabel global, tetapi driver tidak boleh menggunakan lokasi yang sama untuk dua kunci yang berbeda. Jika tidak, kondisi balapan dapat terjadi.
Kunci putar dapat menyebabkan masalah serius jika tidak digunakan secara yudisial. Secara khusus, tidak ada perlindungan kebuntuan yang dilakukan dan pengiriman dinonaktifkan saat kunci putar ditahan. Karena itu:
- Kode dalam wilayah penting yang dijaga oleh kunci putaran tidak boleh dapat di-pageable atau membuat referensi apa pun ke data yang dapat di-pageable.
- Kode dalam wilayah penting yang dijaga oleh kunci putaran tidak dapat memanggil fungsi eksternal apa pun yang mungkin mengakses data yang dapat di-pageable atau menaikkan pengecualian, juga tidak dapat menghasilkan pengecualian apa pun.
- Pemanggil harus melepaskan kunci putar dengan KeReleaseSpinLock secepat mungkin.
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung | Tersedia dimulai dengan Windows 2000. |
Target Platform | Universal |
Header | wdm.h (termasuk Wdm.h, Ntddk.h, Ntifs.h) |
Pustaka | Hal.lib |
IRQL | <= DISPATCH_LEVEL |
Aturan kepatuhan DDI | HwStorPortProhibitedDDIs(storport), IrqlKeDispatchLte(wdm), MarkingQueuedIrps(wdm), ReqSendWhileSpinlock(kmdf), Spinlock(kmdf), Spinlock(kmdf), SpinLock(storport), SpinLock(storport), SpinLock(wdm), SpinlockDpc(kmdf), SpinlockDpc(kmdf), SpinLockDpc(storport), SpinLockDpc(storport), SpinLockDpc(wdm), SpinlockRelease(kmdf), SpinlockRelease(kmdf), SpinLockRelease(storport), SpinLockRelease(storport), SpinlockRelease(wdm), SpinLockSafe(storport), SpinLockSafe(storport), SpinLockSafe(wdm) |