wine原理
wine通过在linux上模拟windows的API,加载并运行windows程序。那么,wine具体是如何实现的?
windows和linux,作为典型的PC操作系统,分为内核态的系统调用和用户态的API。linux上,用户态的API通过glibc来条用系统调用(int 0x80), windows通过ntdll.dll来调用内核态(syscall, 最早也是int中断)。
所以在linux上模拟windows的api是可能的,只要实现了ntdll的API兼容实现(部分或者全部),在通过对PE文件的拆解和定位,就可以将所有的调用通过树状结构汇总到ntdll。
然而是线上,还是相当工作需要执行,比如如何在用户态或者linux内核其他对象来模拟windows的句柄概念(windows内核对象的访问方式)?
初始化windows执行基础环境
$ WiNEPREFIX=/home/.mine/win7 wine winecfg
安装依赖库
$ WINEPREFIX=/home/.mine/win7 winetricks vcrun6
测试验证程序
$ WINEPREFIX=/home/.mine/win7 wine registry.exe
deb打包
deb打包有详细的debian文档支持,这里从一个已有的deb包作为base来打包。
deb打包需要在DEBIAN目录下修改至少以下3个文件:
DEBIAN/control
DEBIAN/postinst
DEBIAN/md5sums
下载一个deb包,这里以tdx的deepin包为例,通过dpkg-deb命令解包和提取配置信息。
参考 基于deepin-wine的windows软件打包deb安装包教程(本實例安裝qq)
准备files.7z
将win7的运行基础环境通过7z压缩,注意目录前缀(确保drive_c在第一级)
替换opt子目录下的files.7z。用以下脚本打包:
#!/bin/bash
cd env
7z a ../extract/opt/apps/com.hd.deepin/files/files.7z *
cd ..
find extract/opt -type f -print0 |xargs -0 md5sum > extract/DEBIAN/md5sums
dpkg-deb --build extract/ build/