Fungsi WdfUsbTargetPipeFormatRequestForUrb (wdfusb.h)
[Berlaku untuk KMDF saja]
Metode WdfUsbTargetPipeFormatRequestForUrb membangun permintaan USB untuk pipa USB tertentu, menggunakan parameter permintaan yang dijelaskan URB tertentu, tetapi tidak mengirim permintaan.
Sintaks
NTSTATUS WdfUsbTargetPipeFormatRequestForUrb(
WDFUSBPIPE PIPE,
[in] WDFREQUEST Request,
[in] WDFMEMORY UrbMemory,
[in, optional] PWDFMEMORY_OFFSET UrbMemoryOffset
);
Parameter
PIPE
Handel ke objek pipa kerangka kerja yang diperoleh dengan memanggil WdfUsbInterfaceGetConfiguredPipe.
[in] Request
Handel ke objek permintaan kerangka kerja. Untuk informasi selengkapnya, lihat bagian Keterangan berikut ini.
[in] UrbMemory
Handel ke objek memori kerangka kerja yang berisi struktur URB .
Jika driver sebelumnya disebut WdfUsbTargetDeviceCreateWithParameters untuk membuat UsbDevice, driver harus menggunakan WdfUsbTargetDeviceCreateUrb atau WdfUsbTargetDeviceCreateIsochUrb untuk membuat URB yang terkandung dalam objek memori ini.
[in, optional] UrbMemoryOffset
Penunjuk ke struktur WDFMEMORY_OFFSET yang dialokasikan penelepon yang memasok offset byte opsional dan nilai panjang. Kerangka kerja menggunakan nilai-nilai ini untuk menentukan alamat awal URB dalam memori yang ditentukan UrbMemory . Jika pointer ini NULL, URB terletak di awal memori UrbMemory .
Nilai kembali
WdfUsbTargetPipeFormatRequestForUrb mengembalikan nilai status penyelesaian target I/O jika operasi berhasil. Jika tidak, metode ini dapat mengembalikan salah satu nilai berikut:
Menampilkan kode | Deskripsi |
---|---|
|
Parameter yang tidak valid terdeteksi. |
|
Memori tidak cukup tersedia. |
|
Offset yang ditentukan parameter UsbMemoryOffset tidak valid. |
|
Paket permintaan I/O (IRP) yang diwakili parameter Permintaan tidak menyediakan struktur IO_STACK_LOCATION yang cukup untuk memungkinkan driver meneruskan permintaan. |
Metode ini juga mungkin mengembalikan nilai NTSTATUS lainnya.
Pemeriksaan bug terjadi jika driver menyediakan handel objek yang tidak valid.
Keterangan
Gunakan WdfUsbTargetPipeFormatRequestForUrb, diikuti oleh WdfRequestSend, untuk mengirim permintaan USB baik secara sinkron atau asinkron. Atau, gunakan metode WdfUsbTargetPipeSendUrbSynchronously untuk mengirim permintaan secara sinkron.
Kerangka kerja tidak memeriksa permintaan USB. Jika permintaan mengubah status pipa USB, kerangka kerja tidak akan menyadari perubahan.
Anda dapat meneruskan permintaan I/O yang diterima driver Anda dalam antrean I/O, atau Anda dapat membuat dan mengirim permintaan baru.
Untuk meneruskan permintaan I/O yang diterima driver Anda dalam antrean I/O, tentukan handel permintaan yang diterima untuk parameter Permintaan metode WdfUsbTargetPipeFormatRequestForUrb.
Untuk membuat permintaan I/O baru, panggil WdfRequestCreate untuk melakukan pra-alokasi objek permintaan. Berikan handel permintaan untuk parameter Permintaan metode WdfUsbTargetPipeFormatRequestForUrb. Anda dapat menggunakan kembali objek permintaan dengan memanggil WdfRequestReuse, sehingga fungsi panggilan balik EvtDriverDeviceAdd driver Anda dapat melakukan pra-alokasi objek permintaan untuk perangkat.
Setelah memanggil WdfUsbTargetPipeFormatRequestForUrb untuk memformat permintaan I/O, driver harus memanggil WdfRequestSend untuk mengirim permintaan (baik secara sinkron atau asinkron) ke target I/O.
Beberapa panggilan ke WdfUsbTargetPipeFormatRequestForUrb yang menggunakan permintaan yang sama tidak menyebabkan alokasi sumber daya tambahan. Oleh karena itu, untuk mengurangi kemungkinan WdfRequestCreate akan mengembalikan STATUS_INSUFFICIENT_RESOURCES, fungsi panggilan balik EvtDriverDeviceAdd driver Anda dapat memanggil WdfRequestCreate untuk melakukan pra-alokasi satu atau beberapa objek permintaan untuk perangkat. Driver kemudian dapat menggunakan kembali (panggil WdfRequestReuse), format ulang (panggil WdfUsbTargetPipeFormatRequestForUrb), dan mengirim ulang (panggil WdfRequestSend) setiap objek permintaan tanpa mempertaruhkan nilai pengembalian STATUS_INSUFFICIENT_RESOURCES dari panggilan selanjutnya ke WdfRequestCreate. Semua panggilan berikutnya ke WdfUsbTargetPipeFormatRequestForUrb untuk objek permintaan yang digunakan kembali akan mengembalikan STATUS_SUCCESS, jika nilai parameter tidak berubah. (Jika driver tidak memanggil metode pemformatan permintaan yang sama setiap kali, sumber daya tambahan mungkin dialokasikan.)
Untuk informasi tentang mendapatkan informasi status setelah permintaan I/O selesai, lihat Mendapatkan Informasi Penyelesaian.
Untuk informasi selengkapnya tentang metode WdfUsbTargetPipeFormatRequestForUrb dan target I/O USB, lihat Target I/O USB.
Contoh
Contoh kode berikut membuat objek memori yang mewakili URB. Kemudian, contoh menginisialisasi URB, memformat permintaan USB yang berisi URB, mendaftarkan fungsi panggilan balik CompletionRoutine , dan mengirim permintaan.
URB urb;
PURB pUrb = NULL;
WDFMEMORY urbMemory
NTSTATUS status;
status = WdfMemoryCreate(
WDF_NO_OBJECT_ATTRIBUTES,
NonPagedPool,
0,
sizeof(struct _URB_GET_CURRENT_FRAME_NUMBER),
&urbMemory,
NULL
);
if (!NT_SUCCESS(status)){
return status;
}
pUrb = WdfMemoryGetBuffer(
urbMemory,
NULL
);
pUrb->UrbHeader.Length = (USHORT) sizeof(struct _URB_GET_CURRENT_FRAME_NUMBER);
pUrb->UrbHeader.Function = URB_FUNCTION_GET_CURRENT_FRAME_NUMBER;
pUrb->UrbGetCurrentFrameNumber.FrameNumber = 0;
status = WdfUsbTargetPipeFormatRequestForUrb(
pipe,
Request,
urbMemory,
NULL
);
if (!NT_SUCCESS(status)) {
goto Exit;
}
WdfRequestSetCompletionRoutine(
Request,
UrbCompletionRoutine,
pipe
);
if (WdfRequestSend(
Request,
WdfUsbTargetPipeGetIoTarget(pipe),
WDF_NO_SEND_OPTIONS
) == FALSE) {
status = WdfRequestGetStatus(Request);
goto Exit;
}
Exit:
if (!NT_SUCCESS(status)) {
WdfRequestCompleteWithInformation(
Request,
status,
0
);
}
return;
Persyaratan
Persyaratan | Nilai |
---|---|
Target Platform | Universal |
Versi KMDF minimum | 1,0 |
Header | wdfusb.h (termasuk Wdfusb.h) |
Pustaka | Wdf01000.sys (lihat Penerapan Versi Pustaka Kerangka Kerja.) |
IRQL | <=DISPATCH_LEVEL |
Aturan kepatuhan DDI | DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestFormattedValid(kmdf), RequestSendAndForgetNoFormatting(kmdf), RequestSendAndForgetNoFormatting2(kmdf), UsbKmdfIrql(kmdf), UsbKmdfIrql2(kmdf), UsbKmdfIrqlExplicit(kmdf) |
Lihat juga
WdfRequestCompleteWithInformation