代码无法直接正确移植到x64,因为它将执行64位指针截断 - 有关详细信息,请参见下文 .

64位应用程序不支持将汇编语句与Pascal代码混合使用 . 使用Pascal代码或完全用汇编编写的函数替换汇编语句 .

这里使用装配是不必要的 . 我不确定为什么原作者会选择去解决这个问题 . 通过转换为Pascal来处理这些移植问题总是最好的,这样编译器就可以完成所有工作 .

您可以按以下方式编写代码:

type

TDllLoadInfo = record

Module: HMODULE;

EntryPoint: function(hinstDLL: HMODULE; fdwReason: DWORD;

lpvReserved: Pointer): BOOL; stdcall;

end;

TGetProcAddrExInfo = record

ExitThread: procedure(dwExitCode: DWORD); stdcall;

GetProcAddress: function(hModule: HMODULE;

lpProcName: PAnsiChar): Pointer; stdcall;

GetModuleHandle: function(lpModuleName: PWideChar): HMODULE; stdcall;

lpModuleName: PWideChar;

lpProcName: PAnsiChar;

end;

TInjectLibraryInfo = record

LoadLibrary: function(lpFileName: PWideChar): HMODULE; stdcall;

lpModuleName: PWideChar;

Sleep: procedure(dwMilliseconds: DWORD); stdcall;

end;

procedure DllEntryPoint(lpParameter: pointer); stdcall;

var

LoadInfo: ^TDllLoadInfo absolute lpParameter;

begin

LoadInfo.EntryPoint(LoadInfo.Module, DLL_PROCESS_ATTACH, nil);

end;

procedure GetProcAddrExThread(lpParameter: pointer); stdcall;

var

GetProcAddrExInfo: ^TGetProcAddrExInfo absolute lpParameter;

ModuleHandle: HMODULE;

ProcAddress: Pointer;

begin

ModuleHandle := GetProcAddrExInfo.GetModuleHandle(GetProcAddrExInfo.lpModuleName);

ProcAddress := GetProcAddrExInfo.GetProcAddress(ModuleHandle,

GetProcAddrExInfo.lpProcName);

GetProcAddrExInfo.ExitThread(DWORD(ProcAddress)); // !!!! x64 pointer truncation !!!!

end;

procedure InjectLibraryThread(lpParameter: Pointer); stdcall;

var

InjectLibraryInfo: ^TInjectLibraryInfo absolute lpParameter;

begin

InjectLibraryInfo.LoadLibrary(InjectLibraryInfo.lpModuleName);

while True do // rather pointless to loop ....

InjectLibraryInfo.Sleep(INFINITE);

end;

该代码假定您已经获得了 W 后缀Unicode API函数的函数指针 . 如果没有,则使用 PAnsiChar 而不是 PWideChar .

但是,在这一点上,我们需要评估并考虑我们刚刚做了什么 . 我们试图将64位指针推入32位 DWORD 线程退出代码 . 这不一定适合 . 如果库加载到4GB以上的地址,那么您将遭受指针截断 .

所以,这里的底线是你无法正确地将此代码移植到x64 . 您需要找到此代码的变体,该变体能够从线程返回64位值 . 但它必须以不同的方式这样做,因为你不能将64位值放入线程返回值 .

