11 Commits

Author SHA1 Message Date
77a2a748ad Fix macos version
Some checks failed
Build Project / build (push) Has been cancelled
2025-04-09 10:03:54 +03:00
0d4f46e536 Fix build error #14 2025-04-09 06:38:25 +03:00
d065019137 Fix formatting in documentation
Some checks failed
Build Project / build (push) Has been cancelled
Deploy Documentation / deploy (push) Has been cancelled
2025-04-08 12:11:52 +03:00
e03dce1a7c Improve formatting of installation instructions in documentation 2025-04-08 12:09:38 +03:00
7c806779d2 Add link to latest pre-release in documentation 2025-04-08 12:05:58 +03:00
885cf775f9 Remove link to latest pre-release in documentation 2025-04-08 12:05:04 +03:00
7c07952df1 Add paths-ignore to GitHub Actions for build workflow 2025-04-08 12:04:16 +03:00
ea566cfdeb Update documentation links in index.md 2025-04-08 12:00:56 +03:00
d56de21e74 Refactor GitHub Actions workflows 2025-04-08 11:58:50 +03:00
26a016cb26 Bump version 2025-04-08 11:51:50 +03:00
edfcce2ae9 Update copyright year in bridge.rc to 2025
[no ci]
2025-04-08 11:51:02 +03:00
8 changed files with 103 additions and 45 deletions

35
.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,35 @@
name: Build Project
on:
push:
branches: [ "master" ]
paths-ignore:
- 'ISSUE_TEMPLATE/**'
- 'workflows/**'
- '.vsocde/**'
- 'docs/**'
pull_request:
branches: [ "master" ]
paths-ignore:
- 'ISSUE_TEMPLATE/**'
- 'workflows/**'
- '.vsocde/**'
- 'docs/**'
permissions:
contents: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: dependencies
run: sudo apt update && sudo apt -y install gcc-mingw-w64 make
- name: make
run: make
- name: artifact
uses: actions/upload-artifact@v4
with:
name: bridge
path: build

View File

@ -1,29 +1,21 @@
name: Build and Deploy docs name: Deploy Documentation
on: on:
push: push:
branches: [ "master" ] branches: [ master ]
paths:
- docs/**
- mkdocs.yml
pull_request: pull_request:
branches: [ "master" ] branches: [ "master" ]
paths:
- docs/**
- mkdocs.yml
permissions: permissions:
contents: write contents: write
jobs: jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: dependencies
run: sudo apt update && sudo apt -y install gcc-mingw-w64 make
- name: make
run: make
- name: artifact
uses: actions/upload-artifact@v4
with:
name: bridge
path: build
deploy: deploy:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:

View File

@ -4,7 +4,9 @@ C_OBJECTS = $(C_SOURCES:.c=.o)
GIT_COMMIT = $(shell git rev-parse --short HEAD) GIT_COMMIT = $(shell git rev-parse --short HEAD)
GIT_BRANCH = $(shell git rev-parse --abbrev-ref HEAD) GIT_BRANCH = $(shell git rev-parse --abbrev-ref HEAD)
CFLAGS = -std=c17 -Wno-int-conversion -DGIT_COMMIT='"$(GIT_COMMIT)"' -DGIT_BRANCH='"$(GIT_BRANCH)"' CWARNFLAGS = -Wno-int-conversion -Wno-incompatible-pointer-types
CFLAGS = -std=c17 -DGIT_COMMIT='"$(GIT_COMMIT)"' -DGIT_BRANCH='"$(GIT_BRANCH)"'
LFLAGS = -lgdi32 -lws2_32 LFLAGS = -lgdi32 -lws2_32
# DBGFLAGS = -Wl,--export-all-symbols -g -O0 -ggdb3 -Wall # DBGFLAGS = -Wl,--export-all-symbols -g -O0 -ggdb3 -Wall
@ -18,7 +20,7 @@ build: $(C_OBJECTS)
%.o: %.c %.o: %.c
$(info Compiling $<) $(info Compiling $<)
x86_64-w64-mingw32-gcc $(CFLAGS) $(DBGFLAGS) -c $< -o $@ x86_64-w64-mingw32-gcc $(CFLAGS) $(CWARNFLAGS) $(DBGFLAGS) -c $< -o $@
clean: clean:
rm -f $(C_OBJECTS) build/bridge.exe bridge.res rm -f $(C_OBJECTS) build/bridge.exe bridge.res

View File

@ -20,11 +20,13 @@
#define __darwin_close 0x2000006 #define __darwin_close 0x2000006
#define __darwin_socket 0x2000061 #define __darwin_socket 0x2000061
#define __darwin_connect 0x2000062 #define __darwin_connect 0x2000062
#define __darwin_mmap 0x20000C5
#define __darwin_fcntl 0x200005C #define __darwin_fcntl 0x200005C
#define __darwin_sysctl 0x20000CA #define __darwin_sysctl 0x20000CA
#define O_RDONLY 00 #define O_RDONLY 00
/* macos & linux are the same for PROT_READ, PROT_WRITE, MAP_FIXED & MAP_PRIVATE */
#define PROT_READ 1 #define PROT_READ 1
#define PROT_WRITE 2 #define PROT_WRITE 2
#define MAP_PRIVATE 0x02 #define MAP_PRIVATE 0x02
@ -32,6 +34,8 @@
#define MAP_ANON 0x20 #define MAP_ANON 0x20
#define MAP_FAILED ((void *)-1) #define MAP_FAILED ((void *)-1)
#define __darwin_MAP_ANON 0x1000
#define SYS_SOCKET 1 #define SYS_SOCKET 1
#define SYS_CONNECT 3 #define SYS_CONNECT 3
@ -134,8 +138,17 @@ static inline int sys_close(int fd)
static inline unsigned int *sys_mmap(unsigned int *addr, size_t length, int prot, int flags, int fd, off_t offset) static inline unsigned int *sys_mmap(unsigned int *addr, size_t length, int prot, int flags, int fd, off_t offset)
{ {
assert(IsLinux); if (IsLinux)
return linux_syscall(__linux_mmap2, addr, length, prot, flags, fd, offset); return linux_syscall(__linux_mmap2, addr, length, prot, flags, fd, offset);
else
{
if (flags & MAP_ANON)
{
flags &= ~MAP_ANON;
flags |= __darwin_MAP_ANON;
}
return darwin_syscall(__darwin_mmap, addr, length, prot, flags, fd, offset);
}
} }
static inline int sys_munmap(unsigned int *addr, size_t length) static inline int sys_munmap(unsigned int *addr, size_t length)
@ -285,9 +298,6 @@ void ConnectToSocket(int fd)
"%s/snap.discord-canary/discord-ipc-%d", "%s/snap.discord-canary/discord-ipc-%d",
}; };
struct sockaddr_un *socketAddr = sys_mmap(0x23000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
socketAddr->sun_family = AF_UNIX;
int sockRet = 0; int sockRet = 0;
for (int i = 0; i < sizeof(discordUnixSockets) / sizeof(discordUnixSockets[0]); i++) for (int i = 0; i < sizeof(discordUnixSockets) / sizeof(discordUnixSockets[0]); i++)
{ {
@ -296,12 +306,16 @@ void ConnectToSocket(int fd)
for (int j = 0; j < 16; j++) for (int j = 0; j < 16; j++)
{ {
snprintf(pipePath, pipePathLen, discordUnixSockets[i], runtime, j);
strcpy_s(socketAddr->sun_path, sizeof(socketAddr->sun_path), pipePath);
print("Probing %s\n", pipePath);
if (IsLinux) if (IsLinux)
{ {
struct sockaddr_un *socketAddr = sys_mmap(0x23000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
print("Socket address allocated at %#lx\n", socketAddr);
socketAddr->sun_family = AF_UNIX;
snprintf(pipePath, pipePathLen, discordUnixSockets[i], runtime, j);
strcpy_s(socketAddr->sun_path, sizeof(socketAddr->sun_path), pipePath);
print("Probing %s\n", pipePath);
// unsigned long socketArgs[] = { // unsigned long socketArgs[] = {
// (unsigned long)fd, // (unsigned long)fd,
// (unsigned long)(intptr_t)&socketAddr, // (unsigned long)(intptr_t)&socketAddr,
@ -315,7 +329,16 @@ void ConnectToSocket(int fd)
sockRet = sys_socketcall(SYS_CONNECT, socketArgs); sockRet = sys_socketcall(SYS_CONNECT, socketArgs);
} }
else else
{
struct sockaddr_un socketAddr;
socketAddr.sun_family = AF_UNIX;
snprintf(pipePath, pipePathLen, discordUnixSockets[i], runtime, j);
strcpy_s(socketAddr.sun_path, sizeof(socketAddr.sun_path), pipePath);
print("Probing %s\n", pipePath);
sockRet = sys_connect(fd, (caddr_t)&socketAddr, sizeof(socketAddr)); sockRet = sys_connect(fd, (caddr_t)&socketAddr, sizeof(socketAddr));
}
print(" error: %d\n", sockRet); print(" error: %d\n", sockRet);
if (sockRet >= 0) if (sockRet >= 0)
@ -347,7 +370,12 @@ void PipeBufferInThread(LPVOID lpParam)
bridge_thread *bt = (bridge_thread *)lpParam; bridge_thread *bt = (bridge_thread *)lpParam;
print("In thread started using fd %d and pipe %#x\n", bt->fd, bt->hPipe); print("In thread started using fd %d and pipe %#x\n", bt->fd, bt->hPipe);
int EOFCount = 0; int EOFCount = 0;
char *l_buffer = sys_mmap(0x25000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0); char *l_buffer;
if (IsLinux)
l_buffer = sys_mmap(0x25000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
else
l_buffer = malloc(BUFFER_LENGTH);
print("Buffer in thread allocated at %#lx\n", l_buffer);
while (TRUE) while (TRUE)
{ {
char buffer[BUFFER_LENGTH]; char buffer[BUFFER_LENGTH];
@ -439,7 +467,12 @@ void PipeBufferOutThread(LPVOID lpParam)
{ {
bridge_thread *bt = (bridge_thread *)lpParam; bridge_thread *bt = (bridge_thread *)lpParam;
print("Out thread started using fd %d and pipe %#x\n", bt->fd, bt->hPipe); print("Out thread started using fd %d and pipe %#x\n", bt->fd, bt->hPipe);
char *l_buffer = sys_mmap(0x25000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0); char *l_buffer;
if (IsLinux)
l_buffer = sys_mmap(0x26000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
else
l_buffer = malloc(BUFFER_LENGTH);
print("Buffer out thread allocated at %#lx\n", l_buffer);
while (TRUE) while (TRUE)
{ {
char buffer[BUFFER_LENGTH]; char buffer[BUFFER_LENGTH];

View File

@ -19,7 +19,7 @@ BEGIN
VALUE "FileDescription", "Simple bridge that allows you to use Discord Rich Presence with Wine games/software." VALUE "FileDescription", "Simple bridge that allows you to use Discord Rich Presence with Wine games/software."
VALUE "FileVersion", VER_VERSION_STR VALUE "FileVersion", VER_VERSION_STR
VALUE "InternalName", "bridge" VALUE "InternalName", "bridge"
VALUE "LegalCopyright", "Copyright (c) 2024 EnderIce2" VALUE "LegalCopyright", "Copyright (c) 2025 EnderIce2"
VALUE "OriginalFilename", "bridge.exe" VALUE "OriginalFilename", "bridge.exe"
VALUE "ProductName", "rpc-bridge" VALUE "ProductName", "rpc-bridge"
VALUE "ProductVersion", VER_VERSION_STR VALUE "ProductVersion", VER_VERSION_STR

View File

@ -9,7 +9,7 @@ Simple bridge that allows you to use Discord Rich Presence with Wine games/softw
[Download latest release](https://github.com/EnderIce2/rpc-bridge/releases/latest/download/bridge.zip "Recommended"){ .md-button .md-button--primary } [Download latest release](https://github.com/EnderIce2/rpc-bridge/releases/latest/download/bridge.zip "Recommended"){ .md-button .md-button--primary }
[Download latest pre-release](https://github.com/EnderIce2/rpc-bridge/releases "Unstable builds with experimental features"){ .md-button } [Download latest pre-release](https://github.com/EnderIce2/rpc-bridge/releases "Unstable builds with experimental features"){ .md-button }
<!-- [Download latest build](https://github.com/EnderIce2/rpc-bridge/actions "Builds from the latest commits, here be dragons!"){ .md-button } --> [Download latest build](https://github.com/EnderIce2/rpc-bridge/actions/workflows/build.yml "Builds from the latest commits, here be dragons!"){ .md-button }
Works by running a small program in the background that creates a [named pipe](https://learn.microsoft.com/en-us/windows/win32/ipc/named-pipes) `\\.\pipe\discord-ipc-0` inside the prefix and forwards all data to the pipe `/run/user/1000/discord-ipc-0`. Works by running a small program in the background that creates a [named pipe](https://learn.microsoft.com/en-us/windows/win32/ipc/named-pipes) `\\.\pipe\discord-ipc-0` inside the prefix and forwards all data to the pipe `/run/user/1000/discord-ipc-0`.

View File

@ -84,21 +84,17 @@ In Lutris, you can achieve this by adding the path to `bridge.exe` in the `Execu
=== "Without bridge" === "Without bridge"
``` - Executable
Executable - `/mnt/games/lutris/league-of-legends/drive_c/Riot Games/League of Legends/LeagueClient.exe`
/mnt/games/lutris/league-of-legends/drive_c/Riot Games/League of Legends/LeagueClient.exe - Arguments
Arguments - `--locale=en_US --launch-product=league_of_legends --launch-patchline=live`
--locale=en_US --launch-product=league_of_legends --launch-patchline=live
```
=== "With bridge" === "With bridge"
``` - Executable
Executable - `/mnt/games/lutris/league-of-legends/drive_c/bridge.exe`
/mnt/games/lutris/league-of-legends/drive_c/bridge.exe - Arguments
Arguments - `"C:\Riot Games\League of Legends\LeagueClient.exe" --locale=en_US --launch-product=league_of_legends --launch-patchline=live`
"C:\Riot Games\League of Legends\LeagueClient.exe" --locale=en_US --launch-product=league_of_legends --launch-patchline=live
```
In Wine, all you need to do is run `bridge.exe` and select `Start`. In Wine, all you need to do is run `bridge.exe` and select `Start`.

View File

@ -5,5 +5,5 @@
#define IDM_HELP_ABOUT 40003 #define IDM_HELP_ABOUT 40003
#define IDM_VIEW_LOG 40004 #define IDM_VIEW_LOG 40004
#define VER_VERSION 1, 3, 0, 0 #define VER_VERSION 1, 4, 0, 0
#define VER_VERSION_STR "1.3\0" #define VER_VERSION_STR "1.4.0.0\0"