【问题标题】:Passing a function and its size to WriteFile将函数及其大小传递给 WriteFile
【发布时间】:2015-09-24 07:07:40
【问题描述】:

作为学习练习,我正在编写一个在运行时输出 DLL 的程序。

我已经编写了PE头,并且已经成功地将DOS头、NT头、可选节头和.text节头写入使用WriteFile的文件,例如:

WriteFile(hFile, &nt_header, sizeof(nt_header), &written, NULL);

我现在想在.text 部分添加一些代码,但我不知道如何将函数及其大小传递给WriteFile,例如:

static int test(void)
{
    return 10;
}

WriteFile 的第二个参数类型为LPCVOID。我尝试传入test,但只写了1个字节。传递一个指向test 的指针,按预期写入了 4 个字节。

这可能很明显,但我不明白我哪里出错了。

【问题讨论】:

  • 为什么(匿名)投反对票?我不是专家!

标签: c function writefile


【解决方案1】:

这很明显,但答案可能不是您想要的。做不到,至少不能移植。

C 中的函数没有大小。您也不能假设“函数地址”的概念意味着“函数编译代码中第一条机器指令的地址”。

简而言之,你所做的事情在 C 的那个级别是不可能的,你不能直接对函数进行 I/O。

【讨论】:

  • 在我看来是对的,但并不完全正确。您可以通过简单的解决方法来确定函数的大小,例如:在要调整大小的函数之前和之后定义虚拟函数。
  • 啊,我每天都学到新东西。我只想在编译器级别做什么?
  • @LPs 请指出标准中的文本,它说源中相邻的函数在编译后在内存中相邻。
  • AFAIK,至少,如果你编译位置无关代码函数将是相邻的。顺便说一句,有很多方法可以做到这一点,例如使用链接器脚本来确保这一点。
  • @LPs:这可能仍然需要大量支持代码。我假设您可以轻松地忽略“OP 的函数可能是内联的”,但是使用 printf 的函数呢?我同意 unwind,C 不应该 支持这一点。你不能随便写出内存的任何部分并期望它是一个有效的程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
相关资源
最近更新 更多