@@ -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