使用VSCode+MinGW开发C项目时找不到winternl.h头文件的问题
winternl.h的问题 嘿,这个问题我之前也碰到过,来给你拆解下根源和可行的解决办法:
为啥MinGW不支持winternl.h?
winternl.h是微软自家的内部私有头文件,里面封装的是Windows NT内核层面的半公开/未公开API声明——这些接口并没有被纳入Windows官方公开的SDK标准范畴。MinGW作为开源的跨平台编译工具链,只会实现Windows公开的、标准化的API(比如Windows.h里的内容),不会碰这种微软没对外正式开放的内部文件。毕竟这些内部接口随时可能变动,微软也不保证向后兼容,开源社区自然不会去维护这种不稳定的依赖。
可行的解决方案
如果你确实需要用到里面的NT函数,可以试试这几个方案:
手动声明所需的函数和结构体
不用依赖头文件,直接在代码里定义你要用到的函数原型、结构体和常量就行。举个例子,如果你要调用NtQueryInformationProcess,可以这么写:#include <Windows.h> // 定义函数指针类型 typedef NTSTATUS(NTAPI* pNtQueryInformationProcess)( HANDLE ProcessHandle, PROCESSINFOCLASS ProcessInformationClass, PVOID ProcessInformation, ULONG ProcessInformationLength, PULONG ReturnLength ); int main() { // 从ntdll.dll中加载函数 HANDLE hNtdll = LoadLibraryA("ntdll.dll"); if (hNtdll) { pNtQueryInformationProcess NtQueryInfoProc = (pNtQueryInformationProcess)GetProcAddress(hNtdll, "NtQueryInformationProcess"); // 拿到函数地址后即可正常调用 // ...你的业务代码... FreeLibrary(hNtdll); } return 0; }提醒一句:这些内部函数的参数和行为可能随Windows版本变动,使用时一定要多做兼容性测试。
尝试MinGW-w64的第三方兼容实现
部分MinGW-w64的发行版(比如MSYS2仓库里的版本)可能有社区维护的winternl.h兼容文件,你可以检查下自己的MinGW-w64安装目录里有没有,或者升级到最新版试试。不过要注意,这些都是基于逆向信息做的非官方实现,稳定性没法和微软官方文件比。优先使用公开API替代
如果能绕开的话,尽量用Windows公开的Win32 API来实现相同功能。很多NT内部函数的功能都有对应的公开接口,这样写出来的代码兼容性和稳定性都会好很多,也不用纠结头文件的问题。
最后提个醒
直接使用NT内部API的代码,在不同Windows版本上很可能出现兼容性问题,微软随时可能修改这些接口且不提前通知。而且MinGW官方永远不会把winternl.h纳入标准安装包,别指望以后会自动支持。
内容的提问来源于stack exchange,提问作者Trigosin Darom

