windows 驱动实例分析系列: wireguard-nt驱动分析-driver篇(一)
WireGuardNT 驱动代码解析 - 第一篇设备管理与IOCTL接口1. 概述WireGuardNT 驱动driver/目录是 WireGuard 在 Windows NT 内核中的核心实现负责处理 VPN 隧道的数据包加解密、路由、对等体管理以及网络接口操作。本系列文档将驱动代码分为四个部分进行解析本文为第一部分涵盖设备初始化、适配器管理、IOCTL 控制接口以及与网络状态指示器NSI的交互。主要涉及以下源文件main.c– 驱动入口点DriverEntry和卸载例程。device.c/device.h– 定义 WG_DEVICE 结构实现 NDIS 微型端口驱动回调初始化、暂停、重启、发送、接收、OID 请求等。ioctl.c/ioctl.h– 实现用户态与驱动通信的 IOCTL 接口获取/设置配置、适配器状态、读取日志。nsi.c/nsi.h– 与 Windows 网络状态指示器NSI集成监控 MTU 变化并拦截 NSI 设置请求。wireguard.inf– 驱动安装信息文件。wireguard.rc/wireguard.ico– 资源文件。2. 驱动入口与初始化main.cDriverEntry是驱动的初始化入口其流程如下调用ExInitializeDriverRuntime(DrvRtPoolNxOptIn)启用非执行池保护。调用CryptoDriverEntry()检测 CPU 特性SSSE3、AVX、AVX2、AVX512 等为后续加密算法选择最佳实现。调用NoiseDriverEntry()预计算 Noise 握手协议所需的初始哈希和链密钥基于固定字符串。调用MemDriverEntry()初始化内存池NET_BUFFER 和 NET_BUFFER_LIST 缓存。调用RcuDriverEntry()初始化 RCU 机制每 CPU 的 DPC 和清理线程。调用AllowedIpsDriverEntry()初始化 AllowedIPs 查找树的节点缓存。调用RatelimiterDriverEntry()初始化速率限制器GC 线程和哈希表。调用PeerDriverEntry()初始化对等体对象的后备列表lookaside list。调用DeviceDriverEntry()注册 NDIS 微型端口驱动NdisMRegisterMiniportDriver。调用IoctlDriverEntry()和NsiDriverEntry()分别挂接 IOCTL 派遣例程和 NSI 过滤。若调试版本DBG启用了自测试还会执行CryptoSelftest、AllowedIpsSelftest、PacketCounterSelftest和RatelimiterSelftest。卸载例程Unload依次调用DeviceUnload、WskUnload、PeerUnload、RatelimiterUnload、AllowedIpsUnload、RcuUnload、MemUnload释放资源。3. NDIS 微型端口驱动device.cdevice.c实现了 NDIS 微型端口驱动所需的回调函数并管理WG_DEVICE结构每个适配器一个实例。3.1 核心数据结构WG_DEVICE定义在device.h中包含MiniportAdapterHandle– NDIS 适配器句柄。Statistics– 接口统计信息收发字节、包数等。ItemsInFlight– 引用计数用于控制暂停/重启时的资源释放。多个环形队列EncryptQueue、DecryptQueue、HandshakeRxQueue用于异步处理。多核工作队列EncryptThreads、DecryptThreads、HandshakeTxThreads、HandshakeRxThreads用于并行加解密和握手。套接字指针Sock4和Sock6RCU 保护。静态身份标识StaticIdentity公钥/私钥。Cookie 检查器CookieChecker。对等体哈希表PeerHashtable和索引哈希表IndexHashtable。AllowedIPs 表PeerAllowedIps。设备锁DeviceUpdateLock和套接字更新锁SocketUpdateLock。对等体列表PeerList和计数NumPeers。接口索引、LUID、属主进程、监听端口、UP/DOWN 状态等。3.2 NDIS 回调函数InitializeEx创建WG_DEVICE实例初始化所有队列、锁、哈希表、工作线程并调用RegisterAdapter注册适配器属性。若成功调用NsiActivate激活 NSI 监控。HaltEx反向清理关闭套接字、移除所有对等体、销毁工作线程、释放内存。Pause在适配器暂停时调用等待所有飞行中的包完成调用DeviceStop停止设备清空密钥、清除握手状态。Restart恢复适配器重新初始化ItemsInFlight并调用DeviceStart启动对等体的待发送包和保活定时器。SendNetBufferLists处理上层协议栈发来的数据包。对每个 NBL检查协议IPv4/IPv6提取 IP 头通过AllowedIpsLookupDst查找目标对等体然后将包加入对等体的暂存队列StagedPacketQueue并触发PacketSendStagedPackets发送。OidRequest处理 OID 查询和设置请求例如返回厂商 ID、速度、统计信息、链路状态等。对于OID_GEN_CURRENT_PACKET_FILTER等设置仅验证长度并返回成功对于OID_PNP_SET_POWER若进入 D1 以上状态则调用RcuBarrier。ReturnNetBufferLists释放接收到的 NBL由PacketReceive处理后调用。3.3 适配器状态管理DeviceStart和DeviceStop分别启动/停止设备其中DeviceStart遍历所有对等体发送暂存包和保活包DeviceStop清除所有对等体的密钥和握手状态并清空握手队列。DeviceIndicateConnectionStatus用于向 NDIS 报告链路连接状态UP/DOWN并更新链路速度。4. IOCTL 接口ioctl.c / ioctl.h用户态 DLLwireguard.dll通过 IOCTL 与驱动通信。驱动在IoctlDriverEntry中替换IRP_MJ_DEVICE_CONTROL的派遣例程并设置安全描述符允许 SYSTEM 和 Administrators 完全访问。定义的控制代码ioctl.hWG_IOCTL_GETMETHOD_OUT_DIRECT获取当前适配器配置接口信息、对等体列表、AllowedIPs。返回WG_IOCTL_INTERFACE结构及其后跟随的WG_IOCTL_PEER和WG_IOCTL_ALLOWED_IP结构。若缓冲区不足返回STATUS_BUFFER_OVERFLOW并给出所需大小。WG_IOCTL_SETMETHOD_IN_DIRECT设置配置。输入为一个WG_IOCTL_INTERFACE后接若干WG_IOCTL_PEER和WG_IOCTL_ALLOWED_IP。驱动解析并应用配置设置监听端口、私钥、添加/删除对等体、更新 AllowedIPs。WG_IOCTL_SET_ADAPTER_STATEMETHOD_BUFFERED设置适配器状态UP/DOWN或查询当前状态。WG_IOCTL_READ_LOG_LINEMETHOD_BUFFERED读取下一条日志条目环形缓冲区。关键辅助函数HasAccess使用安全描述符检查调用者权限。WgDeviceFromFdo从设备对象提取WG_DEVICE指针利用NdisWdfGetAdapterContextFromAdapterHandle。Get操作遍历对等体和 AllowedIPs填充输出缓冲区。注意使用锁保护DeviceUpdateLock和各个子锁。Set操作解析WG_IOCTL_INTERFACE调用SetListenPort、SetPrivateKey并循环处理每个对等体SetPeer。SetPeer中会查找或创建对等体更新预共享密钥、端点、持久保活间隔并调用AllowedIpsInsertV4/V6或Remove更新路由表。SetAdapterState根据命令调用Up或Down内部会创建/销毁 UDP 套接字、更新链路状态、启动/停止定时器。ReadLogLine从LOG_RING中读取一条日志非阻塞等待可被设备移除事件中断。5. NSI 集成nsi.c / nsi.h为了监控和调节接口 MTU驱动挂钩了 NSI网络状态指示器的IOCTL_NSI_SET_ALL_PARAMETERS调用。NsiDriverEntry替换了IRP_MJ_PNP和IRP_MJ_DEVICE_CONTROL的派遣例程并在首次有设备激活时附加到\Device\Nsi设备对象。NsiActivate将设备加入全局DeviceList若列表原本为空则调用Attach挂载过滤设备。NsiDeactivate从列表中移除若列表变空则调用Detach卸载过滤。过滤派遣例程FilterDispatch拦截IOCTL_NSI_SET_ALL_PARAMETERS提取出MIB_IPINTERFACE_ROW包括接口 LUID 和 MTU然后调用原始的 NSI 请求并在成功后回调IpInterfaceChangeNotification更新设备的Mtu4或Mtu6根据地址族。该回调也通过NotifyRouteChange2注册以响应路由变化。通过这种方式驱动能感知上层设置的 MTU并调整数据包填充大小确保不超过 MTU。6. 自测试与调试在调试版本中main.c中会执行一系列自测试加密、AllowedIPs、计数器、速率限制器这些测试定义在selftest/目录下的文件中如chacha20poly1305.c、allowedips.c、counter.c、ratelimiter.c。测试失败将导致驱动加载失败返回STATUS_INTERNAL_ERROR。7. 总结第一部分的代码构成了驱动的基础骨架负责驱动的加载、初始化、卸载。NDIS 微型端口驱动的注册和回调实现。用户态 IOCTL 接口实现配置的获取、设置及适配器状态控制。与 NSI 集成自适应 MTU 变化。后续文档将深入探讨加密与 Noise 协议、数据包收发路径以及辅助模块。

