windows 驱动实例分析系列: wintun驱动分析-api篇(一)
Wintun API 模块深度解析文档一公共接口与项目结构一、模块定位与整体架构api文件夹是 Wintun 用户态动态库wintun.dll的完整源代码它构成了开发者与 Wintun 驱动交互的唯一官方接口。该 DLL 封装了驱动安装、适配器管理、会话控制、数据包收发等全部功能并以一套简洁、稳定的 C API 对外暴露定义在wintun.h中。整个api模块采用分层设计公开接口层wintun.h定义所有导出函数、常量和类型供应用程序调用。适配器管理层adapter.c/.h、adapter_win7.h、driver.c/.h负责适配器的创建、打开、关闭、删除以及驱动程序的安装/卸载。会话与数据路径层session.c管理数据会话的生命周期实现高效的环形缓冲区收发。辅助基础层logger、namespace、registry、resource、rundll32、nci、ntdll等提供日志、同步、注册表、资源嵌入、WOW64 代理、网络配置等通用服务。本文作为系列第一篇聚焦公开接口定义、内部数据结构、项目构建配置为后续深入理解各模块奠定基础。二、公共头文件wintun.h详解wintun.h是 Wintun 唯一需要用户引用的头文件它定义了全部 API 函数原型、回调类型、常量和句柄类型。该头文件采用#pragma once和extern C包装兼容 C/C。2.1 句柄类型与基本常量typedefstruct_WINTUN_ADAPTER*WINTUN_ADAPTER_HANDLE;typedefstruct_TUN_SESSION*WINTUN_SESSION_HANDLE;两种不透明句柄分别代表适配器和会话内部结构在实现文件中定义外部不可访问。常量WINTUN_MIN_RING_CAPACITY128 KiB和WINTUN_MAX_RING_CAPACITY64 MiB规定了会话环形缓冲区容量的合法范围。WINTUN_MAX_IP_PACKET_SIZE0xFFFF定义了最大 IP 包大小64 KiB。2.2 API 函数指针类型定义头文件为每个导出函数定义了对应的函数指针类型如WINTUN_CREATE_ADAPTER_FUNC便于应用程序通过GetProcAddress动态加载。所有导出函数如下函数名功能WintunCreateAdapter创建新适配器指定名称、隧道类型、可选 GUIDWintunOpenAdapter打开已存在的适配器按名称WintunCloseAdapter关闭并释放适配器若由创建而来则同时删除WintunDeleteDriver卸载驱动当无适配器使用时WintunGetAdapterLUID获取适配器的 NET_LUID用于路由配置WintunGetRunningDriverVersion查询当前加载的驱动版本号WintunSetLogger设置全局日志回调WintunStartSession启动数据会话指定缓冲区容量WintunEndSession结束会话WintunGetReadWaitEvent获取读等待事件句柄用于非阻塞等待WintunReceivePacket从接收环中获取一个数据包WintunReleaseReceivePacket释放已接收的数据包缓冲区WintunAllocateSendPacket分配发送缓冲区WintunSendPacket提交发送数据包这些函数均采用WINAPI__stdcall调用约定确保跨语言兼容。2.3 日志回调类型typedefenum{WINTUN_LOG_INFO,WINTUN_LOG_WARN,WINTUN_LOG_ERR}WINTUN_LOGGER_LEVEL;typedefVOID(CALLBACK*WINTUN_LOGGER_CALLBACK)(WINTUN_LOGGER_LEVEL Level,DWORD64 Timestamp,LPCWSTR Message);时间戳为 100 ns 间隔自 1601-01-01 UTC与 Windows FILETIME 一致。回调可能从多线程并发调用需由调用方自行序列化。三、内部头文件与数据结构3.1adapter.h—— 适配器内部描述typedefstruct_WINTUN_ADAPTER{HSWDEVICE SwDevice;// 软件设备句柄Win8HDEVINFO DevInfo;// SetupAPI 设备信息集SP_DEVINFO_DATA DevInfoData;// 设备信息数据WCHAR*InterfaceFilename;// 设备对象文件名如 \\.\Wintun_xxxGUID CfgInstanceID;// 网络配置实例 GUIDNetCfgInstanceIdWCHAR DevInstanceID[MAX_DEVICE_ID_LEN];// 设备实例 IDDWORD LuidIndex;// NET_LUID 中的索引DWORD IfType;// 接口类型IF_TYPE_SOFTWARE_LOOPBACK 等DWORD IfIndex;// 接口索引可选}WINTUN_ADAPTER;此结构保存了适配器所有必要元数据被各 API 函数频繁使用。adapter.h还声明了内部辅助函数AdapterOpenDeviceObject打开设备对象句柄用于 IOCTL 通信。AdapterGetDeviceObjectFileName获取设备接口的文件名。AdapterCleanupOrphanedDevices清理孤儿设备无所有者进程。AdapterRemoveInstance/AdapterEnableInstance/AdapterDisableInstance底层设备操作内部会判断是否需要通过rundll32代理WOW64 场景。3.2driver.h—— 驱动管理接口声明了驱动安装/卸载的核心函数DriverInstall安装或升级 Wintun 驱动比较版本、提取资源、调用 Setup API。WintunDeleteDriver删除驱动当无适配器时。WintunGetRunningDriverVersion查询当前加载的驱动版本。此外driver.c中定义了驱动版本比较、文件版本提取、禁用/启用现有适配器等逻辑。3.3 全局变量与 DLL 入口main.h定义了全局变量ResourceModuleDLL 模块句柄用于资源提取。ModuleHeap私有堆句柄统一内存管理。SecurityAttributes安全描述符限制仅为 SYSTEM 和 Administrators 访问。IsLocalSystem当前进程是否以 SYSTEM 身份运行。NativeMachine当前进程所处的本机架构用于决定是否启用 WOW64 代理。IsWindows7/IsWindows10版本标志用于条件编译。main.c中的DllMain负责创建私有堆。初始化安全对象创建包含 SYSTEM/管理员 SID 的安全描述符。获取操作系统版本和进程位数信息通过IsWow64Process2或IsWow64Process。初始化命名空间NamespaceInit并清理旧版适配器AdapterCleanupLegacyDevices。在卸载时释放资源。延迟加载钩子__pfnDliNotifyHook2强制从System32加载延迟加载的 DLL避免恶意 DLL 劫持。四、项目构建配置api.vcxproj4.1 基本设置配置类型DynamicLibrary生成wintun.dll。平台工具集WindowsApplicationForDrivers10.0——允许使用部分驱动开发包中的头文件和库并支持cfgmgr32.h、devpkey.h等。输出文件名通过TargetNamewintun/TargetName指定为wintun。4.2 预处理器定义根据平台定义MAYBE_WOW64x86、x64、ARM 均有ARM64 没有用于条件编译代理调用逻辑。资源编译时还会检查是否已构建其他平台的代理 DLLBUILT_ARM64_WOW64、BUILT_AMD64_WOW64以便在资源中嵌入它们。4.3 延迟加载与附加依赖延迟加载了大量系统 DLLadvapi32.dll、cfgmgr32.dll、iphlpapi.dll、setupapi.dll、shlwapi.dll、version.dll等以及api-ms-win-devices-query-l1-1-0.dll设备查询和api-ms-win-devices-swdevice-l1-1-0.dll软件设备。链接库包括onecore.lib提供 SwDevice 等 API、ntdll.libNtQuerySystemInformation等、swdevice.lib等。4.4 自定义生成步骤BuildInfVersion使用cscript.exe运行extract-driverver.js从driver/wintun.inf中提取驱动版本和日期生成wintun-inf.h供driver.c包含。这确保了驱动版本信息与 INF 文件同步。BuildNci将nci.h内联存根和nci.def编译为nci.lib用于动态链接nci.dllWindows 的网络连接接口。由于nci.dll没有导入库因此通过自定义步骤生成。4.5 资源嵌入resources.rc编译后嵌入 DLL 资源包含多个平台的驱动文件wintun.sys、wintun.cat、wintun.inf和代理 DLLsetupapihost*.dll。这些资源在driver.c和rundll32.c中按需提取到临时目录使用。五、模块间依赖关系┌─────────────────┐ │ wintun.h │ (公开API) └────────┬────────┘ │ ┌────────────────────────┼─────────────────────────┐ │ │ │ ▼ ▼ ▼ ┌─────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ adapter.c/h │ │ session.c │ │ driver.c/h │ │适配器管理│ │会话与数据路径│ │驱动安装/卸载 │ └──────┬──────┘ └────────┬────────┘ └──────────┬──────────┘ │ │ │ │ ┌──────────────┴──────────────┐ │ │ │ │ │ ▼ ▼ ▼ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ 辅助模块logger, namespace, registry, resource, rundll32, nci │ └─────────────────────────────────────────────────────────────────┘adapter.c调用driver.c安装驱动调用namespace获取互斥锁调用registry读取配置调用rundll32进行跨位数代理。session.c通过adapter.c打开设备对象执行 IOCTL 注册环形缓冲区。logger被所有模块使用。resource用于提取嵌入式二进制文件。nci模块负责修改网络连接名称NciSetConnectionName。六、总结本文作为 API 模块系列的首篇全面梳理了公共接口头文件wintun.h的函数声明与类型定义。内部关键数据结构WINTUN_ADAPTER、TUN_SESSION及其作用。项目构建配置的细节资源嵌入、延迟加载、自定义生成步骤。各模块间的依赖关系和调用层次。这些内容为后续深入分析适配器生命周期、数据路径和辅助机制提供了完整的上下文。在下一篇文章中我们将深入剖析adapter.c与driver.c揭示 Wintun 如何创建适配器、安装驱动并优雅地处理 Windows 7 兼容性与 WOW64 代理调用。

