发布时间:2026/7/30 2:17:06
记一次符号类型不一致导致的链接错误 记一次符号类型不一致导致的链接错误两个头文件在WDK中有两个头文件ntddk.h:包含 wdm.h传统的 NT 架构驱动非即插即用ntifs.h:包含 ntddk.h 和 wdm.h文件系统驱动、文件系统过滤驱动由于 ntifs.h 已经包含了 ntddk.h只需包含 ntifs.h 即可。同时包含两者可能导致类型重定义等编译错误。报错信息IoCtlHandler.obj : error LNK2019: 无法解析的外部符号 “public: static long __cdecl HelpTool::GetEprocess(void *,struct _EPROCESS * *)” (?GetEprocessHelpToolSAJPEAXPEAPEAU_EPROCESSZ)函数 “long __cdecl ProtectProcess(void *)” (?ProtectProcessYAJPEAXZ) 中引用了该符号符号类型不一致我的源代码中分别引用了上面的两个头文件。Windows WDK 头文件如 wdm.h / ntifs.h中的 PEPROCESS 定义会根据预处理器宏尤其是NT_KERNEL或 _KERNEL_MODE来决定到底是引用 _EPROCESS 还是 _KPROCESS。检查HelpTool.obj中导出的符号发现dumpbin /SYMBOLS .\HelpTool.obj Microsoft (R) COFF/PE Dumper Version 14.51.36252.0 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file .\HelpTool.obj File Type: COFF OBJECT COFF SYMBOL TABLE 000 01058D9C ABS notype Static | comp.id 001 C0010990 ABS notype Static | feat.00 002 00000000 SECT1 notype Static | .drectve Section length 2F, #relocs 0, #linenums 0, checksum 0 004 00000000 SECT2 notype Static | .debug$S Section length 2028, #relocs 0, #linenums 0, checksum 0 006 00000000 SECT3 notype Static | .bss Section length 1, #relocs 0, #linenums 0, checksum 0, selection 2 (pick any) 008 00000000 SECT3 notype External | ExPoolZeroingNativelySupported 009 00000000 SECT4 notype Static | .text$mn Section length 62, #relocs 3, #linenums 0, checksum 4519E64B, selection 1 (pick no duplicates) 00B 00000000 SECT5 notype Static | .debug$S Section length 144, #relocs 8, #linenums 0, checksum 0, selection 5 (pick associative Section 0x4) 00D 00000000 UNDEF notype External | __imp_DbgPrintEx 00E 00000000 UNDEF notype External | __imp_PsLookupProcessByProcessId 00F 00000000 SECT4 notype () External | ?GetEprocessHelpToolSAJPEAXPEAPEAU_KPROCESSZ (public: static long __cdecl HelpTool::GetEprocess(void *,struct _KPROCESS * *)) 010 00000000 SECT4 notype Label | $LN6 011 00000000 SECT6 notype Static | .xdata Section length C, #relocs 0, #linenums 0, checksum B9123A2D, selection 5 (pick associative Section 0x4) 013 00000000 SECT6 notype Static | $unwind$?GetEprocessHelpToolSAJPEAXPEAPEAU_KPROCESSZ 014 00000000 SECT7 notype Static | .pdata Section length C, #relocs 3, #linenums 0, checksum 92CEA7C6, selection 5 (pick associative Section 0x4) 016 00000000 SECT7 notype Static | $pdata$?GetEprocessHelpToolSAJPEAXPEAPEAU_KPROCESSZ 017 00000000 SECT8 notype Static | .text$s Section length 39, #relocs 0, #linenums 0, checksum 81C4C899, selection 2 (pick any) 019 00000000 SECT8 notype External | ??_C_0DJKDOKOJHK?$FLProtectMyProcess?3?3HelpTool?$FN?3?5GeFNODOBFM ( ?? ?? ::FNODOBFM::string) 01A 00000000 SECT9 notype Static | .debug$S Section length 3C, #relocs 2, #linenums 0, checksum 0, selection 5 (pick associative Section 0x3) 01C 00000000 SECTA notype Static | .debug$T Section length 7C, #relocs 0, #linenums 0, checksum 0 01E 00000000 SECTB notype Static | .chks64 Section length 58, #relocs 0, #linenums 0, checksum 0 String Table Size 0x145 bytes Summary 1 .bss 58 .chks64 21A8 .debug$S 7C .debug$T 2F .drectve C .pdata 62 .text$mn 39 .text$s C .xdata对比两个编译单元看到的函数签名IoCtlHandler.cpp报错方 期望的符号是GetEprocessHelpToolSAJPEAXPEAPEAU**_EPROCESS**Z参数为 struct _EPROCESS **HelpTool.obj导出的符号是?GetEprocessHelpToolSAJPEAXPEAPEAU**_KPROCESS**Z参数为 struct _KPROCESS **在编译 HelpTool.cpp 时编译器认为 PEPROCESS 是 struct _KPROCESS *而在编译 IoCtlHandler.cpp 时PEPROCESS 被解析为 struct _EPROCESS *。解决方案我把参数中的peprocess改为了pvoid类型反正eprocess在内核驱动开发中就是一个不透明的数据结构最终都是要使用基址偏移的方式访问其中的字段索性让它直接为pvoid类型。

