Delphi xe2使用x64编译器编译ASM代码时出错.不支持的语言功能:'ASM'

Mik*_*ord 0 delphi 64-bit assembly

正如标题所说我在使用包含ASM代码的x64编译器编译Delphi XE2项目时遇到了问题.当我尝试编译它时,我收到错误"不支持的语言功能:'ASM'".

我试图从包含ASM代码的过程中删除delphi代码然后我得到"操作码和操作数的无效组合".

这是代码的一部分..

type
  TDllLoadInfo = record
    Module: pointer;
    EntryPoint: pointer;
  end;

  TGetProcAddrExInfo = record
    pExitThread: pointer;
    pGetProcAddress: pointer;
    pGetModuleHandle: pointer;
    lpModuleName: pointer;
    lpProcName: pointer;
  end;

  TInjectLibraryInfo = record
    pLoadLibrary: pointer;
    lpModuleName: pointer;
    pSleep: pointer;
  end;



procedure DllEntryPoint(lpParameter: pointer); stdcall;
var
  LoadInfo: TDllLoadInfo;
begin
  LoadInfo := TDllLoadInfo(lpParameter^);
  asm
    xor eax, eax
    push eax
    push DLL_PROCESS_ATTACH
    push LoadInfo.Module
    call LoadInfo.EntryPoint
  end;
end;

procedure GetProcAddrExThread(lpParameter: pointer); stdcall;
var
  GetProcAddrExInfo: TGetProcAddrExInfo;
begin
  GetProcAddrExInfo := TGetProcAddrExInfo(lpParameter^);
  asm
    push GetProcAddrExInfo.lpModuleName
    call GetProcAddrExInfo.pGetModuleHandle
    push GetProcAddrExInfo.lpProcName
    push eax
    call GetProcAddrExInfo.pGetProcAddress
    push eax
    call GetProcAddrExInfo.pExitThread
  end;
end;



procedure InjectLibraryThread(lpParameter: pointer); stdcall;
var
  InjectLibraryInfo: TInjectLibraryInfo;
begin
  InjectLibraryInfo := TInjectLibraryInfo(lpParameter^);
  asm
    push InjectLibraryInfo.lpModuleName
    call InjectLibraryInfo.pLoadLibrary
    @noret:
    mov eax, $FFFFFFFF
    push eax
    call InjectLibraryInfo.pSleep
    jmp @noret
  end;
end;
Run Code Online (Sandbox Code Playgroud)

有没有办法编译这个项目而不会出现任何错误或将asm代码转换为delphi/pascal?谢谢你的时间.顺便说一句,我不知道ASM.

Rem*_*eau 8

不能在64位的非汇编过程中使用内联汇编,只能在32位中使用.Embarcadero的文档中明确说明了这一点:

将32位Delphi应用程序转换为64位Windows | 内联汇编代码

如果您的应用程序包含内联汇编(ASM)代码,则需要检查ASM代码并进行以下更改:

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

在您的示例中,没有理由使用内联汇编.您可以(并且应该)使用纯Pascal代码来支持32位和64位:

type
  TDllEntryPointFunc = function(hinstDLL: HINSTANCE; fdwReason: DWORD; lpvReserved: Pointer): BOOL; stdcall;
  TGetModuleHandleFunc = function(const lpModuleName: PChar): HMODULE; stdcall;
  TGetProcAddressFunc = function(hModule: HMODULE; lpProcName: PAnsiChar): Pointer; stdcall;
  TExitThreadFunc = procedure(dwExitCode: DWORD); stdcall;
  TLoadLibraryFunc = function(const lpFileName: PChar): HMODULE; stdcall;
  TSleepFunc = procedure(dwMilliseconds: DWORD); stdcall;

procedure DllEntryPoint(lpParameter: Pointer); stdcall;
var
  LoadInfo: TDllLoadInfo;
  pEntryPoint: TDllEntryPointFunc;
begin
  LoadInfo := TDllLoadInfo(lpParameter^);
  @pEntryPoint := LoadInfo.EntryPoint;
  pEntryPoint(LoadInfo.Module, DLL_PROCESS_ATTACH, nil);
end;

procedure GetProcAddrExThread(lpParameter: Pointer); stdcall;
var
  GetProcAddrExInfo: TGetProcAddrExInfo;
  pGetModuleHandle: TGetModuleHandleFunc;
  pGetProcAddress: TGetProcAddressFunc;
  pExitThread: TExitThreadFunc;
  Module: HMODULE;
  Proc: Pointer;
begin
  GetProcAddrExInfo := TGetProcAddrExInfo(lpParameter^);
  @pGetModuleHandle := GetProcAddrExInfo.pGetModuleHandle;
  @pGetProcAddress := GetProcAddrExInfo.pGetProcAddress;
  @pExitThread := GetProcAddrExInfo.pExitThread;

  Module := pGetModuleHandle(PChar(GetProcAddrExInfo.lpModuleName));
  Proc := pGetProcAddress(Module, PAnsiChar(GetProcAddrExInfo.lpProcName));
  pExitThread(DWORD(Proc));
end;

procedure InjectLibraryThread(lpParameter: Pointer); stdcall;
var
  InjectLibraryInfo: TInjectLibraryInfo;
  pLoadLibrary: TLoadLibraryFunc;
  pSleep: TSleepFunc;
begin
  InjectLibraryInfo := TInjectLibraryInfo(lpParameter^);
  @pLoadLibrary := InjectLibraryInfo.pLoadLibrary;
  @pSleep := InjectLibraryInfo.pSleep;

  pLoadLibrary(PChar(InjectLibraryInfo.lpModuleName));
  repeat
    pSleep(-1);
  until False;
end;
Run Code Online (Sandbox Code Playgroud)