尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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 代理调用。
RELATED

相关推荐

你还在手动粘贴请求头吗?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/7 8:12:12
5 分钟跑通全平台弹幕抓取:BarrageGrab 实战上手全记录

5 分钟跑通全平台弹幕抓取:BarrageGrab 实战上手全记录

5 分钟跑通全平台弹幕抓取:BarrageGrab 实战上手全记录 【免费下载链接】BarrageGrab 抖音快手bilibili直播弹幕wss直连,非系统代理方式,无需多开浏览器窗口 项目地址: https://gitcode.com/gh_mirrors/ba/BarrageGrab 做直播带货、游…

📅 2026/10/6 0:28:42
DHCP协议DORA四步流程详解:从地址分配到租期管理与实战配置

DHCP协议DORA四步流程详解:从地址分配到租期管理与实战配置

1. 项目概述:DHCP,网络世界的“自动派件员” 如果你刚接触网络管理,或者对电脑、手机为什么一连接Wi-Fi就能上网感到好奇,那么“DHCP”这个词你一定绕不开。它就像我们小区里那个默默无闻却又至关重要的快递驿站,负责给…

📅 2026/9/17 15:40:59
MORE NEWS

更多资讯

📰

SpringBoot集成AI服务与MCP动态管理实践

1. 项目背景与核心价值在当下企业级应用开发中,SpringBoot已经成为Java生态中构建微服务的首选框架。而随着AI能力的普及,如何在SpringBoot应用中高效集成AI服务成为开发者面临的新课题。最近我在一个金融风控项目中,需要实现SpringBoot应用与…

📰

树莓派C++部署YOLOv5-Lite:Qt+OpenCV+NCNN实战

简介:这份资源面向嵌入式开发与计算机视觉方向的开发者,提供在树莓派上基于Qt、OpenCV与C部署YOLOv5-Lite深度学习推理的完整工程实践。内容围绕边缘计算场景展开,涵盖Qt图形界面搭建、OpenCV图像预处理、C模型加载与结果解析,以及…

📰

WhoDB Agent Hooks 全解析:为 AI 编码助手构建自动格式化、代码生成与构建验证钩子体系

数据库客户端后端前端CLI桌面应用数据可视化AI 应用 【免费下载链接】whodb Where data access meets operational intelligence 项目地址: https://gitcode.com/gh_mirrors/wh/whodb 点击查看 免费下载 本文深入剖析 WhoDB 开源仓库中的 .agents/hooks 钩子基础设…

📰

打卡记忆单词法:告别死记硬背,让孩子爱上英语学习

在孩子的英语学习过程中,单词记忆无疑是一个老大难问题。许多家长和学生都陷入了“背了忘、忘了背”的恶性循环。今天,我就来和大家分享一下“打卡记忆单词法”,希望能帮助大家告别死记硬背,让孩子爱上英语学习。 一、打卡记忆单词…

📰

SnackBar队列机制揭秘:为何始终只显示一条消息?3个Queue设计原理解析

移动开发UI库/组件 【免费下载链接】SnackBar toast-like alert pattern for Android inspired by the Google Material Design Spec 项目地址: https://gitcode.com/gh_mirrors/sna/SnackBar 点击查看 免费下载 SnackBar 是一个受 Google Material Design 规范启发…

📰

Flutter三方库鸿蒙化适配实践:lzma压缩库迁移全记录

最近这两周,我几乎把所有精力都花在一个看起来并不复杂的任务上:把一个 Flutter 老项目里使用的 lzma 压缩库,适配到鸿蒙化环境里。说句实话,一开始我以为这只是“换个平台目录、重新编译一下”的事,结果从原生层封装到…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