相关新闻

2026/7/30 2:12:05

中职计算机教资面试备考:从技术到教学的实战策略

1. 从“杂乱无章”到“有的放矢”:我的中职计算机教资面试备考心路看到这个标题,你可能会心一笑。没错,这就是我备考时的真实写照:教材、真题、网课笔记、自己总结的要点,各种资料堆满了书桌和电脑桌面,感觉…

2026/7/30 2:12:05

如何永久免费激活IDM:3种简单方法完整指南

如何永久免费激活IDM:3种简单方法完整指南 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 还在为Internet Download Manager的试用期到期而烦恼吗&am…

2026/7/30 2:12:05

SpringBoot非遗文化平台开发实践与架构设计

1. 项目概述:非遗文化数字化传承的创新实践全国非物质文化遗产展示平台系统是一个典型的Java Web应用开发项目,采用当前主流的SpringBoot框架构建。这个毕设选题瞄准了传统文化保护与互联网技术融合的创新方向,通过数字化手段解决非遗项目展示…

2026/7/30 3:27:10

【无标题】离线python310怎么配置

先进入项目目录,激活虚拟环境,执行下载命令,所有依赖包自动保存到packages文件夹 这个怎么操作完整步骤生成 requirements.txt(必须在本地项目的虚拟环境内执行!)1、打开 CMD,进入你的项目根目录…

2026/7/30 3:27:10

Wireshark网络协议分析入门:从抓包到TCP/HTTP/DNS深度解析

1. 项目概述:从“抓包”到“读心”的计算机网络入门如果你是一名计算机或相关专业的学生,第一次拿到《计算机网络》实验课的指导书,看到“实验一:网络协议分析”或者类似的标题时,心里可能会有点发怵。那些在课本上看起…

2026/7/30 3:27:10

OpenClaw框架Token性能优化实战与最佳实践

1. OpenClaw Token优化实战概述在分布式系统开发中,Token管理一直是影响系统性能的关键因素。最近我在优化一个基于OpenClaw框架的中型项目时,发现Token相关的上下文切换消耗了系统近30%的资源。经过两周的深度调优,最终将这部分开销降低了76…

2026/7/30 3:27:10

TypeScript 7.0 Go语言重写编译器:10倍性能提升架构解析

最近在 TypeScript 社区中,关于编译器性能的讨论热度持续攀升。随着项目规模不断扩大,原有的 TypeScript 编译器在大型代码库中的编译速度逐渐成为开发效率的瓶颈。本文将深入探讨 TypeScript 7.0 中采用 Go 语言重写编译器的技术架构变革,解…

2026/7/30 3:22:10

SpringBoot快速入门:从项目创建到RESTful API实战详解

1. 项目概述:为什么SpringBoot是Java开发的“瑞士军刀”? 如果你刚接触Java后端开发,或者是从传统的Spring MVC项目转过来,第一次听说SpringBoot,可能会有点懵。Spring框架本身已经够复杂了,怎么又冒出来一…

2026/7/29 22:32:30

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

一、背景与测试方案 在实际项目交付中,PDF文件合并与版权保护水印的叠加是一个高频但容易被低估的技术需求。典型的处理链路涉及:多源PDF的文件流合并、页面级水印渲染(含透明度混合与图层叠加)、输出文件体积控制。看似简单的操作…

2026/7/30 0:01:39

[GESP202606 四级] 扫雷

B4557 [GESP202606 四级] 扫雷 https://www.luogu.com.cn/problem/B4557 中国计算机学会(CCF)2026年6月C四级讲解——扫雷 https://www.bilibili.com/video/BV1MCMg6AEXR/ B4557 [GESP202606 四级] 扫雷 https://www.bilibili.com/video/BV1ZKTj6ZEVh/ 2…

2026/7/30 0:01:39

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/29 13:12:43

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…