相关新闻

TestNG最常用的注解

TestNG最常用的注解

TestNG使用它最常用的注解 1. 注解:Test:标识方法是一个基于TestNG的测试用例 常用属性: enabled false 标识它不是一个测试用例 priority -1 默认的测试用例的执行顺序是基于方法名的ASCII码,priority可以改变用例的执行顺…

2026/8/22 16:29:37 阅读更多 →
QuickLook Video 快速上手:3步找回Finder视频缩略图与Quick Look预览

QuickLook Video 快速上手:3步找回Finder视频缩略图与Quick Look预览

QuickLook Video 快速上手:3步找回Finder视频缩略图与Quick Look预览 【免费下载链接】QuickLookVideo Finder Thumbnails, Quick Look previews, Get Info metadata and previews for most types of audio and video files. 项目地址: https://gitcode.com/gh_mi…

2026/8/22 16:29:37 阅读更多 →
语音处理项目工程化实践:从零搭建可复现的Python开发环境与流水线

语音处理项目工程化实践:从零搭建可复现的Python开发环境与流水线

在实际语音技术项目中,我们常常面临一个核心挑战:如何将前沿的学术研究成果,特别是那些在顶级会议(如 ICASSP, Interspeech)上发表的论文,快速、可靠地转化为可运行、可评估的工程代码。许多优秀的开源项目…

