这个游戏满老了,好像是2000的时候的吧,当时狠喜欢玩,最近在veryced上看到,就又下载了,发现很多人和我一样,在windowsxp sp2下,一到甲板战斗就程序出错退出.由于我太怀旧了,非要玩它一玩儿,于是这个补丁就写出来了.其实出错原因狠简单,现在计算机速度快了,时差有可能是0,当时估计没想到这点,于是div 0就异常了.
该游戏在verycd上的下载地址:
http://lib.verycd.com/2008/01/21/0000178207.html
补丁程序,打过补丁的exe,源代码都可以在我的网络硬盘(blog首页友情链接)里下载,
这里贴上代码:
#include "windows.h"
#define repair_count 6
unsigned int repair_addr[] =
{
0x0003817B, 0x000387D6, 0x00038F28, 0x0003911D, 0x00039421, 0x000396FD
};
unsigned char r_code[] =
{
0xA1, 0x70, 0x15, 0x4D, 0x00, 0x2B, 0xC8, 0x85,
0xC9, 0x75, 0x05, 0xB9, 0x01, 0x00, 0x00, 0x00,
0xC3
};
unsigned char call_code[] =
{
0xB8, 0x60, 0x00, 0x40, 0x00, 0xFF, 0xD0
};
#define GAME_NAME ".\\Corsairs.exe"
#define GAME_BAK_NAME ".\\Corsairs.exe.bak"
#define BANNER "称霸四海XP肉搏战错误补丁程序,作者:ZVROP"
int main(int argc, char* argv[])
{
unsigned long write_n;
CopyFile(GAME_NAME, GAME_BAK_NAME, TRUE);
HANDLE hd = CreateFile(GAME_NAME, GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hd == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, "文件Corsairs.exe不存在", BANNER, MB_OK);
return 1;
}
SetFilePointer(hd, 0x60, 0, FILE_BEGIN);
if(FALSE == WriteFile(hd, r_code, sizeof(r_code), &write_n, NULL) || write_n != sizeof(r_code))
{
MessageBox(NULL, "补丁修复错误", BANNER, MB_OK);
CloseHandle(hd);
return 1;
}
for(unsigned int i = 0; i < repair_count; i++)
{
SetFilePointer(hd, repair_addr[i], 0, FILE_BEGIN);
if(FALSE == WriteFile(hd, call_code, sizeof(call_code), &write_n, NULL) || write_n != sizeof(call_code))
{
MessageBox(NULL, "补丁修复错误", BANNER, MB_OK);
CloseHandle(hd);
return 1;
}
}
CloseHandle(hd);
MessageBox(NULL, "补丁修复成功", BANNER, MB_OK);
return 0;
}