Bagikan melalui


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.
Mencoba memperoleh kunci putaran secara rekursif dijamin menyebabkan kebuntuan. Untuk informasi selengkapnya tentang kunci spin, lihat Spin Locks.

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)

Lihat juga

KeAcquireInStackQueuedSpinLock

KeAcquireSpinLockAtDpcLevel

KeInitializeSpinLock

KeReleaseSpinLock