目录
过程
第一次尝试在ChatGPT指导使用node 可以通过ffi-napi 和ref-napi调用wintun.dll接口。
参照说明文档,大部分接口都报错因为参数类型声明不对,修改后基本的ok。但是我在WintunGetAdapterLuid 中遇到了另外一个错误:
...\node_modules\ffi-napi\lib\dynamic_library.js:113
throw new Error('Dynamic Symbol Retrieval Error: ' + this.error());
^
Error: Dynamic Symbol Retrieval Error: Win32 error 127
at DynamicLibrary.get (C:\Users\lwb6\Documents\git\nodejs_tun\node_modules\ffi-napi\lib\dynamic_library.js:113:11)
at C:\Users\lwb6\Documents\git\nodejs_tun\node_modules\ffi-napi\lib\library.js:55:21
at Array.forEach (<anonymous>)
at Object.Library (C:\Users\lwb6\Documents\git\nodejs_tun\node_modules\ffi-napi\lib\library.js:52:28)
at Object.<anonymous> (C:\Users\lwb6\Documents\git\nodejs_tun\tun_test.js:31:20)
at Module._compile (node:internal/modules/cjs/loader:1103:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1155:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12)
win 127 错误码
官方文档
微软的文档如下:
127 (0x7F) 127(0x7F)
The specified procedure could not be found.
找不到指定的过程。
一开始还以为是参数写错了,改了又改,依然报错。
社区牛逼
当我开始怀疑人生时,直接搜索了报错内容,找到的帖子LoadLibrary() error code 127:
该错误消息意味着已找到该 dll,但缺少所需的函数。
由于WintunGetAdapterLuid 这个函数名是从说明文档里面复制的,我开始猜测难道是这个dll,里面少了一个接口?
但是按照wintun.h,按道理应该是有的才对。
typedef VOID(WINAPI WINTUN_GET_ADAPTER_LUID_FUNC)(_In_ WINTUN_ADAPTER_HANDLE Adapter, _Out_ NET_LUID *Luid);
例如在example.c中,是有的啊:
MIB_UNICASTIPADDRESS_ROW AddressRow;
InitializeUnicastIpAddressEntry(&AddressRow);
WintunGetAdapterLUID(Adapter, &AddressRow.InterfaceLuid);
我甚至还对比了下命名,直到我乱纪乱投医,我把Luid改成大写。靠居然可以了
// WINTUN_OPEN_ADAPTER_FUNC WintunOpenAdapter
// WINTUN_GET_ADAPTER_LUID_FUNC WintunGetAdapterLuid
回顾
事后复盘:
0. 文档接口名与实际接口名不一致,最初原因。或许参考example.c则会避开这个错误。
- 错误码理解不到位,第一次尝试,完全没有概念。一开始猜测的方向错了,以为是参数类型错误,从未想过函数名问题。
- wintun.h 是 example.c在引入的,随后就声明了函数名。这点在复盘是才发现的。
static WINTUN_GET_ADAPTER_LUID_FUNC *WintunGetAdapterLUID;
- example.c 中的调用接口名用的就是 WintunGetAdapterLUID。同样在复盘是才发现。