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
STATUS_INVALID_PARAMETER
Parameter input tidak valid atau permintaan sudah tidak dapat dibatalkan.
STATUS_INVALID_DEVICE_REQUEST
Driver tidak memiliki permintaan.
STATUS_CANCELLED
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

EvtRequestCancel

WdfRequestComplete

WdfRequestMarkCancelable

WdfRequestMarkCancelableEx