Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: installer/src/installer-lib/process.cpp

Issue 5663180676136960: Make sure IE and Engine are actually being closed by custom action (Closed)
Patch Set: Created June 20, 2014, 10:33 p.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 ) ;
}
}

Powered by Google App Engine
This is Rietveld