 Issue 5663180676136960:
  Make sure IE and Engine are actually being closed by custom action  (Closed)
    
  
    Issue 5663180676136960:
  Make sure IE and Engine are actually being closed by custom action  (Closed) 
  | Index: installer/src/installer-lib/process.cpp | 
| =================================================================== | 
| --- a/installer/src/installer-lib/process.cpp | 
| +++ b/installer/src/installer-lib/process.cpp | 
| @@ -9,25 +9,32 @@ | 
| //------------------------------------------------------- | 
| //------------------------------------------------------- | 
| -bool process_by_any_exe_with_any_module::operator()( const PROCESSENTRY32W & process ) | 
| +typedef int (__stdcall *IsImmersiveDynamicFunc)(HANDLE); | 
| +bool process_by_any_exe_not_immersive::operator()( const PROCESSENTRY32W & process ) | 
| { | 
| if (processNames.find(process.szExeFile) != processNames.end()) | 
| - { | 
| - if (moduleNames.empty()) | 
| - return true; | 
| + { | 
| + // Make sure the process is still alive | 
| + HANDLE procHandle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, process.th32ProcessID); | 
| + if ((procHandle == NULL) || (procHandle == INVALID_HANDLE_VALUE)) return false; | 
| - Module_Snapshot ms(process.th32ProcessID); | 
| - const MODULEENTRY32W* me = ms.first(); | 
| - while (me != 0) | 
| - { | 
| - if (moduleNames.find(me->szModule) != moduleNames.end()) | 
| - { | 
| - return true; | 
| - } | 
| - me = ms.next(); | 
| - } | 
| + DWORD exitCode; | 
| + if (!GetExitCodeProcess(procHandle, &exitCode)) return false; | 
| + | 
| + if (exitCode != STILL_ACTIVE) return false; | 
| + | 
| + // Check if this is a Windows Store app process (we don't care for IE in Modern UI) | 
| + HINSTANCE user32Dll = LoadLibrary(L"user32.dll"); | 
| 
Eric
2014/06/25 15:08:51
What's the reason for a dynamic load of this libra
 
Oleksandr
2014/06/26 13:25:57
Why make assumptions? From MSDN http://msdn.micros
 | 
| + if (!user32Dll) return true; | 
| + | 
| + IsImmersiveDynamicFunc IsImmersiveDynamicCall = (IsImmersiveDynamicFunc)GetProcAddress(user32Dll, "IsImmersiveProcess"); | 
| + if (!IsImmersiveDynamicCall) return true; | 
| + | 
| + BOOL retValue = !IsImmersiveDynamicCall(procHandle); | 
| 
Eric
2014/06/25 15:08:51
IsImmersiveDynamicCall commingles a false result w
 
Oleksandr
2014/06/26 13:25:57
I agree it wouldn't hurt to log the GetLastError h
 | 
| + CloseHandle(procHandle); | 
| 
Eric
2014/06/25 15:08:51
Resource Leak. CloseHandle() won't be called under
 | 
| + | 
| + return retValue; | 
| } | 
| - return false; | 
| } | 
| //------------------------------------------------------- | 
| @@ -249,7 +256,7 @@ | 
| if ( acc.permit_end_session ) | 
| { | 
| - send_message m2( WM_ENDSESSION, 0, 0 ) ; | 
| + send_message m2( WM_ENDSESSION, 0, ENDSESSION_CLOSEAPP ) ; | 
| iterate_our_windows( m2 ) ; | 
| } | 
| } |