Windows 驱动示例:基于 SxBase.lib 构建 Hyper-V 可扩展交换机扩展筛选器驱动(MsPassthroughExt / MsForwardExt 实战解析)
发布时间:2026/9/28 7:40:46来源:尧图网络
示例工程【免费下载链接】Windows-driver-samplesThis repo contains driver samples prepared for use with Microsoft Visual Studio and the Windows Driver Kit (WDK). It contains both Universal Windows Driver and desktop-only driver samples.项目地址https://gitcode.com/gh_mirrors/wi/Windows-driver-samples点击查看免费下载导读本文围绕 Windows-driver-samples 仓库中 network/ndis/extension 目录下的示例系统讲解如何基于基础库SxBase.lib实现 Hyper-V 可扩展交换机Hyper-V Extensible Switch扩展筛选器驱动。文章以该目录 README.md 为主体脉络完整覆盖扩展驱动的工作原理ingress/egress 数据流、SxApi.h 中必须实现的所有接口、两个参考实现透传型 MsPassthroughExt 与转发型 MsForwardExt的源码细节以及使用 netcfg、mofcomp、PowerShell 进行安装、启用的完整实操流程。读完本文你将掌握在 Visual Studio WDK 环境下从零编写并部署一款 Hyper-V 交换机扩展驱动的完整技术路径。一、Hyper-V 可扩展交换机扩展驱动的工作原理1.1 扩展驱动基于 NDIS 筛选器模型Hyper-V 可扩展交换机扩展Extension本质上是运行在 NDIS 筛选器Filter模型之上的一类驱动程序但它处理的对象不是普通网络接口而是交换机端口与虚拟机网卡。示例的 INF 文件如 mspassthroughext.inf中可以看到其 NDINetwork Driver Interface注册信息HKR, Ndi,FilterClass,,ms_switch_filter ; 筛选型扩展 HKR, Ndi\Interfaces, FilterMediaTypes,,vmnetextension ; 绑定媒体类型而转发型扩展 MsForwardExt 在 msforwardext.inf 中注册为ms_switch_forwardFilterClass两者都通过vmnetextension媒体类型挂接到交换机驱动栈上FilterRunType 2optional表示该筛选器为可选组件。1.2 交换机、端口、NIC 与数据流向每个 Hyper-V 可扩展交换机都对应一个Extension Protocol 实例和一个Extension Miniport 实例。NDIS 通过 OID 将交换机 / 端口 / NIC 信息通知给驱动栈上的各扩展驱动。按照 README.md 的说明数据流向分为两个阶段Ingress 数据流入站从交换机任意端口External NIC 外部网卡、Synthetic NIC 合成网卡、Emulated NIC 模拟网卡、Internal NIC 内部网卡发出的所有数据包首先由 Extension Protocol 以 Send 形式发出并在数据包中填充源source信息。这一阶段可以执行基于源地址的过滤、数据包修改、数据包排队以及目的地的指定destination definition。Egress 数据流出站数据包到达 Extension Miniport 后先经过内建的过滤 / 转发逻辑如果通过过滤且需要投递到某个目的端口则由 Extension Miniport 以 IndicationReceive形式发出并在数据包中填充源和目的信息。这一阶段可以执行基于目的地的过滤。收尾顺序数据包到达 Extension Protocol 后会被投递给未被过滤逻辑标记为排除excluded的目的地。随后数据包按相反顺序完成——先执行接收完成receive completion再执行发送完成send completion。包注入扩展驱动可以在 ingress 数据路径上自由地通过自身 Filter 发出 Send 来生成新数据包这是实现流量整形、镜像、拦截等功能的基础能力。二、SxBase.lib 基础库与扩展驱动骨架2.1 基础库职责与“零修改”约定SxBase.lib 由 base/ 目录下的源码编译而来实现了所有类型扩展驱动共同需要的 NDIS 功能SxBase.c 与 SxBase.h承载完整的标准 NDIS 处理逻辑包括DriverEntry、FILTER_ATTACH、FILTER_DETACH、FILTER_PAUSE、FILTER_RESTART、FILTER_OID_REQUEST、FILTER_SEND_NET_BUFFER_LISTS、FILTER_RECEIVE_NET_BUFFER_LISTS、FILTER_STATUS、FILTER_NET_PNP_EVENT等标准筛选器回调SxLibrary.c 与 SxLibrary.h向扩展暴露可复用的库函数如SxLibSendNetBufferListsIngress、SxLibCompleteNetBufferListsIngress、SxLibIssueOidRequest等封装暂停/恢复pause/resume等基础操作。README 明确强调不需要对基础库做任何修改。要实现自己的扩展驱动只需两件事定义全部全局变量SxApi.h 中声明的extern变量实现 SxApi.h 中声明的全部函数。2.2 必须定义的全局变量SxApi.h 顶部声明了 6 个扩展驱动必须定义并导出的全局变量。以透传示例 MsPassthroughExt.c 中的实际赋值为例UCHAR SxExtMajorNdisVersion NDIS_FILTER_MAJOR_VERSION; // NDIS 主版本NDIS 6.30 即该宏 UCHAR SxExtMinorNdisVersion NDIS_FILTER_MINOR_VERSION; // NDIS 次版本 PWCHAR SxExtFriendlyName LMicrosoft Sample Passthrough Extension; // 友好名称 PWCHAR SxExtUniqueName L{2A06F1CB-1B9B-43A8-ADF7-B7D44A9EE71C}; // 唯一名称GUID 字符串 PWCHAR SxExtServiceName LMsPassthroughExt; // INF 中的服务名 ULONG SxExtAllocationTag tPsM; // 内存池标签 ULONG SxExtOidRequestId tPsM; // 用于标识本扩展发起的 OID 请求 ID对应的转发示例 MsForwardExt.c 中SxExtUniqueName为{37d9eae6-5bae-48c5-bff1-63a7cdd7e4f4}服务名为MSForwardExt内存池标签为wSxS。值得注意的是SxExtUniqueName与 INF 中NetCfgInstanceId的值保持一致例如 msforwardext.inf 中的NetCfgInstanceId{37d9eae6-5bae-48c5-bff1-63a7cdd7e4f4}这是扩展在交换机驱动栈上被识别的关键标识。2.3 必须实现的 SxApi 回调控制路径SxApi.h定义了一套完整的回调契约SxBase 库会在对应的 NDIS 事件发生时回调这些函数。按生命周期可分为几组驱动与交换机生命周期回调触发时机典型职责SxExtInitializeDriverEntry 期间分配 / 初始化全部全局数据SxExtUninitializeDriverUnload 期间释放 / 复位全局数据SxExtCreateSwitch扩展绑定到新交换机分配交换机级上下文此函数内不能发 OID控制与数据路径均未激活SxExtDeleteSwitch交换机删除释放交换机上下文SxExtActivateSwitch交换机激活运行或暂停中若创建时未激活在此完成引导初始化SxExtRestartSwitch交换机从暂停态重启返回NDIS_STATUS_SUCCESS/NDIS_STATUS_RESOURCES/NDIS_STATUS_FAILURESxExtPauseSwitch交换机从运行态暂停暂停处理端口与 NIC 生命周期SxExtCreatePort/SxExtUpdatePort/SxExtTeardownPort/SxExtDeletePort管理端口SxExtCreateNic/SxExtConnectNic/SxExtUpdateNic/SxExtDisconnectNic/SxExtDeleteNic管理 NIC。特别地SxExtCreateNic之后流量可能已开始从该 NIC 流入但在SxExtConnectNic返回前它不能被用作目的地址SxExtDisconnectNic返回后则相反。NIC 状态保存 / 恢复Save / RestoreSxExtSaveNic、SxExtSaveNicComplete、SxExtNicRestore、SxExtNicRestoreComplete支持虚拟机的迁移 / 快照场景。SxExtSaveNic的返回值语义值得注意返回NDIS_STATUS_SUCCESS且BytesWritten 0时必须向SaveState写入ExtensionId必须写SxExtUniqueName、ExtensionFriendlyName、SaveDataSize与SaveData若BytesWritten 0则不得写任何字段缓冲区不足时返回NDIS_STATUS_BUFFER_TOO_SHORT并通过BytesNeeded告知所需长度。策略Property / Policy管理回调返回值语义SxExtAddSwitchProperty/SxExtUpdateSwitchPropertyNDIS_STATUS_NOT_SUPPORTED策略不归本扩展消费NDIS_STATUS_SUCCESS消费且可强制执行STATUS_DATA_NOT_ACCEPTED消费但无法强制其他NDIS_STATUS_***设置有效策略失败SxExtDeleteSwitchProperty返回 TRUE 表示该策略属于本扩展SxExtAddPortProperty/SxExtUpdatePortProperty/SxExtDeletePortProperty端口级策略语义同上SxExtQuerySwitchFeatureStatus/SxExtQueryPortFeatureStatus查询自定义属性状态BytesNeeded用于请求重新分配更大的缓冲区2.4 必须实现的数据路径回调NBLNet Buffer List数据路径是扩展驱动处理包的核心入口SxExtStartNetBufferListsIngress收到 ingress NBL 时被调用。扩展必须调用SxLibSendNetBufferListsIngress继续发送或用SxLibCompleteNetBufferListsIngress丢弃该函数也可能在 egress 阶段被调用以实现 NBL 注入SxExtStartNetBufferListsEgress收到 egress NBL来自 Extension Miniport 的 Receive 指示时被调用对应库函数为SxLibSendNetBufferListsEgressSxExtStartCompleteNetBufferListsEgressegress NBL 完成时被调用处理完必须调用SxLibCompleteNetBufferListsEgressSxExtStartCompleteNetBufferListsIngressingress NBL 完成时被调用处理完必须调用SxLibCompleteNetBufferListsIngress特殊注意如果这批 NBL 中包含本扩展注入的 NBL则不能调用SxLibCompleteNetBufferListsIngress而应改用SxLibCompletedInjectedNetBufferLists传入已完成的注入 NBL 数量。OID / 状态指示路径主要用于转发型扩展SxExtProcessNicRequest/SxExtProcessNicRequestComplete处理OID_SWITCH_NIC_REQUEST。扩展可以通过输出参数设置SourcePortId/SourceNicIndex设置源信息或DestinationPortId/DestinationNicIndex重定向 OID也可以修改OidRequest本身完成时必须在SxExtProcessNicRequestComplete中释放之前持有的所有引用SxExtProcessNicStatus处理NDIS_STATUS_SWITCH_NIC_STATUS。想修改状态指示时应尽快用SxLibIssueNicStatusIndicationUnsafe发出自己的指示并返回失败状态想丢弃指示同样返回失败但应非常谨慎地使用。SxApi.h 中明确标注SxExtProcessNicRequest、SxExtProcessNicRequestComplete、SxExtProcessNicStatus这三个函数只能由转发型扩展使用。三、MsPassthroughExt使用 SxBase 的最小实现3.1 示例定位MsPassthroughExt 是基于 SxBase.lib 实现的基础过滤型扩展演示使用该库所需满足的最小实现集合。README 明确指出在 Hyper-V 可扩展交换机上安装并启用 MsPassthroughExt 不会影响交换机行为因此它是学习扩展骨架、验证工具链的最佳起点。3.2 源码要点整个实现位于 MsPassthroughExt.c约 600 行。观察其实现模式所有控制路径回调均返回成功或空操作SxExtCreateSwitch将*ExtensionContext NULL后返回NDIS_STATUS_SUCCESS端口 / NIC 相关回调一律UNREFERENCED_PARAMETER(...) 返回成功策略回调一律声明不支持SxExtAddSwitchProperty/SxExtUpdateSwitchProperty/SxExtAddPortProperty/SxExtUpdatePortProperty均返回NDIS_STATUS_NOT_SUPPORTED删除 / 查询回调返回FALSE——透传型扩展不消费任何自定义策略状态保存回调SxExtSaveNic与SxExtNicRestore将BytesWritten/BytesNeeded/BytesRestored置 0 后返回成功表示“无数据可保存”数据路径直接透传这是最关键的部分——VOID SxExtStartNetBufferListsIngress( PSX_SWITCH_OBJECT Switch, NDIS_HANDLE ExtensionContext, PNET_BUFFER_LIST NetBufferLists, ULONG SendFlags) { UNREFERENCED_PARAMETER(ExtensionContext); SxLibSendNetBufferListsIngress(Switch, NetBufferLists, SendFlags, 0); } VOID SxExtStartNetBufferListsEgress( PSX_SWITCH_OBJECT Switch, NDIS_HANDLE ExtensionContext, PNET_BUFFER_LIST NetBufferLists, ULONG NumberOfNetBufferLists, ULONG ReceiveFlags) { UNREFERENCED_PARAMETER(ExtensionContext); SxLibSendNetBufferListsEgress(Switch, NetBufferLists, NumberOfNetBufferLists, ReceiveFlags); }即把收到的 NBL 原样交给 SxBase 库继续向栈下层发送完成回调同样直接委托给SxLibCompleteNetBufferListsEgress/SxLibCompleteNetBufferListsIngress。这正是“透传”二字的含义。四、MsForwardExtMAC 转发 自定义策略的转发型扩展4.1 示例定位与行为约定MsForwardExt 是基于 SxBase.lib 实现的基础转发型扩展位于 samples/forward/。它实现基础 MAC 转发根据目的 MAC 地址查找目的 NIC 完成转发自定义交换机策略每条策略定义于 MSForwardExtPolicy.mof就是一个被允许发送的源 MAC 地址。README 特别说明了两个关键行为约束未配置策略时MsForwardExt 会阻断所有虚拟机的发送AllowSends默认 FALSE但保持与宿主机host的连通性Hybrid Forwarding混合转发本示例实现了混合转发——如果数据包被标记为 Hyper-V 网络虚拟化HNVHyper-V Network Virtualization数据包示例不会自行填充其目的表而是交由 vSwitch 的 HNV 策略计算目的表。4.2 自定义策略的 MOF 定义MSForwardExtPolicy.mof 使用 WMI 类MSForwardExt_MacAddressRule派生自Msvm_EthernetSwitchFeatureSettingData定义策略数据结构命名空间为root\virtualization\v2。其关键属性[ Dynamic, UUID(EB29F0F2-F5DC-45C6-81BB-3CD9F219BBBB), ExtensionId(37d9eae6-5bae-48c5-bff1-63a7cdd7e4f4), Provider(VmmsWmiInstanceAndMethodProvider), DisplayName(MSForwardExt MAC Address Policy) : Amended, Description(Source MAC Addresses to allow sends on MSForwardExt.) : Amended] class MSForwardExt_MacAddressRule : Msvm_EthernetSwitchFeatureSettingData { [ Read, Write, WmiDataId(1), Max(6), ... ] uint8 MacAddress[] {}; };注意其中的UUID与ExtensionIdExtensionId就是扩展的唯一名称 GUID{37d9eae6-5bae-48c5-bff1-63a7cdd7e4f4}把策略与扩展实例关联起来Max(6)对应 6 字节 MAC 地址。在源码 MsForwardExt.c 中这一策略被解析为两个 GUID 常量MacAddressPolicyGuid {EB29F0F2-F5DC-45C6-81BB-3CD9F219BBBB}与 MOF 的UUID一致用于识别策略类型MacAddressPolicyStatusGuid {A3E2AFF5-E6FA-4E52-AB74-13250BF7E8CF}用于策略状态查询。4.3 策略校验与强制逻辑SxExtAddSwitchPropertyMsForwardExt.c 中约第 653 行起演示了扩展消费策略的标准流程检查SwitchProperty-PropertyType是否为NdisSwitchPropertyTypeCustom否则返回NDIS_STATUS_NOT_SUPPORTED用RtlEqualMemory对比PropertyId与MacAddressPolicyGuid校验PropertyVersion MAC_ADDRESS_POLICY_VERSION与SerializationVersion MAC_ADDRESS_POLICY_SERIALIZATION_VERSION通过NDIS_SWITCH_PROPERTY_PARAMETERS_GET_PROPERTY与NDIS_SWITCH_PROPERTY_CUSTOM_GET_BUFFER取出策略缓冲区校验MacAddressLength ! 6MAC 地址必须为 6 字节则返回NDIS_STATUS_DATA_NOT_ACCEPTED在写锁DispatchLock保护下调用MsForwardAddMacPolicyUnsafe把策略加入PropertyList。端口属性方面SxExtAddPortProperty展示了转发扩展对各类端口策略的处理姿态注释中特别强调!! REAL FORWARDING EXTENSIONS SHOULD SUPPORT THESE PROPERTIES !!NdisSwitchPortPropertyTypeSecurity必须始终放行pass throughHyper-V 安全策略NdisSwitchPortPropertyTypeVlan转发扩展必须要么强制执行 VLAN要么拒绝 VLAN 策略——本示例不支持 VLAN因此返回NDIS_STATUS_DATA_NOT_ACCEPTEDNdisSwitchPortPropertyTypeProfile/NdisSwitchPortPropertyTypeCustom不处理。4.4 交换机上下文与 NIC 管理转发示例在 MsForwardExt.h 中定义了交换机级上下文MSFORWARD_CONTEXTtypedef struct _MSFORWARD_CONTEXT { BOOLEAN IsActive; NDIS_SWITCH_PORT_ID ExternalPortId; NDIS_SWITCH_NIC_INDEX ExternalNicIndex; BOOLEAN ExternalNicConnected; LIST_ENTRY NicList; // NIC 链表 LIST_ENTRY PropertyList; // 策略链表 PNDIS_RW_LOCK_EX DispatchLock; UINT32 NumDestinations; BOOLEAN IsInitialRestart; } MSFORWARD_CONTEXT, *PMSFORWARD_CONTEXT;每条 NIC 对应一个MSFORWARD_NIC_LIST_ENTRY记录MacAddress、PortId、NicIndex、NicType、AllowSends是否被策略放行与Connected状态。该头文件注释中坦率指出示例为演示清晰使用了链表做 NIC 与策略查找“THIS IS NOT RECOMMENDED”生产环境不推荐真实转发扩展应使用更适合高速转发的数据结构。关键状态机逻辑来自 MsForwardExt.cSxExtCreateSwitch分配上下文、初始化两个链表与DispatchLockNdisAllocateRWLock并置IsInitialRestart TRUESxExtRestartSwitch仅在首次重启IsInitialRestart时通过SxLibGetSwitchParametersUnsafe获取交换机参数若IsActive则调用MsForwardInitSwitch引导初始化随后置IsInitialRestart FALSESxExtConnectNic处理外部 NICNdisSwitchNicTypeExternal且NicIndex ! 0登记ExternalPortId/ExternalNicIndex并递增NumDestinations其余 NIC 标记Connected TRUESxExtDisconnectNic/SxExtDeleteNic执行对称的清理SxExtCreateNic/SxExtDeleteNic在IsInitialRestart期间会以NdisMSleep(100)轮询等待链表初始化完成这是 SxBase 模式下常见的启动同步手法。4.5 ingress 数据路径源过滤 MAC 转发 Hybrid Forwardingingress 处理的核心在SxExtStartNetBufferListsIngress对应的转发逻辑中MsForwardExt.c 约第 1300–1776 行。其流程可归纳为遍历并拆分 NBL 链表对每个 NBL 读取NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL依据fwdDetail-NativeForwardingRequired字段把 NBL 分为两组——“需要原生转发native forwarding”的 NBL 与“由本扩展转发”的 NBL。这正是 Hybrid Forwarding 的落地实现HNV 数据包由 vSwitch 的 HNV 策略计算目的表因此要求原生转发非 HNV 包由本扩展自行查表转发。源过滤通过MsForwardFindNicByPortIdUnsafe按SourcePortId/SourceNicIndex查 NIC 条目若条目存在但AllowSends FALSE则调用ReportFilteredNetBufferLists上报“Blocked by Source MAC Policy”后丢弃若条目不存在且源不是外部端口则按“Low Resources”丢弃。目的解析对需扩展转发的包读取以太网头若目的 MAC 是广播地址则组播到所有已连接目的地否则用MsForwardFindNicByMacAddressUnsafe查目的 NIC查到且已连接 → 投递到该 NIC查不到 → 若无外部 NIC 则丢弃“No external NIC”若源即外部端口则丢弃“Destination Source”否则投递到外部端口。写目的并发送用Switch-NdisSwitchHandlers.AddNetBufferListDestination为 NBL 添加目的PortId/NicIndex/PreserveVLAN 0把目的相同的 NBL 聚合并经SxLibSendNetBufferListsIngress送出被丢弃的 NBL 最终由SxLibCompleteNetBufferListsIngress完成其中ReportFilteredNetBufferLists的过滤原因字符串如LNo external NIC、LDestination is NOT connected.会在交换机诊断中直接可见。Egress 路径SxExtStartNetBufferListsEgress没有任何额外处理直接调用SxLibSendNetBufferListsEgress透传——README 所述“destination based filtering can occur at this stage”在本示例中未实现留作读者扩展点。五、安装、启用与卸载的完整实操5.1 安装脚本netcfg mofcomp每个扩展驱动都自带安装 / 卸载脚本。MsPassthroughExt 安装install.cmdnetcfg -l .\MSPassthroughExt.inf -c s -i ms_passthroughextMsForwardExt 安装install.cmd则多了 MOF 注册与 VMMS 服务重启步骤netcfg -l .\MSForwardExt.inf -c s -i ms_forwardext net stop vmms mofcomp -N:root\virtualization\v2 .\MSForwardExtPolicy.mof mofcomp -N:root\virtualization\v2 .\MSForwardExtPolicyStatus.mof net start vmms命令说明netcfg -l inf -c s -i instance以服务s方式安装 NETCFG 组件-i后跟 INF 中[Standard.NT$ARCH$...]小节定义的实例 IDms_passthroughext/ms_forwardextmofcomp -N:root\virtualization\v2把 WMI 策略类编译注册到虚拟化命名空间root\virtualization\v2配合net stop vmms/net start vmms让 Hyper-V 虚拟机管理服务VMMS加载新策略定义配套卸载脚本 uninstall.cmd转发版会先执行powershell .\removeRoute.ps1清理策略以netcfg -u ms_forwardext/netcfg -u ms_passthroughext卸载。5.2 在交换机上启用扩展安装完成后在 Hyper-V 宿主机上以管理员身份执行 PowerShell 命令启用扩展Enable-VmSwitchExtension -VmSwitchName CorpNet -Name Microsoft Sample Forwarding Extension其中-Name对应扩展的友好名称SxExtFriendlyName例如 MsForwardExt 为 “Microsoft Sample Forwarding Extension”也可用Get-VmSwitchExtension/Disable-VmSwitchExtension查询与禁用。5.3 应用 MAC 策略setRoute.ps1setRoute.ps1 演示了通过 PowerShell 把策略批量应用到虚拟机Import-Module Hyper-V $vmArr Get-VM $switch Get-VmSwitch -Name CorpNet $policy Get-VmSystemSwitchExtensionSwitchFeature -FeatureName MSForwardExt Mac Address Policy foreach($vm in $vmArr) { $adapters Get-VmNetworkAdapter -VmName $vm.Name foreach($adapter in $adapters) { Write-Host Setting Policy for $($vm.Name)... $policy.SettingData.MacAddress StringToMacAddress($adapter.MacAddress) Add-VmSwitchExtensionSwitchFeature -VmSwitch $switch -VMSwitchExtensionFeature $policy } }脚本内置的StringToMacAddress函数把形如00155D...的 12 位十六进制 MAC 字符串逐字节解析为uint8[]数组与 MOF 中MacAddress[]字段Max(6)对应随后用Add-VmSwitchExtensionSwitchFeature为每个 VM 网卡 MAC 建立放行策略。相应地removeRoute.ps1 用于批量移除这些策略Remove-VmSwitchExtensionSwitchFeature。六、工程结构与构建示例工程由 extensions.sln 组织包含三个项目项目目录说明base/SxBase.lib 基础库sxbase.vcxproj编译后链接进扩展驱动samples/passthrough/MsPassthroughExt 透传示例mspassthroughext.vcxprojsamples/forward/MsForwardExt 转发示例msforwardext.vcxproj扩展驱动项目只需引用 SxBase.lib 并实现 SxApi.h 契约。构建后生成MSPassthroughExt.sys/MSForwardExt.sysINF 中ServiceBinary %13%\...sys%13%为系统驱动目录并需对 INF 签名CatalogFile后方可在启用测试签名或使用 WHQL 签名的环境中加载。从源码结构可以推断开发一款生产级扩展驱动的一般步骤是拷贝 passthrough 示例工程 → 修改SxExtFriendlyName/SxExtUniqueName/SxExtServiceName与 INF 中对应字段 → 按业务需要填充控制路径回调尤其策略回调→ 在SxExtStartNetBufferListsIngress/SxExtStartNetBufferListsEgress中实现过滤与转发逻辑 → 用 install.cmd Enable-VmSwitchExtension部署验证。七、总结与下一步本文完整梳理了 Windows-driver-samples 仓库中 Hyper-V 可扩展交换机扩展驱动的实现路径以 SxBase.lib 为骨架通过 SxApi.h 定义的全局变量与 30 余个回调实现驱动 / 交换机 / 端口 / NIC / 策略 / 数据路径的全部处理逻辑MsPassthroughExt 展示了最小透传实现MsForwardExt 展示了基于 MAC 策略的源过滤、目的查表与 Hybrid Forwarding通过NativeForwardingRequired字段把 HNV 包交给 vSwitch 原生转发。安装侧则由netcfg、mofcomp与Enable-VmSwitchExtension等工具链闭环支撑。如需进一步深入官方概念与 OID/NDIS 结构细节可继续研读仓库内相关 NDIS 示例如 network/ndis/filter 普通筛选器、network/ndis/ndisprot 协议驱动以及 samples/forward/MSForwardExtPolicy.mof、samples/forward/MsForwardExt.c 等源码中标注的扩展点注释——这些正是你基于 SxBase 二次开发时最值得对照的素材。赞分享示例工程【免费下载链接】Windows-driver-samplesThis repo contains driver samples prepared for use with Microsoft Visual Studio and the Windows Driver Kit (WDK). It contains both Universal Windows Driver and desktop-only driver samples.项目地址https://gitcode.com/gh_mirrors/wi/Windows-driver-samples点击查看免费下载相关推荐Windows 驱动示例基于 NFC 类扩展NFC CX的 UMDF 2 功能驱动程序模板实战解析Windows 驱动示例基于 NFC 类扩展NFC CX的 UMDF 2 功能驱动程序模板实战解析 本篇技术指南以仓库中的 nfc/NfcCxSample示例工程Spacedrive 扩展开发实战基于 test-extension 理解宏驱动的 WASM 扩展 SDKSpacedrive 扩展开发实战基于 test extension 理解宏驱动的 WASM 扩展 SDK 本篇技术指南围绕 Spacedrive 仓库中的官桌面应用移动开发后端存储数据同步esp-iot-solution GPIO 扩展实战基于 MCP23017 的 I2C I/O 扩展驱动指南esp iot solution GPIO 扩展实战基于 MCP23017 的 I2C I/O 扩展驱动指南 导读 在 ESP32 系列嵌入式应用中GPIO物联网嵌入式驱动开发硬件开发上一篇解决90%的对话框需求Ookii.Dialogs.Wpf常见问题与解决方案下一篇快速掌握mobile-aloha低成本全身遥操作机器人开发指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网