Skip to content

Commit 183ec08

Browse files
authored
Onlinectr v1021.1 (#204)
* retry loop in client.exe * fix compile * also add auto retry to the shmem
1 parent 3a5dd86 commit 183ec08

File tree

1 file changed

+73
-60
lines changed

1 file changed

+73
-60
lines changed

mods/Windows/OnlineCTR/Network_PC/Client/CL_main.cpp

Lines changed: 73 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1159,55 +1159,70 @@ int main(int argc, char *argv[])
11591159
//int enableDeferredGPU = 1;
11601160

11611161
int numDuckInstances = 0;
1162-
const char* duckTemplate = "duckstation";
11631162
int duckPID = -1;
1163+
const char* duckTemplate = "duckstation";
1164+
int duckAttempts = 0;
11641165

1165-
// copy from
1166-
// https://learn.microsoft.com/en-us/windows/win32/psapi/enumerating-all-processes
1167-
DWORD aProcesses[1024], cbNeeded, cProcesses;
1168-
EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded);
1169-
cProcesses = cbNeeded / sizeof(DWORD);
1170-
1171-
for (int i = 0; i < cProcesses; i++)
1166+
while (numDuckInstances == 0 && duckAttempts < 20)
11721167
{
1173-
DWORD processID = aProcesses[i];
1174-
1175-
if (processID != 0)
1176-
{
1177-
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID);
1178-
1179-
if (NULL != hProcess)
1180-
{
1181-
HMODULE hMod;
1182-
DWORD cbNeeded;
1183-
1184-
if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded))
1185-
{
1186-
char szProcessName[MAX_PATH];
1187-
GetModuleBaseNameA(hProcess, hMod, szProcessName, sizeof(szProcessName) / sizeof(TCHAR));
1188-
1189-
char* procName = (char*)&szProcessName[0];
1190-
1191-
if (
1192-
(*(int*)&procName[0] == *(int*)&duckTemplate[0]) &&
1193-
(*(int*)&procName[4] == *(int*)&duckTemplate[4])
1194-
)
1195-
{
1196-
numDuckInstances++;
1197-
duckPID = processID;
1198-
}
1199-
}
1200-
}
1201-
}
1168+
// copy from
1169+
// https://learn.microsoft.com/en-us/windows/win32/psapi/enumerating-all-processes
1170+
DWORD aProcesses[1024], cbNeeded, cProcesses;
1171+
EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded);
1172+
cProcesses = cbNeeded / sizeof(DWORD);
1173+
1174+
for (int i = 0; i < cProcesses; i++)
1175+
{
1176+
DWORD processID = aProcesses[i];
1177+
1178+
if (processID != 0)
1179+
{
1180+
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID);
1181+
1182+
if (NULL != hProcess)
1183+
{
1184+
HMODULE hMod;
1185+
DWORD cbNeeded;
1186+
1187+
if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded))
1188+
{
1189+
char szProcessName[MAX_PATH];
1190+
GetModuleBaseNameA(hProcess, hMod, szProcessName, sizeof(szProcessName) / sizeof(TCHAR));
1191+
1192+
char* procName = (char*)&szProcessName[0];
1193+
1194+
if (
1195+
(*(int*)&procName[0] == *(int*)&duckTemplate[0]) &&
1196+
(*(int*)&procName[4] == *(int*)&duckTemplate[4])
1197+
)
1198+
{
1199+
numDuckInstances++;
1200+
duckPID = processID;
1201+
}
1202+
}
1203+
}
1204+
}
1205+
}
1206+
1207+
if (numDuckInstances == 0)
1208+
{
1209+
printf("DuckStation is not running! waiting 5 seconds...\n\n");
1210+
1211+
Sleep(5000);
1212+
1213+
duckAttempts++;
1214+
numDuckInstances = 0;
1215+
duckPID = -1;
1216+
}
1217+
else printf("Client: DuckStation detected\n");
12021218
}
12031219

1204-
if (numDuckInstances == 0)
1220+
if (duckAttempts == 20)
12051221
{
1206-
printf("Error: DuckStation is not running!\n\n");
1222+
printf("Error: couldn't find duckstation after 20 attempts, quitting...\n\n");
12071223
system("pause");
1208-
exit(0);
1224+
exit(EXIT_FAILURE);
12091225
}
1210-
else printf("Client: DuckStation detected\n");
12111226

12121227
char pidStr[16];
12131228

@@ -1230,29 +1245,27 @@ int main(int argc, char *argv[])
12301245
TCHAR duckNameT[100];
12311246
swprintf(duckNameT, 100, L"%hs", duckName);
12321247

1233-
// 8 MB RAM
1234-
const unsigned int size = 0x800000;
1235-
HANDLE hFile = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, duckNameT);
1236-
pBuf = (char*)MapViewOfFile(hFile, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, size);
1248+
duckAttempts = 0;
1249+
1250+
while (duckAttempts < 20)
1251+
{
1252+
// 8 MB RAM
1253+
const unsigned int size = 0x800000;
1254+
HANDLE hFile = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, duckNameT);
1255+
pBuf = (char*)MapViewOfFile(hFile, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, size);
1256+
1257+
if (pBuf == 0)
1258+
{
1259+
printf("Failed to open DuckStation shmem, waiting 5 seconds...\n\n");
1260+
Sleep(5000);
1261+
}
1262+
else break;
1263+
}
12371264

12381265
if (pBuf == 0)
12391266
{
1240-
printf("Error: Failed to open DuckStation!\n\n");
1267+
printf("Error: Failed to open Duckstation shmem after 20 attempts, quitting...\n\n");
12411268
system("pause");
1242-
//system("cls");
1243-
//char* newargv[4];
1244-
//newargv[0] = argv[0];
1245-
//if (argc > 1)
1246-
// newargv[1] = argv[1];
1247-
//else
1248-
// newargv[1] = NULL;
1249-
//if (argc > 2)
1250-
// newargv[2] = argv[2];
1251-
//else
1252-
// newargv[2] = NULL;
1253-
//newargv[3] = NULL;
1254-
1255-
//execv(argv[0], newargv);
12561269
exit(EXIT_FAILURE);
12571270
}
12581271

0 commit comments

Comments
 (0)