2026/8/22 16:29:37 阅读更多 →

最新新闻

使用Hugging Face Trainer API高效微调BERT模型进行文本分类实战指南

使用Hugging Face Trainer API高效微调BERT模型进行文本分类实战指南

如果你正在学习深度学习,特别是自然语言处理(NLP),那么“微调预训练模型”这个概念你一定不陌生。但你是否曾面对PyTorch或TensorFlow那冗长的训练循环、复杂的梯度累积逻辑、繁琐的评估指标计算而感到头疼?或者&#…

2026/8/22 17:08:52 阅读更多 →
一站式AI电商素材工作台:本地部署与批量生成实战指南

一站式AI电商素材工作台:本地部署与批量生成实战指南

这次我们来看一个面向电商场景的本地化AI工具项目。它不是一个单一模型,而是一个整合了多种AI能力的“一站式商品素材工作台”。核心目标很明确:让商家或内容创作者,在完成一次商品信息建档后,能自动化、批量地生成主图、详情页、…

2026/8/22 17:08:52 阅读更多 →
远程办公运维硬件测评:2026 单孔智能开机插座横向对比与选型指南

远程办公运维硬件测评:2026 单孔智能开机插座横向对比与选型指南

先说答案如果你追求极致的远程开机体验、不想在多个APP之间来回切换、预算又有限——向日葵C1Pro是目前单孔位远程智能开机插座中最值得入手的选择。在深度体验了市面上多款主流单孔位远程智能插座后,核心结论很明确:唯有“自带第一方远控软件打通主板底…

2026/8/22 17:08:52 阅读更多 →
数学建模国赛核心模型速查:从问题识别到模型组合实战指南

数学建模国赛核心模型速查:从问题识别到模型组合实战指南

1. 项目概述:为什么我们需要一份“简述”版的国赛模型总结每年一到数学建模国赛季,无论是新手还是老手,都会面临一个经典问题:模型那么多,到底该用哪个?从图书馆借来几本厚厚的建模教材,或者在网…

2026/8/22 17:08:52 阅读更多 →
基于TEE与智能体的隐私保护审计:架构、原理与实践

基于TEE与智能体的隐私保护审计:架构、原理与实践

1. 项目概述:当审计遇上可信执行环境与智能体最近在琢磨一个挺有意思的交叉领域问题:如何在确保数据隐私的前提下,对系统或流程进行可信、可扩展的审计?这听起来像是个“既要又要”的难题。传统的审计要么依赖审计方完全掌握原始数…

2026/8/22 17:08:52 阅读更多 →
支持修改界面字体的软件很少,但这两个软件可以

支持修改界面字体的软件很少,但这两个软件可以

背景 “一个软件界面看久了是不是有点审美疲劳?今天心情不好,能否换个界面倒倒运气?”看似很简单的需求,其实大多数软件都不支持,但是DBCS屠龙刀和DESK倚天剑这两个软件除外。这两个软件换皮肤风格的功能估计大家都用…

2026/8/22 17:07:52 阅读更多 →

日新闻

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

在电子硬件开发领域,PCB(印制电路板)的沉金工艺是提升产品可靠性和焊接质量的关键环节。对于需要高密度互连、长期稳定运行或高频信号传输的板卡,如“黍姐仿通行证”这类可能涉及身份识别、数据交互的硬件项目,选择正确…

2026/8/22 0:00:11 阅读更多 →
电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

这次我们来看一个针对电气考研电路科目的学习规划项目。它不是软件工具,而是一套聚焦于8月份关键节点的备考策略。对于电气工程考研的同学来说,电路分析是专业课的重中之重,也是拉开分差的关键。进入8月,复习进入强化阶段&#xf…

2026/8/22 0:00:11 阅读更多 →
消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

大家好,我是专注于前端开发与AI工具实践的技术博主。在日常使用 Claude Code 等AI编程助手时,你是否也遇到过这样的困扰:生成的代码功能上没问题,但代码风格、组件设计、交互逻辑总透着一股“AI味”——布局单调、样式简陋、交互生…

2026/8/22 0:00:11 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/22 8:09:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/21 16:42:28 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/22 7:31:03 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →