Fungsi WdfRequestUnmarkCancelable (wdfrequest.h)
[Berlaku untuk KMDF dan UMDF]
Metode WdfRequestUnmarkCancelable menonaktifkan pembatalan permintaan I/O tertentu.
Sintaks
NTSTATUS WdfRequestUnmarkCancelable(
[in] WDFREQUEST Request
);
Parameter
[in] Request
Handel ke objek permintaan kerangka kerja.
Nilai kembali
WdfRequestUnmarkCancelable mengembalikan STATUS_SUCCESS jika operasi berhasil. Jika tidak, metode ini mungkin mengembalikan salah satu nilai berikut:
Menampilkan kode | Deskripsi |
---|---|
|
Parameter input tidak valid atau permintaan sudah tidak dapat dibatalkan. |
|
Driver tidak memiliki permintaan. |
|
Permintaan telah dibatalkan. |
Metode ini mungkin juga mengembalikan nilai NTSTATUS lainnya.
Pemeriksaan bug terjadi jika driver menyediakan handel objek yang tidak valid.
Keterangan
Driver dapat memanggil WdfRequestUnmarkCancelable untuk menonaktifkan pembatalan permintaan I/O, jika driver sebelumnya disebut WdfRequestMarkCancelable atau WdfRequestMarkCancelableEx untuk mengaktifkan pembatalan permintaan.
Jika WdfRequestUnmarkCancelable mengembalikan nilai selain STATUS_CANCELLED, fungsi panggilan balik EvtRequestCancel driver tidak akan dipanggil untuk permintaan tersebut.
Jika driver yang sebelumnya disebut WdfRequestMarkCancelable atau WdfRequestMarkCancelableEx, fungsi panggilan balik EvtRequestCancel driver dapat memanggil WdfRequestComplete dengan parameter Status STATUS_CANCELLED. Fungsi panggilan balik EvtRequestCancel tidak harus memanggil WdfRequestUnmarkCancelable. Jika driver memanggil WdfRequestComplete di luar fungsi panggilan balik EvtRequestCancel , driver harus terlebih dahulu memanggil WdfRequestUnmarkCancelable.
Namun, driver tidak boleh memanggil WdfRequestUnmarkCancelable setelah EvtRequestCancel memanggil WdfRequestComplete. Di bagian Contoh berikut, contoh menyimpan salinan lokal handel permintaan lalu menghapusnya saat fungsi panggilan balik EvtRequestCancel memanggil WdfRequestComplete. Driver tidak memanggil WdfRequestUnmarkCancelable jika salinan lokal handel permintaan telah dibersihkan. Contoh ini menggunakan sinkronisasi otomatis kerangka kerja untuk menyinkronkan fungsi panggilan balik.
Perhatikan bahwa memanggil WdfObjectReference untuk menambahkan referensi tambahan ke objek permintaan tidak memungkinkan driver Anda untuk memanggil WdfRequestUnmarkCancelable setelah fungsi panggilan balik EvtRequestCancel driver memanggil WdfRequestComplete.
Jika WdfRequestUnmarkCancelable mengembalikan STATUS_CANCELLED, lalu EvtRequestCancel menyelesaikan permintaan, driver tidak boleh menggunakan objek permintaan.
Jika WdfRequestUnmarkCancelable mengembalikan STATUS_CANCELLED, driver tidak boleh menyelesaikan permintaan sebelum kerangka kerja memanggil EvtRequestCancel. Jika tidak, kerangka kerja mungkin memanggil EvtRequestCancel driver dengan permintaan yang tidak valid. Untuk contoh kode terkait, silakan lihat IWDFIoRequest::UnmarkCancelable.
Untuk informasi selengkapnya tentang WdfRequestUnmarkCancelable, lihat Membatalkan Permintaan I/O.
Contoh
Contoh kode berikut menyediakan versi yang disederhanakan dari fungsi panggilan balik EvtIoRead, EvtRequestCancel , dan EvtTimerFunc yang berisi driver sampel ECHO . Contoh ini menunjukkan cara memanggil WdfRequestMarkCancelable, WdfRequestUnmarkCancelable, dan WdfRequestComplete dalam driver yang menggunakan sinkronisasi otomatis kerangka kerja. (Sampel ECHO menggunakan sinkronisasi tingkat perangkat.)
Jika driver Anda tidak menggunakan sinkronisasi otomatis kerangka kerja, lihat dua contoh pada IWDFIoRequest::UnmarkCancelable. Saat ditulis untuk driver UMDF, contoh-contoh ini menunjukkan teknik yang dapat Anda gunakan untuk mengelola sinkronisasi antara panggilan balik pembatalan dan utas lain yang memanggil rutinitas Unmark .
VOID
EchoEvtIoRead(
IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN size_t Length
)
{
PQUEUE_CONTEXT queueContext = QueueGetContext(Queue);
// Prepare for read operation here.
// (See the Echo sample driver for details.)
...
// Enable cancellation.
WdfRequestMarkCancelable(
Request,
EchoEvtRequestCancel
);
// Save the request handle. We'll clear it after
// we call WdfRequestComplete.
queueContext->CurrentRequest = Request;
return
}
VOID
EchoEvtRequestCancel(
IN WDFREQUEST Request
)
{
PQUEUE_CONTEXT queueContext =
QueueGetContext(WdfRequestGetIoQueue(Request));
WdfRequestComplete(
Request,
STATUS_CANCELLED,
);
// Clear the request handle so EchEvtTimerFunc will
// know that we called WdfRequestComplete.
queueContext->CurrentRequest = NULL;
return;
}
VOID
EchoEvtTimerFunc(
IN WDFTIMER Timer
)
{
NTSTATUS Status;
WDFREQUEST Request;
WDFQUEUE queue;
PQUEUE_CONTEXT queueContext;
// Retrieve our saved copy of the request handle.
queue = WdfTimerGetParentObject(Timer);
queueContext = QueueGetContext(queue);
Request = queueContext->CurrentRequest;
// We cannot call WdfRequestUnmarkCancelable
// after a request completes, so check here to see
// if EchoEvtRequestCancel cleared our saved
// request handle.
if( Request != NULL ) {
Status = WdfRequestUnmarkCancelable(Request);
if(Status != STATUS_CANCELLED) {
queueContext->CurrentRequest = NULL;
Status = queueContext->CurrentStatus;
WdfRequestComplete(
Request,
Status
);
}
}
return;
}
Persyaratan
Persyaratan | Nilai |
---|---|
Target Platform | Universal |
Versi KMDF minimum | 1,0 |
Versi UMDF minimum | 2.0 |
Header | wdfrequest.h (termasuk Wdf.h) |
Pustaka | Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF) |
IRQL | <=DISPATCH_LEVEL |
Aturan kepatuhan DDI | CompleteCanceledReq(kmdf), DeferredRequestCompleted(kmdf), DriverCreate(kmdf), EvtIoStopCancel(kmdf), InvalidReqAccess(kmdf), InvalidReqAccessLocal(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), MarkCancOnCancReqLocal(kmdf), ReqIsCancOnCancReq(kmdf), ReqMarkCancelableSend(kmdf), ReqNotCanceledLocal(kmdf) |
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk