我该如何解决(“函数调用中的参数太少”)?

时间:2014-10-10 14:30:40

标签: c++ .net

这是来源的一部分:

#include <stdio.h>
#include <Windows.h>
#include <iostream>
#include <ctime>
#include <cstdlib>
#define WPM(x,y,z,l)    WriteProcessMemory((HANDLE)x, (LPVOID)y, (LPCVOID)z, l, NULL)
#define WNOP(x,y,l)     for(int n=0; n<l; n++)WriteProcessMemory((HANDLE)((char*)x + n), (LPVOID)y, "\x90", 1);

bool salir = false;

void DisableACI(const HANDLE hProcess = NULL)
{
    WNOP(hProcess, 0x1000DDC4, 0x49);
    WPM(hProcess, 0x10004D20, "\xB0\x00\xC3", 3);
    WNOP(hProcess, 0x1000DDCB, 7);
    WPM(hProcess, 0x420AB0, "\xB8\x58\x10\x00\x00", 5);
    WPM(hProcess, 0x10004FF0, "\xC3", 1);
    WNOP(hProcess, 0x4AFF59, 6);
}

我得到了这个错误:
智能感知:函数调用中少数参数 &#39; WriteProcessMemory的&#39; :function不接受 4 参数。

2 个答案:

答案 0 :(得分:2)

如果你得到错误“函数调用中的参数太少”,解决这个问题的方法是将更多参数传递给你的函数调用。

参数的类型应该与函数调用所期望的参数匹配。

如果代码正在做什么被宏遮挡,请尝试将标志传递给编译器以扩展所述宏并编译生成的源,或者只是手动展开它们并检查生成的源。

编写使用这种宏的代码并不是一个好主意。删除宏,直接调用该函数。然后检查签名到WriteProcessMemory

在宏中放置一个非平凡的for循环是一个可怕的想法。它使您的代码难以调试或理解。停止。

如果需要对函数进行一些处理,请编写一个包装函数。在99%以上的情况下,包装函数将更易于阅读,更容易理解错误消息,并且如果您使用inline和/或在调用时可以看到定义,则不会让您获得任何性能站点。

所以删除这两个宏:

#define WPM(x,y,z,l)    WriteProcessMemory((HANDLE)x, (LPVOID)y, (LPCVOID)z, l, NULL)
#define WNOP(x,y,l)     for(int n=0; n<l; n++)WriteProcessMemory((HANDLE)((char*)x + n), (LPVOID)y, "\x90", 1);

并编写一些函数:

BOOL WPM(HANDLE x, void* y, void const* z, SIZE_T l) {
  return WriteProcessMemory(x, y, z, l, NULL);
}
BOOL WNOP(HANDLE x,void* y, SIZE_T l) {
  BOOL all_worked = TRUE;
  for(int n=0; n<l; n++) {
    all_worked = WriteProcessMemory((HANDLE)((char*)x + n), y, "\x90", 1) && all_worked;
  }
  return all_worked;
}

此时错误的位置变得明显。您可能必须对您的值进行强制转换,因为它们与它们应该匹配的类型不匹配,但强制转换不应隐藏在宏后面。

完成这些演员表后,修复变得显而易见:

BOOL WNOP(HANDLE x,void* y, SIZE_T l) {
  BOOL all_worked = TRUE;
  for(int n=0; n<l; n++) {
    all_worked = WriteProcessMemory((HANDLE)((char*)x + n), y, "\x90", 1, NULL) && all_worked;
  }
  return all_worked;
}

虽然这个编译,但它仍然充满了问题。除了快速阅读其文档及其名称之外,我对WriteProcessMemory不熟悉。它的名字表明,如果你是一位经验丰富的程序员,那么你应该只是打电话给他们。#34;没有足够的论据&#34;不是你在Stack Overflow上问的问题:在你理解基本的C ++之前不要写其他进程。网页表明你的论点非常奇怪,至少据我所知。

句柄应该是PROCESS的句柄,指针值y应该是来自其空间的值。 WNOP似乎没有做任何合理的事情。

WNOP除了'\x90'之外什么都没有写,这看起来很奇怪。

修复了您的函数版本:

// Intended to be called with `"a string"` in `string_to_write`:
template<unsigned N>
BOOL WPM(HANDLE process, void* address_in_process, char const(&string_to_write)[N]) {
  // -1 to skip the `'\0'`.
  ASSERT( string_to_write[N-1] == '\0' );
  return WriteProcessMemory(process, address_in_process, &string_to_write[0], N-1, NULL);
}
// does something!
BOOL WNOP(HANDLE process,void* address_in_process, char char_to_write, SIZE_T copies_to_write) {
  BOOL all_worked = TRUE;
  for(int n=0; n<l; n++) {
    char* write_target = reinterpret_cast<char*>(address_in_process) + n;
    all_worked = WriteProcessMemory(process, write_target, &char_to_write, 1) && all_worked;
  }
  return all_worked;
}

void DisableACI(const HANDLE hProcess)
{
  WNOP(hProcess, (void*)0x1000DDC4, '\x90', 0x49);
  WPM (hProcess, (void*)0x10004D20, "\xB0\x00\xC3");
  WNOP(hProcess, (void*)0x1000DDCB, '\x90', 7);
  WPM (hProcess, (void*)0x00420AB0, "\xB8\x58\x10\x00\x00");
  WPM (hProcess, (void*)0x10004FF0, "\xC3" );
  WNOP(hProcess, (void*)0x004AFF59, '\x90', 6);
}

请注意,将hProcess设为默认值NULL似乎也是一个可怕的想法?

答案 1 :(得分:0)

你错过了最后一个参数(NULL):

WriteProcessMemory((HANDLE)((char*)x + n), (LPVOID)y, "\x90", 1);