共用方式為


使用第 2 層篩選

Windows 8和更新版本的 Windows 支援第 2 層篩選。

此一個「系統」功能允許篩選第 2 層 MAC 標頭的欄位。 這些層會針對主機電腦所傳送或接收的所有封包,以每個封包為基礎叫用。 在輸入路徑上和輸出路徑上的封包片段之後,會先叫用這些層。 您可以從 NDIS 輕量型篩選器 (LWF) 驅動程式存取這些層。

注意

如果圖說文字尚未在該圖層有對應的篩選,則不應該將封包插入圖層。 插入NET_BUFFER_LIST結構應該與新增和移除篩選協調,因此只有在對應的圖層中有篩選準則時,才會執行插入。 此外,提供者不應該移除屬於其他提供者的篩選。 

本節包含下列主題:

插入 MAC 框架

回呼驅動程式會呼叫 FwpsInjectMacReceiveAsync0 函式,將先前已吸收的 MAC 框架重新 (或框架複製) 回第 2 層輸入資料路徑,或將發明的 MAC 框架插入輸入資料路徑中。

回呼驅動程式會呼叫 FwpsInjectMacSendAsync0 函式,將先前已吸收的 MAC 框架重新 (或框架複製) 回第 2 層輸出資料路徑,或將發明的 MAC 框架插入輸出資料路徑中。

netBufferLists參數可以是NET_BUFFER_LIST鏈結。 不過,每次都可以叫用完成函式多次,完成鏈結的區段 (或單一NET_BUFFER_LIST) 。

如果封包符合原始分類的相同篩選準則,插入的畫面格可能會再次分類。 因此,如同 IP 層的圖說文字,第 2 層圖說文字也必須呼叫 FwpsQueryPacketInjectionState0來防止無限封包檢查。

此外,您必須在插入的圖層有圖說文字。 否則,您的插入 NET_BUFFER_LIST 將不會完成您的完成函式,而且NET_BUFFER_LIST會進一步向上堆疊。 在此情況下,行為未定義,因為 NDIS 會嘗試將插入NET_BUFFER_LIST傳遞至堆疊中的下一個元件。

NET_BUFFER_LISTStatus成員包含堆疊插入的狀態結果。 堆疊插入的狀態結果是 STACK 插入函式傳回STATUS_SUCCESS之後,堆疊放入NET_BUFFER_LIST的狀態。 您應該使用 NT_SUCCESS 宏來檢查 狀態 成員中的堆疊插入狀態。 如果 Status是STATUS_SUCCESS,則插入成功,沒有進一步的資訊。 大於STATUS_SUCCESS的狀態成員值表示插入成功,但可能會有應該考慮之插入的詳細資訊。 小於STATUS_SUCCESS的狀態成員值表示插入失敗,因為Status成員中指定的原因。

分類鏈結的網路緩衝區清單

根據預設,圖說文字驅動程式只能個別分類網路緩衝區清單。 不過,如果圖說文字驅動程式執行下列兩項動作,則圖說文字驅動程式可以分類 NET_BUFFER_LIST 鏈結,以提升效能:

警告

不過,如果圖說驅動程式確實設定 FWP_CALLOUT_FLAG_ALLOW_L2_BATCH_CLASSIFY 旗標,就無法使用下列函式來修改NET_BUFFER_LISTs。

設定此旗標後, FwpsAllocateCloneNetBufferList0 一律會傳回 INVALID_PARAMETER 錯誤。 這可能會導致協力廠商圖說文字驅動程式無法管理NET_BUFFER_LISTs的參考計數,導致傳送和接收作業停止。

一層 2 層和欄位

虛擬交換器篩選的執行時間篩選層識別碼包括:

FWPS_LAYER_INBOUND_MAC_FRAME_ETHERNET

FWPS_LAYER_OUTBOUND_MAC_FRAME_ETHERNET

FWPS_LAYER_INBOUND_MAC_FRAME_NATIVE

FWPS_LAYER_OUTBOUND_MAC_FRAME_NATIVE

虛擬交換器篩選的資料欄位識別碼包括:

FWPS_FIELDS_INBOUND_MAC_FRAME_ETHERNET

FWPS_FIELDS_OUTBOUND_MAC_FRAME_ETHERNET

FWPS_FIELDS_INBOUND_MAC_FRAME_NATIVE

FWPS_FIELDS_OUTBOUND_MAC_FRAME_NATIVE