相关新闻

你还在手动粘贴请求头吗?Header Editor 让浏览器请求管理一步到位

你还在手动粘贴请求头吗?Header Editor 让浏览器请求管理一步到位

你还在手动粘贴请求头吗?Header Editor 让浏览器请求管理一步到位 【免费下载链接】HeaderEditor Manage browsers requests, include modify the request headers, response headers, response body, redirect requests, cancel requests 项目地址: https://gitc…

2026/8/27 8:58:52 阅读更多 →
AI Agent时代开发者如何平衡效率与代码品味:从Clawdbot引发的思考

AI Agent时代开发者如何平衡效率与代码品味:从Clawdbot引发的思考

1. 项目概述:Clawdbot引发的社区热议最近在开发者社区和技术论坛里,一个名为“Clawdbot”的项目讨论热度持续攀升。乍一看这个名字,可能会联想到某个具体的机器人或工具,但深入讨论的核心,早已超越了工具本身。社区里聊…

2026/8/21 1:33:54 阅读更多 →
Android应用签名信息查看与解析:从原理到实战排查

Android应用签名信息查看与解析:从原理到实战排查

1. 项目概述:为什么我们需要查看Android签名信息? 在Android开发与逆向分析的世界里,APK的签名信息就像一个人的身份证。它不仅是应用在Google Play上架、系统安装验证的“通行证”,更是开发者身份的唯一标识,以及应用…

