Audio 屬性處理常式
迷你埠驅動程式會在 PCPROPERTY_ITEM 結構中儲存其支援之每個屬性的相關資訊。 此結構包含屬性的下列資訊:
屬性集 GUID 和屬性識別碼 (或索引)
屬性之處理常式常式的函式指標
指定處理常式所支援之屬性作業的旗標
迷你埠驅動程式會提供自動化資料表 (由篩選 PCAUTOMATION_TABLE結構) 所指定。 驅動程式會為篩選的針腳類型和節點類型提供額外的自動化資料表-每個針腳或節點類型都有自己的資料表。 每個自動化資料表都包含一個 () PCPROPERTY_ITEM結構的空陣列,而這些結構都會描述篩選、釘選或節點的一個屬性。 當用戶端將屬性要求傳送至篩選、釘選或節點時,埠驅動程式會透過自動化資料表將要求路由傳送至適當的屬性處理常式。
迷你埠驅動程式可以為每個屬性指定唯一的屬性處理常式常式。 不過,如果驅動程式處理數個類似的屬性,這些屬性有時會合並成單一處理程式常式,以方便起見。 是否要為每個屬性提供唯一的處理常式,或將數個屬性合併成單一處理程式,是驅動程式寫入器要做出的實作決策,而且對提交屬性要求的用戶端而言,應該是透明的。
使用者模式用戶端可以藉由呼叫 Microsoft Win32 函式DeviceIoControl,並將 dwIoControlCode呼叫參數設定為 IOCTL_KS_PROPERTY,來傳送 get、set 或 basic-support 屬性要求。 作業系統會將此呼叫轉換為 IRP,它會分派給類別驅動程式。 如需詳細資訊,請參閱 KS 屬性。
當用戶端傳送 KS 屬性要求 (,也就是IOCTL_KS_PROPERTY I/O 控制 IRP) 至篩選控制碼或針腳控制碼時,KS 系統驅動程式 (Ks.sys) 會將要求傳遞給篩選物件或針腳物件的埠驅動程式。 如果迷你埠驅動程式提供 屬性的處理常式,埠驅動程式會將要求轉送至處理常式。 在轉送要求之前,埠驅動程式會將屬性要求中的資訊轉換成 PCPROPERTY_REQUEST 結構所指定的格式。 埠驅動程式會將此結構傳遞至迷你埠驅動程式的處理常式。
PCPROPERTY_REQUEST MajorTarget 成員會指向音訊裝置的主要迷你埠驅動程式介面。 例如,對於 WavePci 裝置,這是迷你埠驅動程式物件的 IMiniportWavePci 介面指標。
在傳送至篩選控制碼的 KS 屬性要求案例中,PCPROPERTY_REQUEST的 MinorTarget 成員為 Null。 如果是傳送至釘選控制碼的要求, MinorTarget 會指向針腳的資料流程介面。 例如,對於 WavePci 裝置,這是資料流程物件的 IMiniportWavePciStream 介面指標。
PCPROPERTY_REQUEST的 Instance 和 Value 成員分別指向 KS 屬性要求的輸入和輸出緩衝區。 (這些緩衝區是由DeviceIoControl函式的lpInBuffer和lpOutBuffer參數所指定。) 這些緩衝區包含屬性描述元 (實例資料) 和屬性值 (作業資料) ,如音訊驅動程式屬性集中所述。 Value成員會指向輸出緩衝區的開頭,但實例指標會從輸入緩衝區的開頭位移。
輸入緩衝區的開頭為 KSPROPERTY 或 KSNODEPROPERTY 結構。 埠驅動程式會將此資訊從這個結構複製到PCPROPERTY_REQUEST結構的 Node、 PropertyItem和 Verb 成員。 如果緩衝區中有任何資料遵循 KSPROPERTY 或 KSNODEPROPERTY 結構,埠驅動程式就會載入 實例 成員,並具有此資料的指標。 否則,它會將 Instance 設定為 Null。
如果輸入緩衝區以不含節點資訊的 KSPROPERTY 結構開頭,埠驅動程式會將PCPROPERTY_REQUEST結構的 Node 成員設定為 ULONG (-1) 。 在此情況下,埠驅動程式會根據篩選控制碼或釘選控制碼指定屬性要求的目標,從迷你埠驅動程式的自動化資料表呼叫適當的處理常式。 (如果資料表未指定 屬性的處理常式,埠驅動程式會改為處理要求。)
如果輸入緩衝區以 KSNODEPROPERTY 結構開頭,埠驅動程式會將此結構的節點識別碼複製到PCPROPERTY_REQUEST結構的 Node 成員,並從迷你埠驅動程式的自動化資料表中呼叫節點的適當處理常式。 再次 (,如果資料表未指定 屬性的處理常式,埠驅動程式會改為處理要求。)
埠驅動程式會檢查屬性要求作業旗標中的KSPROPERTY_TYPE_TOPOLOGY位,以判斷兩個結構的哪一個結構 KSPROPERTY 或 KSNODEPROPERTY 位於輸入緩衝區的開頭:
如果設定此位,則要求適用于節點屬性,而輸入緩衝區會以 KSNODEPROPERTY 結構開頭。
否則,輸入緩衝區會以 KSPROPERTY 結構開頭。
如需KSPROPERTY_TYPE_TOPOLOGY的詳細資訊,請參閱 KSPROPERTY。
PCPROPERTY_REQUEST 結構的 InstanceSize 和 ValueSize 成員會指定 Instance 和 Value 成員所指向的緩衝區大小。 ValueSize 等於屬性要求的輸出緩衝區大小,但 InstanceSize 是輸入緩衝區中 KSPROPERTY 或 KSNODEPROPERTY 結構之後的資料大小。 也就是說, InstanceSize 是輸入緩衝區的大小減去 KSPROPERTY 或 KSNODEPROPERTY 結構的大小。 如果沒有其他資料遵循此結構,埠驅動程式會將 InstanceSize 設定為零 (,並將 Instance 設定為 Null) 。
例如,如果用戶端將 KSNODEPROPERTY_AUDIO_CHANNEL 結構指定為輸入緩衝區中的實例資料,則埠驅動程式會將 實例成員指向 KSNODEPROPERTY_AUDIO_CHANNEL結構的 Channel 成員,以及 InstanceSize 成員包含值的 PCPROPERTY_REQUEST 結構傳遞處理常式
sizeof (KSNODEPROPERTY_AUDIO_CHANNEL) - sizeof (KSNODEPROPERTY)
提交 get 屬性要求以擷取屬性值之前,用戶端應該配置輸出緩衝區,迷你埠驅動程式的屬性處理常式可以寫入屬性值。 對於某些屬性,輸出緩衝區的大小取決於裝置,而且用戶端必須查詢所需緩衝區大小的屬性處理常式。 在這些情況下,用戶端會提交初始屬性要求,其輸出緩衝區指標為 nullptr,輸出緩衝區長度為零。 處理常式會傳回所需的緩衝區大小以及狀態碼STATUS_BUFFER_OVERFLOW來回應。 然後,用戶端會藉由配置指定大小的輸出緩衝區,並在第二個 get-property 要求中傳送這個緩衝區,以擷取屬性值。
如果指定的緩衝區大小太小而無法接收任何要求的資訊,此方法會傳回STATUS_BUFFER_TOO_SMALL。
在某些情況下,PortCls 埠驅動程式會傳回STATUS_BUFFER_TOO_SMALL,而不是STATUS_BUFFER_OVERFLOW,以回應具有非零輸出緩衝區位址和大小的屬性要求。 在這種情況下,不會傳回必要的緩衝區大小。
如需詳細資訊,請參閱 使用 NTSTATUS 值 和這些部落格文章: