当前位置: 首页 > news >正文

windows网络适配器驱动开发-开发 WiFiCx 客户端驱动程序(四)

用于创建适配器的事件回调

客户端驱动程序使用相同的事件回调创建工作站适配器和 WfdRole 适配器: EvtWifiDeviceCreateAdapter。

  • 调用 WifiAdapterGetType 来确定适配器类型。
  • 如果在创建适配器之前驱动程序需要从 NETADAPTER_INIT 对象查询适配器类型,请调用 WifiAdapterInitGetType。
  • 调用 WifiAdapterGetPortId 确定端口 ID(用于消息命令)。
NTSTATUS EvtWifiDeviceCreateAdapter( WDFDEVICE Device, NETADAPTER_INIT* AdapterInit ) { NET_ADAPTER_DATAPATH_CALLBACKS datapathCallbacks; NET_ADAPTER_DATAPATH_CALLBACKS_INIT(&datapathCallbacks, EvtAdapterCreateTxQueue, EvtAdapterCreateRxQueue); NetAdapterInitSetDatapathCallbacks(AdapterInit, &datapathCallbacks); WDF_OBJECT_ATTRIBUTES adapterAttributes; WDF_OBJECT_ATTRIBUTES_INIT(&adapterAttributes); WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&adapterAttributes, WIFI_NETADAPTER_CONTEXT); adapterAttributes.EvtCleanupCallback = EvtAdapterContextCleanup; NETADAPTER netAdapter; NTSTATUS ntStatus = NetAdapterCreate(AdapterInit, &adapterAttributes, &netAdapter); if (!NT_SUCCESS(ntStatus)) { TraceEvents(TRACE_LEVEL_ERROR, DBG_DEVICE, "%!FUNC!: NetAdapterCreate failed, status=0x%x\n", ntStatus); return ntStatus; } ntStatus = WifiAdapterInitialize(netAdapter); if (!NT_SUCCESS(ntStatus)) { TraceEvents(TRACE_LEVEL_ERROR, DBG_DEVICE, "%!FUNC!: WifiAdapterInitialize failed with %!STATUS!\n", ntStatus); return ntStatus; } ntStatus = ClientDriverInitDataAdapterContext( Device, netAdapter, WifiAdapterGetType(netAdapter) == WIFI_ADAPTER_EXTENSIBLE_STATION ? EXTSTA_PORT : EXT_P2P_ROLE_PORT, WifiAdapterGetPortId(netAdapter)); if (!NT_SUCCESS(ntStatus)) { TraceEvents(TRACE_LEVEL_ERROR, DBG_DEVICE, "%!FUNC!: ClientDriverInitDataAdapterContext failed with %!STATUS!\n", ntStatus); return ntStatus; } ntStatus = ClientDriverNetAdapterStart(netAdapter); if (!NT_SUCCESS(ntStatus)) { TraceEvents(TRACE_LEVEL_ERROR, DBG_DEVICE, "%!FUNC!: ClientDriverNetAdapterStart failed with %!STATUS!\n", ntStatus); return ntStatus; } return ntStatus; }

该函数是 WiFiCx 客户端驱动程序中用于创建默认网络适配器(通常对应基础站模式)的核心回调,由 WiFiCx 框架在硬件准备完成后调用。其执行流程可概括为六个步骤,依次完成数据路径配置、适配器对象创建、WiFiCx 上下文初始化、客户端自定义设置以及适配器启动。

  • 函数初始化一个用于注册数据路径回调的结构体,并指定发送队列和接收队列的创建函数,然后将其设置到适配器初始化对象中。这一步的作用是告诉 NetAdapterCx 框架,当需要为网络数据收发创建队列时,应调用哪些驱动提供的回调。
  • 函数准备适配器对象的属性,为适配器关联一个自定义的上下文结构(用于存储驱动私有数据),并注册一个清理回调以便在适配器销毁时释放资源。随后调用 NetAdapterCx 的创建函数,生成底层的 NETADAPTER 对象,该对象代表一个网络接口。
  • 创建成功后,函数调用 WiFiCx 提供的初始化函数,将新生成的 NETADAPTER 对象与 WiFiCx 框架绑定,完成 Wi-Fi 专用的上下文初始化,使得该适配器能够支持 WDI 命令处理。
  • 函数进入客户端自定义阶段。它会根据适配器的类型(是基础站还是 Wi-Fi Direct 角色)以及端口 ID,调用驱动程序自定义的初始化上下文函数。在此过程中,它使用 WiFiCx 的辅助函数来获取适配器类型和端口号,以便正确配置驱动内部的端口数据结构。
  • 函数调用驱动程序自定义的启动函数。该函数通常会执行必要的硬件准备或状态同步,并最终调用 NetAdapterCx 的标准启动例程,使适配器进入活动状态。
  • 一旦启动成功,WiFiCx 框架便会向设备下发初始配置和无线电状态设置等命令。

整个函数将 WDF 的对象管理、NetAdapterCx 的数据路径创建,以及 WiFiCx 的 Wi-Fi 控制功能有机地结合在一起,是驱动从初始化阶段过渡到正常运行阶段的关键桥梁。每一步都有明确的失败处理,如果任何调用失败,函数会记录错误并立即返回,避免继续执行无效操作。

http://www.jsqmd.com/news/1256581/

相关文章:

  • Agent工作流的可观测性设计:Trace追踪、断点重试与异常熔断机制
  • 【湿法-萃取工艺22】---MSP废水处理-废水近0排海
  • mootdx智能服务器检测:如何为通达信数据获取选择最佳连接节点
  • 企业级RPA自动化终极指南:OpenRPA免费开源解决方案快速上手
  • GHelper终极指南:华硕笔记本轻量级硬件控制与性能优化解决方案
  • Claude、ChatGPT 同日升级语音:AI 正在从“聊天“走向真正的工作入口
  • 3分钟掌握Locale-Emulator:让日文游戏告别乱码的终极指南
  • 【易飞】易飞ERP全能WebAPI发布:全单据CRUD与审核流操作,RESTful风格覆盖所有版本
  • 三大核心优势:WorkshopDL如何成为Steam创意工坊下载的最佳选择
  • 在FreeBSD的Uubntu兼容环境下安装Reasonix
  • 我的音视频/流媒体/深度学习开源项目(github)
  • 线性回归-学习笔记
  • 搜狗建站收录百度却搜索不到原因:蜘蛛抓取其实有这2个偏好
  • 【Rust中级教程】1.1. 指针概览(上):什么是指针、指针和引用的区别
  • 【研发类-前端开发Skills】antigravity-design-expert 技能
  • WeChatExporter终极指南:如何免费永久备份微信聊天记录
  • 抖音直播录制神器:轻松保存40+平台直播内容的完整指南
  • 【Rust中级教程】2.10. API设计原则之受约束性(constrained) Pt.1:对类型进行修改、`#[non_exhaustive]`注解
  • 2026 年当下,湖州有实力的衣橱整理收纳培训供货商哪个好,扔掉后悔!衣橱焕新自救指南-娘子帮母婴 - 品质体验官
  • 目标检测:视觉系统中的CNN-Transformer融合网络
  • Python基础5-18
  • python元组知识点
  • 游戏客服响应效率提升300%:揭秘头部厂商AI机器人背后的真实训练数据与对话引擎架构
  • 抖音下载神器:如何用免费工具一键批量下载无水印视频?
  • 5大核心技术构建高效抢票自动化系统:从原理到实战的完整指南
  • AI数字人直播月入10万+的5个真实案例:从零搭建到稳定变现的全流程拆解
  • 阿拉善出发西藏年度口碑榜:2026纯玩小团冠军揭晓,这家15年地接社凭什么?| 附:旅行社电话 - 西藏康泰旅行社
  • Three.js 城市混合Shader教程
  • 3步解锁网易云音乐NCM文件:ncmdumpGUI完整使用指南
  • Micrometer 系列【4】入门案例