mirror of
https://github.com/EnderIce2/rpc-bridge.git
synced 2025-08-05 11:24:15 +00:00
Compare commits
7 Commits
3412c3c011
...
v1.3
Author | SHA1 | Date | |
---|---|---|---|
9bec33c358 | |||
3e6b5dbb43
|
|||
4c432a0e50
|
|||
65b5625a57
|
|||
|
9d2440f616 | ||
|
51cbb666f9 | ||
|
1deccc5a63 |
8
.github/ISSUE_TEMPLATE/bug_report.md
vendored
8
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -21,11 +21,11 @@ Steps to reproduce the behavior:
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Log File**
|
||||
Located in `/path/to/prefix/drive_c/windows/logs/bridge.log`
|
||||
Located in `/path/to/prefix/drive_c/windows/logs/bridge.log` or a screenshot with the terminal should suffice.
|
||||
|
||||
**Device (please complete the following information):**
|
||||
- OS: [e.g. SteamOS, Ubuntu, macOS]
|
||||
- Version [e.g. 22.04]
|
||||
**System Info (please complete the following information):**
|
||||
- OS: [e.g. SteamOS 3.0, Ubuntu 22.04, macOS 15, or output from command `uname -srm`]
|
||||
- Wine: [e.g. 10.5]
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
|
2
.github/workflows/build-deploy.yml
vendored
2
.github/workflows/build-deploy.yml
vendored
@@ -15,7 +15,7 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: dependencies
|
||||
run: sudo apt-get update && sudo apt-get install gcc-mingw-w64 make
|
||||
run: sudo apt update && sudo apt -y install gcc-mingw-w64 make
|
||||
- name: make
|
||||
run: make
|
||||
- name: artifact
|
||||
|
@@ -60,7 +60,7 @@ representative at an online or offline event.
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported to the community leaders responsible for enforcement at
|
||||
contact@enderice2.com.
|
||||
enderice2@protonmail.com.
|
||||
All complaints will be reviewed and investigated promptly and fairly.
|
||||
|
||||
All community leaders are obligated to respect the privacy and security of the
|
||||
|
2
LICENSE
2
LICENSE
@@ -1,4 +1,4 @@
|
||||
Copyright (c) 2024 EnderIce2
|
||||
Copyright (c) 2025 EnderIce2
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
2
Makefile
2
Makefile
@@ -5,7 +5,7 @@ GIT_COMMIT = $(shell git rev-parse --short HEAD)
|
||||
GIT_BRANCH = $(shell git rev-parse --abbrev-ref HEAD)
|
||||
|
||||
CFLAGS = -std=c17 -Wno-int-conversion -DGIT_COMMIT='"$(GIT_COMMIT)"' -DGIT_BRANCH='"$(GIT_BRANCH)"'
|
||||
LFLAGS = -lgdi32
|
||||
LFLAGS = -lgdi32 -lws2_32
|
||||
|
||||
# DBGFLAGS = -Wl,--export-all-symbols -g -O0 -ggdb3 -Wall
|
||||
|
||||
|
109
bridge.c
109
bridge.c
@@ -195,11 +195,7 @@ char *native_getenv(const char *name)
|
||||
|
||||
/* I hope the 0x20000 is okay */
|
||||
if (environStr == NULL)
|
||||
{
|
||||
environStr = sys_mmap(0x20000, 4096, PROT_READ | PROT_WRITE,
|
||||
MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
|
||||
print("Allocated 4096 bytes at %#lx\n", environStr);
|
||||
}
|
||||
environStr = sys_mmap(0x20000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
|
||||
|
||||
if ((uintptr_t)environStr > 0x7effffff)
|
||||
print("Warning: environStr %#lx is above 2GB\n", environStr);
|
||||
@@ -209,18 +205,17 @@ char *native_getenv(const char *name)
|
||||
|
||||
int fd = sys_open(environStr, O_RDONLY, 0);
|
||||
|
||||
// sys_munmap(environStr, 4096);
|
||||
if (fd < 0)
|
||||
{
|
||||
print("Failed to open /proc/self/environ: %d\n", fd);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char buffer[4096];
|
||||
char *buffer = sys_mmap(0x22000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
|
||||
char *result = NULL;
|
||||
int bytesRead;
|
||||
|
||||
while ((bytesRead = sys_read(fd, buffer, sizeof(buffer) - 1)) > 0)
|
||||
while ((bytesRead = sys_read(fd, buffer, 0x1000 - 1)) > 0)
|
||||
{
|
||||
buffer[bytesRead] = '\0';
|
||||
char *env = buffer;
|
||||
@@ -290,8 +285,8 @@ void ConnectToSocket(int fd)
|
||||
"%s/snap.discord-canary/discord-ipc-%d",
|
||||
};
|
||||
|
||||
struct sockaddr_un socketAddr;
|
||||
socketAddr.sun_family = AF_UNIX;
|
||||
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;
|
||||
for (int i = 0; i < sizeof(discordUnixSockets) / sizeof(discordUnixSockets[0]); i++)
|
||||
@@ -302,15 +297,20 @@ void ConnectToSocket(int fd)
|
||||
for (int j = 0; j < 16; j++)
|
||||
{
|
||||
snprintf(pipePath, pipePathLen, discordUnixSockets[i], runtime, j);
|
||||
strcpy_s(socketAddr.sun_path, sizeof(socketAddr.sun_path), pipePath);
|
||||
strcpy_s(socketAddr->sun_path, sizeof(socketAddr->sun_path), pipePath);
|
||||
print("Probing %s\n", pipePath);
|
||||
|
||||
if (IsLinux)
|
||||
{
|
||||
unsigned long socketArgs[] = {
|
||||
(unsigned long)fd,
|
||||
(unsigned long)(intptr_t)&socketAddr,
|
||||
sizeof(socketAddr)};
|
||||
// unsigned long socketArgs[] = {
|
||||
// (unsigned long)fd,
|
||||
// (unsigned long)(intptr_t)&socketAddr,
|
||||
// sizeof(socketAddr)};
|
||||
unsigned long *socketArgs = sys_mmap(0x24000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
|
||||
socketArgs[0] = (unsigned long)fd;
|
||||
socketArgs[1] = (unsigned long)(intptr_t)socketAddr;
|
||||
socketArgs[2] = sizeof(struct sockaddr_un);
|
||||
socketArgs[3] = 0;
|
||||
|
||||
sockRet = sys_socketcall(SYS_CONNECT, socketArgs);
|
||||
}
|
||||
@@ -345,18 +345,17 @@ void ConnectToSocket(int fd)
|
||||
void PipeBufferInThread(LPVOID 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;
|
||||
char *l_buffer = sys_mmap(0x25000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
|
||||
while (TRUE)
|
||||
{
|
||||
char buffer[BUFFER_LENGTH];
|
||||
int read = sys_read(bt->fd, buffer, sizeof(buffer));
|
||||
int read = sys_read(bt->fd, l_buffer, BUFFER_LENGTH);
|
||||
|
||||
if (unlikely(read < 0))
|
||||
{
|
||||
print("Failed to read from unix pipe: %d\n",
|
||||
GetErrorMessage());
|
||||
print("Failed to read from unix pipe: %d\n", read);
|
||||
Sleep(1000);
|
||||
continue;
|
||||
}
|
||||
@@ -378,14 +377,16 @@ void PipeBufferInThread(LPVOID lpParam)
|
||||
}
|
||||
EOFCount = 0;
|
||||
|
||||
memcpy(buffer, l_buffer, read);
|
||||
|
||||
print("Reading %d bytes from unix pipe: \"", read);
|
||||
for (int i = 0; i < read; i++)
|
||||
print("%c", buffer[i]);
|
||||
print("\"\n");
|
||||
|
||||
DWORD dwWritten;
|
||||
if (unlikely(!WriteFile(bt->hPipe, buffer, read,
|
||||
&dwWritten, NULL)))
|
||||
WINBOOL bResult = WriteFile(bt->hPipe, buffer, read, &dwWritten, NULL);
|
||||
if (unlikely(bResult == FALSE))
|
||||
{
|
||||
if (GetLastError() == ERROR_BROKEN_PIPE)
|
||||
{
|
||||
@@ -394,16 +395,14 @@ void PipeBufferInThread(LPVOID lpParam)
|
||||
break;
|
||||
}
|
||||
|
||||
print("Failed to read from pipe: %d\n",
|
||||
GetErrorMessage());
|
||||
print("Failed to read from pipe: %s\n", GetErrorMessage());
|
||||
Sleep(1000);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (unlikely(dwWritten < 0))
|
||||
{
|
||||
print("Failed to write to pipe: %d\n",
|
||||
GetErrorMessage());
|
||||
print("Failed to write to pipe: %s\n", GetErrorMessage());
|
||||
Sleep(1000);
|
||||
continue;
|
||||
}
|
||||
@@ -411,8 +410,8 @@ void PipeBufferInThread(LPVOID lpParam)
|
||||
while (dwWritten < read)
|
||||
{
|
||||
int last_written = dwWritten;
|
||||
if (unlikely(!WriteFile(bt->hPipe, buffer + dwWritten,
|
||||
read - dwWritten, &dwWritten, NULL)))
|
||||
WINBOOL bResult = WriteFile(bt->hPipe, buffer + dwWritten, read - dwWritten, &dwWritten, NULL);
|
||||
if (unlikely(bResult == FALSE))
|
||||
{
|
||||
if (GetLastError() == ERROR_BROKEN_PIPE)
|
||||
{
|
||||
@@ -421,16 +420,14 @@ void PipeBufferInThread(LPVOID lpParam)
|
||||
break;
|
||||
}
|
||||
|
||||
print("Failed to read from pipe: %d\n",
|
||||
GetErrorMessage());
|
||||
print("Failed to read from pipe: %s\n", GetErrorMessage());
|
||||
Sleep(1000);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (unlikely(last_written == dwWritten))
|
||||
{
|
||||
print("Failed to write to pipe: %d\n",
|
||||
GetErrorMessage());
|
||||
print("Failed to write to pipe: %s\n", GetErrorMessage());
|
||||
Sleep(1000);
|
||||
continue;
|
||||
}
|
||||
@@ -441,15 +438,14 @@ void PipeBufferInThread(LPVOID lpParam)
|
||||
void PipeBufferOutThread(LPVOID 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);
|
||||
while (TRUE)
|
||||
{
|
||||
char buffer[BUFFER_LENGTH];
|
||||
DWORD dwRead;
|
||||
|
||||
if (unlikely(!ReadFile(bt->hPipe, buffer, sizeof(buffer),
|
||||
&dwRead, NULL)))
|
||||
WINBOOL bResult = ReadFile(bt->hPipe, buffer, BUFFER_LENGTH, &dwRead, NULL);
|
||||
if (unlikely(bResult == FALSE))
|
||||
{
|
||||
if (GetLastError() == ERROR_BROKEN_PIPE)
|
||||
{
|
||||
@@ -458,8 +454,7 @@ void PipeBufferOutThread(LPVOID lpParam)
|
||||
break;
|
||||
}
|
||||
|
||||
print("Failed to read from pipe: %d\n",
|
||||
GetErrorMessage());
|
||||
print("Failed to read from pipe: %s\n", GetErrorMessage());
|
||||
Sleep(1000);
|
||||
continue;
|
||||
}
|
||||
@@ -469,11 +464,11 @@ void PipeBufferOutThread(LPVOID lpParam)
|
||||
print("%c", buffer[i]);
|
||||
print("\"\n");
|
||||
|
||||
int written = sys_write(bt->fd, buffer, dwRead);
|
||||
memcpy(l_buffer, buffer, dwRead);
|
||||
int written = sys_write(bt->fd, l_buffer, dwRead);
|
||||
if (unlikely(written < 0))
|
||||
{
|
||||
print("Failed to write to socket: %d\n",
|
||||
written);
|
||||
print("Failed to write to socket: %d\n", written);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -483,8 +478,7 @@ void PipeBufferOutThread(LPVOID lpParam)
|
||||
written += sys_write(bt->fd, buffer + written, dwRead - written);
|
||||
if (unlikely(last_written == written))
|
||||
{
|
||||
print("Failed to write to socket: %d\n",
|
||||
GetErrorMessage());
|
||||
print("Failed to write to socket: %s\n", GetErrorMessage());
|
||||
Sleep(1000);
|
||||
continue;
|
||||
}
|
||||
@@ -547,16 +541,31 @@ NewConnection:
|
||||
int fd;
|
||||
if (IsLinux)
|
||||
{
|
||||
unsigned long socketArgs[] = {
|
||||
(unsigned long)AF_UNIX,
|
||||
(unsigned long)SOCK_STREAM,
|
||||
0};
|
||||
// unsigned long socketArgs[] = {
|
||||
// (unsigned long)AF_UNIX,
|
||||
// (unsigned long)SOCK_STREAM,
|
||||
// 0};
|
||||
unsigned long *socketArgs = sys_mmap(0x21000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
|
||||
socketArgs[0] = (unsigned long)AF_UNIX;
|
||||
socketArgs[1] = (unsigned long)SOCK_STREAM;
|
||||
socketArgs[2] = 0;
|
||||
fd = sys_socketcall(SYS_SOCKET, socketArgs);
|
||||
|
||||
/* FIXME: WSAEAFNOSUPPORT: https://gitlab.winehq.org/wine/wine/-/merge_requests/2786 */
|
||||
// WSADATA wsaData;
|
||||
// int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
|
||||
// if (iResult != 0)
|
||||
// printf("WSAStartup failed: %d\n", iResult);
|
||||
// fd = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
}
|
||||
else
|
||||
fd = sys_socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
|
||||
print("Socket %d created\n", fd);
|
||||
if (fd == INVALID_SOCKET)
|
||||
{
|
||||
print("invalid socket: %d %d\n", fd, WSAGetLastError());
|
||||
ExitProcess(1);
|
||||
}
|
||||
|
||||
if (fd < 0)
|
||||
{
|
||||
@@ -567,6 +576,8 @@ NewConnection:
|
||||
ExitProcess(1);
|
||||
}
|
||||
|
||||
print("Socket %d created\n", fd);
|
||||
|
||||
ConnectToSocket(fd);
|
||||
print("Connected to Discord\n");
|
||||
|
||||
|
Reference in New Issue
Block a user