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/10/29 4:31:22 阅读更多 →
AI Agent时代开发者如何平衡效率与代码品味:从Clawdbot引发的思考

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

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

2026/10/28 6:01:19 阅读更多 →
Android应用签名信息查看与解析:从原理到实战排查

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

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

2026/10/28 9:19:16 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/30 0:01:36 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/29 8:45:01 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/29 9:52:56 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/30 0:01:37 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/29 9:51:34 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/29 8:44:28 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/29 17:01:10 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/29 9:42:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/30 0:01:33 阅读更多 →