Bagikan melalui


Fungsi ExAcquireSharedWaitForExclusive (wdm.h)

Rutinitas ExAcquireSharedWaitForExclusive memperoleh sumber daya yang diberikan untuk akses bersama jika akses bersama dapat diberikan dan tidak ada pelayan eksklusif.

Sintaks

BOOLEAN ExAcquireSharedWaitForExclusive(
  [in, out] PERESOURCE Resource,
  [in]      BOOLEAN    Wait
);

Parameter

[in, out] Resource

Pointer ke sumber daya yang akan diperoleh untuk akses bersama.

[in] Wait

Menentukan perilaku rutin setiap kali sumber daya tidak dapat segera diperoleh. Jika TRUE, penelepon dimasukkan ke dalam status tunggu hingga sumber daya dapat diperoleh. Jika FALSE, rutinitas segera kembali, terlepas dari apakah sumber daya dapat diperoleh.

Nilai kembali

ExAcquireSharedWaitForExclusive mengembalikan TRUE jika akses yang diminta diberikan atau pemilik eksklusif merilis sumber daya. Rutinitas ini mengembalikan FALSE jika input TungguADALAH FALSE dan akses bersama tidak dapat segera diberikan.

Keterangan

Sebagian besar driver harus menggunakan ExAcquireResourceSharedLite alih-alih ExAcquireSharedWaitForExclusive.

Pemanggil dapat merilis sumber daya dengan memanggil ExReleaseResourceLite atau ExReleaseResourceForThreadLite.

Jika akses bersama tidak dapat segera diberikan, pemanggil dapat menunggu utas lain untuk memperoleh dan merilis kepemilikan eksklusif sumber daya.

Apakah atau kapan penelepon diberikan akses bersama ke sumber daya yang diberikan bergantung pada hal berikut:

  • Jika sumber daya saat ini tidak memiliki izin, akses bersama diberikan segera ke utas saat ini.
  • Jika penelepon sudah memiliki akses eksklusif ke sumber daya, utas saat ini diberikan jenis akses yang sama secara rekursif.
  • Jika sumber daya saat ini dimiliki sebagai bersama dan tidak ada upaya tertunda untuk memperoleh akses eksklusif, akses bersama diberikan kepada pemanggil segera.
  • Jika sumber daya saat ini dimiliki sebagai dibagikan tetapi ada upaya tertunda untuk memperoleh akses eksklusif, pemanggil dimasukkan ke dalam status tunggu (Tunggu diatur ke TRUE) atau ExAcquireSharedWaitForExclusive mengembalikan FALSE.

    Ketika utas saat ini menunggu untuk memperoleh sumber daya sampai setelah kepemilikan eksklusif yang tertunda dirilis, ExAcquireSharedWaitForExclusive mengembalikan TRUE ketika utas saat ini diberikan akses bersama ke sumber daya dan melanjutkan eksekusi.

Perilaku ExAcquireSharedWaitForExclusive identik dengan ExAcquireResourceSharedLite kecuali utas panggilan sudah memiliki sumber daya sebagai bersama dan ada pelayan eksklusif. Dalam hal ini, ExAcquireSharedWaitForExclusive memungkinkan pelayan eksklusif untuk memperoleh kepemilikan eksklusif sumber daya.

Jika penelepon menentukan TRUE untuk parameter Tunggu , pemanggil memblokir hingga utas lain membebaskan sumber daya atas nama pemanggil, menggunakan ExReleaseResourceForThread. Penulis driver harus berhati-hati untuk memastikan bahwa utas lain benar-benar merilis sumber daya; jika tidak, penelepon akan mengalami kebuntuan. ExAcquireResourceSharedLite tidak memiliki properti ini, jadi driver harus menggunakan rutinitas tersebut kecuali mereka memerlukan perilaku tertentu dari ExAcquireSharedWaitForExclusive.

Pengiriman APC kernel normal harus dinonaktifkan sebelum memanggil rutinitas ini. Nonaktifkan pengiriman APC kernel normal dengan memanggil KeEnterCriticalRegion. Pengiriman harus tetap dinonaktifkan sampai sumber daya dirilis, di mana sumber daya dapat diaktifkan kembali dengan memanggil KeLeaveCriticalRegion. Untuk informasi selengkapnya, lihat Menonaktifkan APC.

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 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL
Aturan kepatuhan DDI HwStorPortProhibitedDDIs(storport), IrqlExApcLte3(wdm), SpNoWait(storport), WithinCriticalRegion(storport), WithinCriticalRegion(storport), WithinCriticalRegion(wdm)

Lihat juga

ExAcquireResourceSharedLite

ExAcquireSharedStarveExclusive

ExConvertExclusiveToSharedLite

ExGetExclusiveWaiterCount

ExIsResourceAcquiredExclusiveLite

ExIsResourceAcquiredSharedLite

ExReleaseResourceForThread