2026/8/26 14:53:32 阅读更多 →

最新新闻

从数学建模经典赛题看线性规划与Lingo在资源配置优化中的应用

从数学建模经典赛题看线性规划与Lingo在资源配置优化中的应用

1. 项目概述:从一道经典赛题看数学建模的实战价值 看到“2006年高教社杯A题:出版社的资源配置模型”这个标题,很多参加过数学建模竞赛的朋友可能会心一笑。这确实是一道在圈内流传甚广的经典题目,它不像一些纯理论推导题那样高深莫…

2026/8/27 8:59:51 阅读更多 →
silk-v3-decoder:微信QQ语音 .aud / .slk 转 MP3,从单个文件到整个目录

silk-v3-decoder:微信QQ语音 .aud / .slk 转 MP3,从单个文件到整个目录

silk-v3-decoder:微信QQ语音 .aud / .slk 转 MP3,从单个文件到整个目录 【免费下载链接】silk-v3-decoder [Skype Silk Codec SDK]Decode silk v3 audio files (like wechat amr, aud files, qq slk files) and convert to other format (like mp3). Bat…

2026/8/27 8:59:51 阅读更多 →
Windows下PyTorch动态链接库初始化失败(Error 1114)的深度排查与解决

Windows下PyTorch动态链接库初始化失败(Error 1114)的深度排查与解决

