@@ -252,17 +252,26 @@ INT WINAPI wWinMain(
252
252
HANDLE mutantHandle ;
253
253
OBJECT_ATTRIBUTES oa ;
254
254
UNICODE_STRING mutantName ;
255
+ PPH_STRING objectName ;
256
+ PH_FORMAT format [2 ];
257
+
258
+ PhInitFormatS (& format [0 ], L"PhMutant_" );
259
+ PhInitFormatU (& format [1 ], HandleToUlong (NtCurrentProcessId ()));
260
+
261
+ objectName = PhFormat (format , 2 , 16 );
262
+ PhStringRefToUnicodeString (& objectName -> sr , & mutantName );
255
263
256
- RtlInitUnicodeString (& mutantName , L"\\BaseNamedObjects\\ProcessHackerMutant" );
257
264
InitializeObjectAttributes (
258
265
& oa ,
259
266
& mutantName ,
260
- 0 ,
261
- NULL ,
267
+ OBJ_CASE_INSENSITIVE ,
268
+ PhGetNamespaceHandle () ,
262
269
NULL
263
270
);
264
271
265
272
NtCreateMutant (& mutantHandle , MUTANT_ALL_ACCESS , & oa , FALSE);
273
+
274
+ PhDereferenceObject (objectName );
266
275
}
267
276
268
277
// Set priority.
@@ -418,26 +427,48 @@ VOID PhUnregisterMessageLoopFilter(
418
427
PhFree (FilterEntry );
419
428
}
420
429
421
- VOID PhActivatePreviousInstance (
422
- VOID
430
+ static BOOLEAN NTAPI PhpPreviousInstancesCallback (
431
+ _In_ PPH_STRINGREF Name ,
432
+ _In_ PPH_STRINGREF TypeName ,
433
+ _In_opt_ PVOID Context
423
434
)
424
435
{
425
- HWND hwnd ;
426
-
427
- hwnd = FindWindow ( PH_MAINWND_CLASSNAME , NULL ) ;
436
+ ULONG64 processId64 ;
437
+ PH_STRINGREF firstPart ;
438
+ PH_STRINGREF secondPart ;
428
439
429
- if (hwnd )
440
+ if (
441
+ PhStartsWithStringRef2 (Name , L"PhMutant_" , TRUE) &&
442
+ PhSplitStringRefAtChar (Name , L'_' , & firstPart , & secondPart ) &&
443
+ PhStringToInteger64 (& secondPart , 10 , & processId64 )
444
+ )
430
445
{
431
- ULONG_PTR result ;
446
+ HWND hwnd ;
432
447
433
- SendMessageTimeout ( hwnd , WM_PH_ACTIVATE , PhStartupParameters . SelectPid , 0 , SMTO_BLOCK , 5000 , & result );
448
+ hwnd = PhGetProcessMainWindow (( HANDLE ) processId64 , NULL );
434
449
435
- if (result == PH_ACTIVATE_REPLY )
450
+ if (hwnd )
436
451
{
437
- SetForegroundWindow (hwnd );
438
- RtlExitUserProcess (STATUS_SUCCESS );
452
+ ULONG_PTR result ;
453
+
454
+ SendMessageTimeout (hwnd , WM_PH_ACTIVATE , PhStartupParameters .SelectPid , 0 , SMTO_BLOCK , 5000 , & result );
455
+
456
+ if (result == PH_ACTIVATE_REPLY )
457
+ {
458
+ SetForegroundWindow (hwnd );
459
+ RtlExitUserProcess (STATUS_SUCCESS );
460
+ }
439
461
}
440
462
}
463
+
464
+ return TRUE;
465
+ }
466
+
467
+ VOID PhActivatePreviousInstance (
468
+ VOID
469
+ )
470
+ {
471
+ PhEnumDirectoryObjects (PhGetNamespaceHandle (), PhpPreviousInstancesCallback , NULL );
441
472
}
442
473
443
474
VOID PhInitializeCommonControls (
0 commit comments