This question already exists:
SIGSEV at while loop [closed]
                        
                                4年前关闭。
            
                    
我的问题是以下。我有2个函数,一个函数调用WriteProcessMemory并返回其结果,另一个函数将缓冲区发送到第一个函数。

如果我将静态变量作为缓冲区从第二个发送到第一个,则没问题,反之亦然。

这是第一个的来源:

void WriteMem(LPVOID addr, LPCVOID *buffer,size_t size){

int i = WriteProcessMemory(hProc, addr, buffer, size, NULL);

    if(i)
        printf("Success\n");
    else
        printf("Fail\n");

}


第二个来源:

分段故障:

void EditCards(BYTE victim){

BYTE cardsDrawn = 23;
puts("Choose the cards:");
scanf("%hhu",&cardsDrawn);

if(cardsDrawn > 40)
    cardsDrawn = 40;

cardsDrawn = 40 - cardsDrawn;//If the enemy has 5 cards then 45 have been drawn :P

WriteMem( victim ? Y_ENEMY_CARDS : Y_PLAYER_CARDS, &cardsDrawn, sizeof(BYTE));



}


工作良好:

void EditCards(BYTE victim){

static BYTE cardsDrawn = 23;
puts("Choose the cards:");
scanf("%hhu",&cardsDrawn);

if(cardsDrawn > 40)
    cardsDrawn = 40;

cardsDrawn = 40 - cardsDrawn;//If the enemy has 5 cards then 45 have been drawn :P

WriteMem( victim ? Y_ENEMY_CARDS : Y_PLAYER_CARDS, &cardsDrawn, sizeof(BYTE));



}


传递给下一个cardsDrawn时,仍分配给WriteMem afaik分配的空间,为什么会失败?

编辑:
不,我正在编辑另一个进程的内存。如果您想知道它是ePSXe.exe

hProc是在主要功能中分配的global variable。这是我正在编辑其内存的进程的句柄。

这是要求的内容:

#define Y_PLAYER_CARDS ((LPVOID)0x0B76510)
#define Y_ENEMY_CARDS (LPVOID)(Y_PLAYER_CARDS + 0x20)

最佳答案

我能够用简化的代码重现您的问题;即使WriteMem()什么也不做,它仍然崩溃!这是问题所在:

scanf("%hhu",&cardsDrawn);


hh前缀为valid in Linux,但在Microsoft C运行时中为not supported

相反,使用

{
  int x;
  scanf("%u",&x);
  cardsdrawn = x;
}

关于c - WriteProcessMemory不适用于非静态变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32342500/

10-11 21:21