mupdf不支持x64_Delphi xe2使用x64编译器编译ASM代码时出错 . 不支持的语言功能:'ASM'...相关推荐

  1. php 编译mcrypt,centos 6下编译安装php时安装mcrypt支持库

    centos6本身不带mcrypt库的支持,手工编译php时,还需要先安装该库,这里有两个途径 1. 使用第三方源实现yum安装,推荐使用RPMforge,在centos下配置该yum源,配置后即可尝 ...

  2. 可以在线编译运行代码的网站(支持Python)

    推荐一个非常不错,可以在线编译.运行代码的网站https://www.dotcpp.com/run/ 同时支持C.C++.java.Python.php等语言,实时编译运行,非常方便

  3. 编译器编译报错时aka是什么意思?(also known as)

    今天编译代码的时候遇到个报错,遇到个报错,里面有个英文缩写aka,它其实时also known as的意思

  4. 编译linux内核适用的编译器,编译Linux内核时,CC,LD和CC [M]输出的代码是什么?...

    所以一般情况下,你只需要 git grep 'cmd.* = CODE' 找到CODE. 获取scripts/Makefile.build定义的所有代码 make | grep -E '^ ' | s ...

  5. ActionScript 3.0编译器编译错误大全【转】

    以下是编译器遇到无效代码时生成的编译错误列表.只有在严谨模式下编译代码时,才能检测到这些错误的子集.严谨模式添加了标准语言中没有的三种约束: 表达式有静态类型,且类型错误为验证错误. 附加验证规则捕获 ...

  6. ActionScript 3.0编译器编译错误大全

    以下是编译器遇到无效代码时生成的编译错误列表.只有在严谨模式下编译代码时,才能检测到这些错误的子集.严谨模式添加了标准语言中没有的三种约束: 表达式有静态类型,且类型错误为验证错误. 附加验证规则捕获 ...

  7. gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解

    例子:由多个源文件组成的C程序,经过编辑.预处理.编译.链接等阶段才能生成最终的可执行程序.此过程中,在__c__阶段可以发现被调用的函数未定义. A. 编辑和预处理 B. 预处理 C. 编译 D. ...

  8. c语言转汇编编译器,【转】C语言内嵌汇编(asm)

    TIPS:在编译过程汇中,汇编代码块是原封不动地送到汇编语言编译阶段的. 一.为什么会用到汇编? 1.为了提高速度和效率.不过这种情况很少了,现在C/C++编译器的优化很厉害了. 2.为了实现某些C语 ...

  9. Visual C++利用Intel C++ 编译器提升多核性能与多媒体指令支持获取更高的程序效率与缩小程序体积

    Intel c++编译器有下列优点,建议VC++项目开发采用intel c++编译器取代VS自带c++编译器: 与 Microsoft Visual C++ 相兼容,可以嵌入 Microsoft Vi ...

最新文章

  1. RS2008中控件ID冲突问题
  2. rpm安装两个mysql_MySQL通过rpm安装及其单机多实例部署
  3. 网络原理题+复习资料
  4. bootstrap datetimepicker、bootstrap datepicker日期组件对范围的简单封装
  5. GitHub标星3.6k | 给AI一张高清照片,分分钟还你3D人体模型
  6. php 全局变量能定义数组吗,php数组声明、遍历、数组全局变量使用小结
  7. Linux下逻辑卷LVM的管理和RAID磁盘阵列
  8. java学习,不定期更新~
  9. mysql truncate很慢_mysql truncate 的问题
  10. 编写一个java程序在屏幕上输出,编写一个Java程序在屏幕上输出“This is java!”。...
  11. 近世代数——Part2 群:基础与子群 课后习题
  12. 通过在群晖上安装虚拟机,实现群晖与115网盘的双向同步
  13. WordPress中导入图片模糊
  14. XPS是什么格式?如何免费转换为word?
  15. Java成员变量、局部变量的默认值和初始化
  16. 加州大学戴维斯计算机博士生,关于加州大学戴维斯分校博士研究生CSC奖学金信息分享会的通知...
  17. PowerVR SGX
  18. 什么是 DOORS?
  19. 我的世界java版变形模组下载_我的世界变形模组
  20. Python 取模运算(取余)%误区及详解

热门文章

  1. 小谈c#数据库存取图片的方式
  2. UESTC 1636 梦后楼台高锁,酒醒帘幕低垂
  3. 关于jedis2.4以上版本的连接池配置,及工具类
  4. J2SE J2EE J2ME的区别
  5. SAP Study Notes: BW Queriy-Variables(变量)
  6. C++11多线程----线程管理
  7. bind简单转发实验
  8. 误删了公司数据库,但我还是活下来了
  9. Java5线程并发库之LOCK(锁)CONDITION(条件)实现线程同步通信
  10. java中重载和重写