1. 一个“动态链接库初始化失败”引发的深夜血案 昨晚十一点,项目进度卡在最后一步,就差一个模型推理验证。我像往常一样,在PyCharm里敲下 import torch ,准备迎接熟悉的“Hello PyTorch”时刻。结果,等来的不是那个…

2026/8/27 8:59:51 阅读更多 →
兴趣是最好的老师,HelloGitHub 让你对开源感兴趣!

兴趣是最好的老师,HelloGitHub 让你对开源感兴趣!

兴趣是最好的老师, 让你对开源感兴趣!简介分享 上有趣、入门级的开源项目。这里存在实战项目, 有着入门教程, 有黑科技, 有开源书籍, 还有大厂开源项目等等, 其涵盖了多种编程语言, 包括Java, 有Go, 也有C/C, 还有Swift等, 如此这般得以令你在短促时间以…

2026/8/27 8:59:51 阅读更多 →
不用AI是否构成过失?技术人面临的新责任边界

不用AI是否构成过失?技术人面临的新责任边界

AI 技术这几年发展太快,几乎每个行业都在谈“如何用 AI 提效”“如何拥抱 AI”。但真正落到工作场景中,不少人却陷入一种尴尬的处境:用了 AI,怕出错、怕泄密、怕被追责;不用 AI,又怕落后、怕效率低、怕被质…

2026/8/27 8:59:51 阅读更多 →
从傅里叶定律到有限差分法:多层热传导建模与MATLAB数值求解实战

从傅里叶定律到有限差分法:多层热传导建模与MATLAB数值求解实战

1. 项目概述:从一道赛题到一套完整的解决方案 2018年的“高教社杯”全国大学生数学建模竞赛A题“高温作业专用服装设计”,至今仍是许多数模爱好者和相关领域从业者津津乐道的经典案例。这道题之所以经典,不仅仅因为它贴近工程实际——为消防员…

2026/8/27 8:58:51 阅读更多 →

日新闻

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

1. 项目概述:从零构建一个企业级的AI服务网关 最近在帮一个做内容审核的团队做技术架构升级,他们原来的业务里,每天有几十万张图片和短视频需要过审,最初是接了几个开源的AI模型自己部署,但效果和性能一直不太稳定。后…

2026/8/27 0:00:51 阅读更多 →
网盘直链下载助手5分钟解析八大网盘真实地址

网盘直链下载助手5分钟解析八大网盘真实地址

网盘直链下载助手5分钟解析八大网盘真实地址 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / 迅雷云盘 / 夸…

2026/8/27 1:06:27 阅读更多 →
从零点亮 ESP32:Arduino ESP32 开发环境搭建与首次烧录完整指南

从零点亮 ESP32:Arduino ESP32 开发环境搭建与首次烧录完整指南

从零点亮 ESP32:Arduino ESP32 开发环境搭建与首次烧录完整指南 【免费下载链接】arduino-esp32 Arduino core for the ESP32 family of SoCs 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 Arduino ESP32 是乐鑫官方的 ESP32 系列 Ardui…

2026/8/27 1:06:27 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/26 14:45:33 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/26 17:46:43 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/26 14:46:37 阅读更多 →

月新闻

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

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

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

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

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

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

2026/8/26 17:46:39 阅读更多 →
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/26 1:24:05 阅读更多 →