建立 I/O 佇列
架構佇列物件代表 I/O 佇列,這是驅動程式接收之 I/O 要求的容器。 每個驅動程式都可以為每個裝置建立一或多個 I/O 佇列。 架構佇列物件會定義一組 事件回呼函式 ,驅動程式可以提供的事件回呼函式,以及驅動程式可以呼叫的一組物件方法。
當架構收到導向至其中一個驅動程式裝置的 I/O 要求時,架構會將要求放在適當的 I/O 佇列中。 如果您的驅動程式註冊一或多個 要求處理常式,架構可以在每次有 I/O 要求可用時通知您的驅動程式。 或者,您的驅動程式可以輪詢 I/O 佇列以取得要求。
大部分驅動程式都會在其 EvtDriverDeviceAdd 回呼函式中建立 I/O 佇列。 若要建立裝置的 I/O 佇列,驅動程式會呼叫架構佇列物件的 WdfIoQueueCreate 方法, (建立架構佇列物件) 。 驅動程式會將 WDF_IO_QUEUE_CONFIG 結構提供給 方法。 這個結構包含佇列的組態資訊,例如佇列 的分派方法 ,以及架構在佇列中可用要求時所呼叫 之要求處理常式 的指標。 結構也會指出佇列是否會 受到電源管理 ,以及驅動程式是否支援佇列 I/O 要求的長度為零的緩衝區。
如果驅動程式將WDF_IO_QUEUE_CONFIG結構的DefaultQueue成員設定為TRUE,佇列就會變成裝置的預設 I/O 佇列。 如果您的驅動程式建立預設的 I/O 佇列,架構會將所有裝置的 I/O 要求放在此佇列中,除非您建立其他佇列來接收某些要求。 驅動程式可以呼叫 WdfDeviceGetDefaultQueue 方法,以取得裝置預設 I/O 佇列的控制碼。
如果您想要為裝置使用多個 I/O 佇列,驅動程式可以呼叫 WdfIoQueueCreate 來視需要建立多個佇列物件。 如果驅動程式建立多個佇列,它可以呼叫 WdfDeviceConfigureRequestDispatching,這會指示架構將不同類型的要求導向至不同的佇列。 例如,您可以指定所有讀取要求都會傳遞至一個佇列,而所有寫入要求都會傳遞至另一個佇列。
如果您的驅動程式會建立一組 I/O 佇列,並呼叫 WdfDeviceConfigureRequestDispatching 來指示驅動程式可以接收至特定佇列的每個要求類型,驅動程式不需要預設佇列。
如果驅動程式未針對特定類型的要求提供 I/O 佇列,而且如果驅動程式是函式驅動程式,架構就會完成該類型的要求,且完成狀態值為 STATUS_INVALID_DEVICE_REQUEST。 如果您的驅動程式是篩選驅動程式,且已呼叫 WdfFdoInitSetFilter,架構會自動將這些要求轉送到驅動程式堆疊中的下一個較低驅動程式。 例如,未處理讀取要求的篩選驅動程式不需要提供接收讀取要求的 I/O 佇列。
如需驅動程式如何使用 I/O 佇列的範例,請參閱 I/O 佇列的使用範例。