32位到16位调用的Thunk层及驱动DLL定时器使用
32位到16位调用的Thunk层
在进行32位到16位的调用时,参数转换完成后,从32位到16位的切换通过如下代码实现:
call dword ptr [pfnQT_Thunk_X2to16]这个通过函数指针表的调用最终会调用一个未公开的KERNEL32函数QT_Thunk。QT_Thunk会接收真实16位DLL中DLL16Foo函数的16:16地址,它负责从32位栈切换到16位栈,然后跳转到真实16位DLL中DLL16Foo函数的16:16地址。
函数指针表的初始化过程较为复杂。简单来说,32位DLL必须在其DllMain中调用一个特殊的初始化函数ThunkConnect32。该函数由Thunk编译器生成,它通过用16位DLL每个导出函数的16:16地址初始化表,将32位DLL与16位DLL“连接”起来。这些地址直到运行时16位DLL加载后才可知,ThunkConnect32会使用另一个未公开的KERNEL32函数Connect32来获取这些16:16地址。
创建Thunk层的步骤
创建Thunk DLL需要遵循以下步骤:
1. 修改16位DLL的头文件,创建包含每个导出函数参数输入、输出和输入输