Skip to content

Commit

Permalink
rsrc: Compile .rsrc section from .rc file using llvm-rc
Browse files Browse the repository at this point in the history
  • Loading branch information
bwrsandman committed Jan 4, 2025
1 parent 2cd52b7 commit 306f492
Show file tree
Hide file tree
Showing 13 changed files with 2,160 additions and 931 deletions.
28 changes: 20 additions & 8 deletions .github/workflows/reassemble.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,11 @@ jobs:
- name: Install Ninja
uses: seanmiddleditch/gha-setup-ninja@master

- name: Download lld and clang
- name: Download lld, llvm-rc and clang
uses: robinraju/release-downloader@v1
with:
repository: 'openblack/llvm-project'
tag: 'bw1-decomp-001'
tag: 'bw1-decomp-003'
fileName: 'llvm-${{ matrix.os }}.zip'
extract: true
out-file-path: 'llvm'
Expand All @@ -39,10 +39,16 @@ jobs:
if: ${{ runner.os != 'Windows' }}
run: chmod -R +x llvm/bin

- name: Configure bw1-decomp project
run: >
cmake -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_ASM_COMPILER="${{ github.workspace }}/llvm/bin/clang${{ runner.os == 'Windows' && '.exe' || '' }}"
-DCMAKE_RC_COMPILER="${{ github.workspace }}/llvm/bin/llvm-rc${{ runner.os == 'Windows' && '.exe' || '' }}"
-DCMAKE_LINKER="${{ github.workspace }}/llvm/bin/lld${{ runner.os == 'Windows' && '.exe' || '' }}"
-G Ninja -Ssrc -Bbuild
- name: Build bw1-decomp project
run: |
cmake -Ssrc -Bbuild -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_LINKER="${{ github.workspace }}/llvm/bin/lld${{ runner.os == 'Windows' && '.exe' || '' }}" -DCMAKE_ASM_COMPILER="${{ github.workspace }}/llvm/bin/clang${{ runner.os == 'Windows' && '.exe' || '' }}"
cmake --build build
run: cmake --build build

- name: Verify MD5 sum of resulting binary
run: |
Expand All @@ -64,10 +70,16 @@ jobs:
name: failed-binary-${{ matrix.os }}
path: build/runblack-reassembled.exe

- name: Configure bw1-decomp project (Debug)
run: >
cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo
-DCMAKE_ASM_COMPILER="${{ github.workspace }}/llvm/bin/clang${{ runner.os == 'Windows' && '.exe' || '' }}"
-DCMAKE_RC_COMPILER="${{ github.workspace }}/llvm/bin/llvm-rc${{ runner.os == 'Windows' && '.exe' || '' }}"
-DCMAKE_LINKER="${{ github.workspace }}/llvm/bin/lld${{ runner.os == 'Windows' && '.exe' || '' }}"
-G Ninja -Ssrc -Bbuild_debug
- name: Build bw1-decomp project (Debug)
run: |
cmake -Ssrc -Bbuild_debug -G Ninja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_LINKER="${{ github.workspace }}/llvm/bin/lld${{ runner.os == 'Windows' && '.exe' || '' }}" -DCMAKE_ASM_COMPILER="${{ github.workspace }}/llvm/bin/clang${{ runner.os == 'Windows' && '.exe' || '' }}"
cmake --build build_debug
run: cmake --build build_debug

- name: Upload debug version
uses: actions/upload-artifact@v4
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ build/
*$py.class
*.o
*.obj
*.res
10 changes: 8 additions & 2 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.30)
project(bw1-decomp ASM)
project(bw1-decomp ASM RC)

set(CMAKE_CONFIGURATION_TYPES "RelWithDebInfo;Release" CACHE STRING "Available build configurations" FORCE)

Expand Down Expand Up @@ -369,7 +369,12 @@ set(SOURCES
asm/unprocessed/data.asm
asm/unprocessed/data1.asm
asm/unprocessed/SELFMOD.asm
asm/unprocessed/rsrc.asm

res/winnt.rh
res/winuser.rh
res/verrsrc.h
res/resource.h
res/runblack.rc
)

