将Extern C转换为内联ASM

时间:2018-04-24 19:37:32

标签: c++ winapi assembly

我有一个C ++项目,它调用位于.asm(MASM)文件中的extern函数。有什么方法可以内联C ++文件中的MASM代码,而不必使用单独的.asm文件?

.asm文件

.data

.code

ZwReadVirtualMemory proc
    mov r10, rcx
    mov eax, 3Fh
    syscall
    ret
ZwReadVirtualMemory endp

end

这是C ++文件

#include "stdafx.h"
#include <Windows.h>
#include <iostream>

using namespace std;

extern "C" NTSTATUS ZwReadVirtualMemory(HANDLE hProcess, void* lpBaseAddress, void* lpBuffer, SIZE_T nSize, SIZE_T* lpNumberOfBytesRead = NULL);

int main() {

    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 14648);
    if (!hProcess)
        return EXIT_FAILURE;

    int intBuffer = 0;
    void* lpBaseAddress = 0;
    SIZE_T lpNumberOfBytesRead = 0;

    NTSTATUS status = ZwReadVirtualMemory(hProcess, (PVOID)0x10ad0000, &intBuffer, sizeof(int), &lpNumberOfBytesRead);

    cout << "ZwRVM returned " << dec << status << endl;
    cout << "intBuffer = " << dec << intBuffer << endl;
    cout << "lpNumberOfBytesRead = " << lpNumberOfBytesRead << endl;

    cin.get();
}

1 个答案:

答案 0 :(得分:0)

某些C / C ++编译器支持非标准内联汇编块asm__asm__。它们可用于将部分汇编代码合并到常规函数或方法中。

您的代码示例明确指出使用WinAPI(因此Windows作为目标平台)和Visual Studio作为编译器(stdafx.h是最不可移植的部分)。但是,Visual Studio 2010及更高版本的更新已停止支持64位目标的内联汇编:http://msdn.microsoft.com/en-us/library/4ks26t93%28VS.100%29.aspx

您的选择:

  1. 将MASM文件编译成单独的目标文件,稍后将其与程序的其余部分链接。

  2. 使用适用于Windows的英特尔编译器。它支持内联汇编程序,并且是Windows上Microsoft编译器的直接替代品,但我不知道需要多少额外的工作量。

  3. 汇编程序文件中唯一无法从C / C +直接访问的位是发出syscall机器指令。如果您找到MS VS支持的该指令的intrinsic函数,则可以使用它而不是内联汇编块。但是,我找不到一个here。英特尔的内在函数为no better