在Wine上运行《侠客风云传》

时隔n年,《金庸群侠传》、《武林群侠传》原制作人又出新作名为《侠客风云传》。

然而手中没有装有Windows的电脑。平日里用Wine基本能解决各种windows游戏的需求,所以入手之后第一件事就是把它装在mac上,然后用Wine去启动。

安装过程中没啥问题,毕竟安装向导充其量就是个用来解压游戏本体的工具。然而安装之后可以联网激活,但根本玩儿不了啊,因为启动时就会闪退!

折腾了半个小时,装dll、改路径等等各种手段尝试无果后打算放弃。然后《侠客风云传》奇葩的验证模式告诉我:卸载之前需要反激活(revoke.exe)才能让序列号恢复可用。

运行wine revoke.exe之后傻眼了:

糟糕。。。反激活工具运行不起来。。那这个序列号岂不是废了!?

作为程序员,遇到这种奇葩的问题绝对不能妥协。分析一下输出的错误提示:

error: Cannot find function 'NtResumeProcess' in the dll.  

经过谷歌,基本确认故障原因:Wine模拟了windows底层的各种dll,其中包括一个叫做ntdll.dll的文件。这个文件是windows的内核程序之一,包含很多基本的操作和系统调用。问题就出在——由于这个系统调用并不常用,所以wine官方并没有实现它,只是在源码文件中包含了一个stub标记并且注释掉了。

顺便吐槽一下, 这个AAuto貌似是开发者使用的一个简单的开发工具,它竟然非常奇葩地调用了NtResumeProcess、NtSuspendProcess这种八百年都没人用过、连微软官方都不公开文档的函数。

找到解决对策了,也就是说我们需要修改一下wine的源代码文件、补全缺失的内容、重新编译、替换新编译出来的dll文件。

具体过程如下:

一、首先下载wine源码(我用的是1.6.2稳定版)
二、修改 wine-1.6.2/include/winternl.h文件,添加这样两句代码:
NTSYSAPI NTSTATUS  WINAPI NtResumeProcess(HANDLE);  
NTSYSAPI NTSTATUS  WINAPI NtSuspendProcess(HANDLE);  

改完之后大概长这样:

三、修改 wine-1.6.2/dlls/ntdll/ntdll.spec:将其中
# @ stub NtResumeProcess
# @ stub ZwResumeProcess
# @ stub NtSuspendProcess
# @ stub ZwSuspendProcess

这四行删掉,然后添加下面这四行

@ stdcall NtResumeProcess(long)
@ stdcall ZwResumeProcess(long) NtResumeProcess
@ stdcall NtSuspendProcess(long)
@ stdcall ZwSuspendProcess(long) NtSuspendProcess

(注意这四行可能在这个文件中不同的四个地方)

四、修改 wine-1.6.2/dlls/ntdll/process.c:向其中添加下面这两个函数
NTSTATUS WINAPI NtResumeProcess( HANDLE handle)  
{

    NTSTATUS ret;
    return ret;
}

NTSTATUS WINAPI NtSuspendProcess( HANDLE handle )  
{

    NTSTATUS ret;
    return ret;
}

(添加到什么位置基本随意,只要代码能通过编译就行,我是添加到了下图的位置)

五、重新编译wine。

第一次编译时候需要在wine-1.6.2文件夹下执行

./configure
make  

之后每次编译只需要进入到相应的dll文件夹内执行

make clean  
make  

就可以了。

六、替换文件

编译好之后会生成一个叫做ntdll.dll.so的文件,把这个文件替换到你wine安装文件夹下相应的文件即可。

按照上面的操作进行过之后,会发现revoke程序能用了。同时还能惊奇的发现游戏也能进去了!

呃不过这个主界面有点儿奇葩,按钮、图片啥的基本都显示不了。但是好歹是能运行了。附一张我摸索出来的按钮位置图:

最后附一张游戏运行状态的图,窗口模式

(不但能运行,连Mac下的搜狗输入法都能用!)

免责声明 由于这个游戏的验证方式比较奇葩,如果revoke运行不了,这个序列号基本就废了 所以非常不建议强行用Wine运行 以上方法在我的电脑上(Mac Pro 2013,Mac OS X Yosemite)运行正常,但我不保证其他系统能正常运行 上面修改Wine可(肯)能(定)会导致wine在运行某些其他东西时不稳定,后果自负。

Friskit

继续阅读此作者的更多文章