add_executable(runblack-reassembled ${SOURCES})
Expand All @@ -391,6 +396,7 @@ target_link_options(runblack-reassembled
"/FIXED"
"/sectionvsize:.text,0x004a795d"
"/sectionvsize:.data,0x5f9e00"
"/sectionvsize:.rsrc,0x393E"
"/subsystem:windows,4"
"/stack:0x100000,0x1000"
"/heap:0x100000,0x1000"
Expand Down
921 changes: 0 additions & 921 deletions src/asm/unprocessed/rsrc.asm

This file was deleted.

Binary file added src/res/BITMAP102_1.bmp
Binary file not shown.
Binary file added src/res/BITMAP106_1.bmp
Binary file not shown.
Binary file added src/res/CURSOR108_1.cur
Binary file not shown.
20 changes: 20 additions & 0 deletions src/res/resource.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#define VS_VERSION_INFO 1

#define IDD_LIBSDLG 102

#define IDB_BMP1 102
#define IDB_BMP2 106

#define IDC_CURSOR 108

#define IDC_CMB1 1003
#define IDC_LSB1 1004
#define IDC_HOSTBUTTON 1005
#define IDC_JOINBUTTON 1006
#define IDC_EDT1 1017

#define ICM_FPS 40003
#define ICM_PAUSE 40016
#define ICM_LOG_PROPERTIES 40020
#define ICM_DUMP_BITMAP 40024
#define ICM_FULLSCREEN 40026
86 changes: 86 additions & 0 deletions src/res/runblack.rc
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
#include "winnt.rh"
#include "winuser.rh"
#include "verrsrc.h"
#include "resource.h"

LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK

IDD_LIBSDLG DIALOG 0, 0, 241, 119
STYLE DS_SYSMODAL | DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "LIONHEAD LIBRARIES"
FONT 8, "MS Shell Dlg"
{
COMBOBOX IDC_CMB1, 91, 24, 143, 85, CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP
LISTBOX IDC_LSB1, 91, 42, 143, 48, LBS_STANDARD | LBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE | WS_TABSTOP
PUSHBUTTON "Host", IDC_HOSTBUTTON, 91, 98, 50, 14, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP
PUSHBUTTON "Join", IDC_JOINBUTTON, 184, 98, 50, 14, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP
ICON IDB_BMP1, -1, 7, 7, 60, 66, SS_BITMAP | WS_CHILD | WS_VISIBLE
EDITTEXT IDC_EDT1, 131, 7, 103, 12, ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP
LTEXT "User Name:", -1, 91, 7, 39, 12, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP
}

IDB_BMP1 BITMAP "BITMAP102_1.bmp"
IDB_BMP2 BITMAP "BITMAP106_1.bmp"

VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0,0,1
FILEOS VOS_NT_WINDOWS32
FILETYPE VFT_STATIC_LIB
FILEFLAGSMASK 0x3f
{
BLOCK "StringFileInfo"
{
BLOCK "080904b0"
{
VALUE "Comments", "The Library"
VALUE "CompanyName", "LionHead Studios Ltd."
VALUE "FileDescription", "lh"
VALUE "FileVersion", "1, 0, 0, 1"
VALUE "InternalName", "lh"
VALUE "LegalCopyright", L"Copyright \xA9 1997"
VALUE "LegalTrademarks", ""
VALUE "OriginalFilename", "lhd.lib"
VALUE "PrivateBuild", ""
VALUE "ProductName", "LionHead Studios Ltd. lhd"
VALUE "ProductVersion", "1, 0, 0, 1"
VALUE "SpecialBuild", ""
}
}

BLOCK "VarFileInfo"
{
VALUE "Translation", 0x0809 0x04B0
}
}

APPMENU MENU
{
POPUP "&Options"
{
MENUITEM "Fullscreen\tAlt Enter", ICM_FULLSCREEN
MENUITEM "FPS\tCtrl Alt F", ICM_FPS
MENUITEM "&Dump Bitmap\tCtrl Alt D", ICM_DUMP_BITMAP
MENUITEM "&Log Properties\tCtrl Alt L", ICM_LOG_PROPERTIES
MENUITEM "Pause\tCtrl Alt P", ICM_PAUSE
}
}

APPACCEL ACCELERATORS
{
"D", ICM_DUMP_BITMAP, NOINVERT, ALT, CONTROL, VIRTKEY
"F", ICM_FPS, NOINVERT, ALT, CONTROL, VIRTKEY
"L", ICM_LOG_PROPERTIES, NOINVERT, ALT, CONTROL, VIRTKEY
"P", ICM_PAUSE, NOINVERT, ALT, CONTROL, VIRTKEY
VK_RETURN, ICM_FULLSCREEN, NOINVERT, ALT, VIRTKEY
}

IDC_CURSOR CURSOR "CURSOR108_1.cur"

STRINGTABLE
{
ICM_PAUSE, ""
ICM_LOG_PROPERTIES, ""
ICM_DUMP_BITMAP, ""
ICM_FULLSCREEN, "Alt Enter"
}
173 changes: 173 additions & 0 deletions src/res/verrsrc.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
/* Definitions for the VERsion info library (VER.DLL)
*
* Copyright 1996 Marcus Meissner
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/

#ifndef __WINE_VERRSRC_H
#define __WINE_VERRSRC_H

/* Macro to deal with LP64 <=> LLP64 differences in numeric constants with 'l' modifier */
#ifndef __MSABI_LONG
#if !defined(__LP64__) && !defined(WINE_NO_LONG_TYPES)
# define __MSABI_LONG(x) x ## l
# else
# define __MSABI_LONG(x) x
# endif
#endif

/* resource ids for different version infos */
#define VS_FILE_INFO RT_VERSION
#define VS_VERSION_INFO 1
#define VS_USER_DEFINED 100

#define VS_FFI_SIGNATURE __MSABI_LONG(0xfeef04bd) /* FileInfo Magic */
#define VS_FFI_STRUCVERSION __MSABI_LONG(0x00010000) /* struc version 1.0 */
#define VS_FFI_FILEFLAGSMASK __MSABI_LONG(0x0000003f) /* valid flags */

/* VS_VERSION.dwFileFlags */
#define VS_FF_DEBUG __MSABI_LONG(0x01)
#define VS_FF_PRERELEASE __MSABI_LONG(0x02)
#define VS_FF_PATCHED __MSABI_LONG(0x04)
#define VS_FF_PRIVATEBUILD __MSABI_LONG(0x08)
#define VS_FF_INFOINFERRED __MSABI_LONG(0x10)
#define VS_FF_SPECIALBUILD __MSABI_LONG(0x20)

/* VS_VERSION.dwFileOS */

/* major os version */
#define VOS_UNKNOWN __MSABI_LONG(0x00000000)
#define VOS_DOS __MSABI_LONG(0x00010000)
#define VOS_OS216 __MSABI_LONG(0x00020000)
#define VOS_OS232 __MSABI_LONG(0x00030000)
#define VOS_NT __MSABI_LONG(0x00040000)
#define VOS_WINCE __MSABI_LONG(0x00050000)

/* minor os version */
#define VOS__BASE __MSABI_LONG(0x00000000)
#define VOS__WINDOWS16 __MSABI_LONG(0x00000001)
#define VOS__PM16 __MSABI_LONG(0x00000002)
#define VOS__PM32 __MSABI_LONG(0x00000003)
#define VOS__WINDOWS32 __MSABI_LONG(0x00000004)

/* possible versions */
#define VOS_DOS_WINDOWS16 (VOS_DOS|VOS__WINDOWS16)
#define VOS_DOS_WINDOWS32 (VOS_DOS|VOS__WINDOWS32)
#define VOS_OS216_PM16 (VOS_OS216|VOS__PM16)
#define VOS_OS232_PM32 (VOS_OS232|VOS__PM32)
#define VOS_NT_WINDOWS32 (VOS_NT|VOS__WINDOWS32)

/* VS_VERSION.dwFileType */
#define VFT_UNKNOWN __MSABI_LONG(0x00000000)
#define VFT_APP __MSABI_LONG(0x00000001)
#define VFT_DLL __MSABI_LONG(0x00000002)
#define VFT_DRV __MSABI_LONG(0x00000003)
#define VFT_FONT __MSABI_LONG(0x00000004)
#define VFT_VXD __MSABI_LONG(0x00000005)
/* ??one type missing?? __MSABI_LONG(0x00000006) -Marcus */
#define VFT_STATIC_LIB __MSABI_LONG(0x00000007)

/* VS_VERSION.dwFileSubtype for VFT_DRV */
#define VFT2_UNKNOWN __MSABI_LONG(0x00000000)
#define VFT2_DRV_PRINTER __MSABI_LONG(0x00000001)
#define VFT2_DRV_KEYBOARD __MSABI_LONG(0x00000002)
#define VFT2_DRV_LANGUAGE __MSABI_LONG(0x00000003)
#define VFT2_DRV_DISPLAY __MSABI_LONG(0x00000004)
#define VFT2_DRV_MOUSE __MSABI_LONG(0x00000005)
#define VFT2_DRV_NETWORK __MSABI_LONG(0x00000006)
#define VFT2_DRV_SYSTEM __MSABI_LONG(0x00000007)
#define VFT2_DRV_INSTALLABLE __MSABI_LONG(0x00000008)
#define VFT2_DRV_SOUND __MSABI_LONG(0x00000009)
#define VFT2_DRV_COMM __MSABI_LONG(0x0000000a)
#define VFT2_DRV_INPUTMETHOD __MSABI_LONG(0x0000000b)
#define VFT2_DRV_VERSIONED_PRINTER __MSABI_LONG(0x0000000c)

/* VS_VERSION.dwFileSubtype for VFT_FONT */
#define VFT2_FONT_RASTER __MSABI_LONG(0x00000001)
#define VFT2_FONT_VECTOR __MSABI_LONG(0x00000002)
#define VFT2_FONT_TRUETYPE __MSABI_LONG(0x00000003)

/* VerFindFile Flags */
/* input */
#define VFFF_ISSHAREDFILE 0x0001

/* output (returned) */
#define VFF_CURNEDEST 0x0001
#define VFF_FILEINUSE 0x0002
#define VFF_BUFFTOOSMALL 0x0004

/* VerInstallFile Flags */
/* input */
#define VIFF_FORCEINSTALL 0x0001
#define VIFF_DONTDELETEOLD 0x0002

/* output (return) */
#define VIF_TEMPFILE __MSABI_LONG(0x00000001)
#define VIF_MISMATCH __MSABI_LONG(0x00000002)
#define VIF_SRCOLD __MSABI_LONG(0x00000004)
#define VIF_DIFFLANG __MSABI_LONG(0x00000008)
#define VIF_DIFFCODEPG __MSABI_LONG(0x00000010)
#define VIF_DIFFTYPE __MSABI_LONG(0x00000020)
#define VIF_WRITEPROT __MSABI_LONG(0x00000040)
#define VIF_FILEINUSE __MSABI_LONG(0x00000080)
#define VIF_OUTOFSPACE __MSABI_LONG(0x00000100)
#define VIF_ACCESSVIOLATION __MSABI_LONG(0x00000200)
#define VIF_SHARINGVIOLATION __MSABI_LONG(0x00000400)
#define VIF_CANNOTCREATE __MSABI_LONG(0x00000800)
#define VIF_CANNOTDELETE __MSABI_LONG(0x00001000)
#define VIF_CANNOTRENAME __MSABI_LONG(0x00002000)
#define VIF_CANNOTDELETECUR __MSABI_LONG(0x00004000)
#define VIF_OUTOFMEMORY __MSABI_LONG(0x00008000)
#define VIF_CANNOTREADSRC __MSABI_LONG(0x00010000)
#define VIF_CANNOTREADDST __MSABI_LONG(0x00020000)
#define VIF_BUFFTOOSMALL __MSABI_LONG(0x00040000)
#define VIF_CANNOTLOADLZ32 __MSABI_LONG(0x00080000)
#define VIF_CANNOTLOADCABINET __MSABI_LONG(0x00100000)


#ifndef RC_INVOKED

#ifdef __cplusplus
extern "C" {
#endif /* defined(__cplusplus) */

#define FILE_VER_GET_LOCALISED 0x01
#define FILE_VER_GET_NEUTRAL 0x02
#define FILE_VER_GET_PREFETCHED 0x04

typedef struct tagVS_FIXEDFILEINFO {
DWORD dwSignature;
DWORD dwStrucVersion;
DWORD dwFileVersionMS;
DWORD dwFileVersionLS;
DWORD dwProductVersionMS;
DWORD dwProductVersionLS;
DWORD dwFileFlagsMask;
DWORD dwFileFlags;
DWORD dwFileOS;
DWORD dwFileType;
DWORD dwFileSubtype;
DWORD dwFileDateMS;
DWORD dwFileDateLS;
} VS_FIXEDFILEINFO;

#ifdef __cplusplus
} /* extern "C" */
#endif /* defined(__cplusplus) */

#endif /* RC_INVOKED */

#endif /* __WINE_VERRSRC_H */
Loading

0 comments on commit 306f492

Please sign in to comment.