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

Side by Side 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.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
1 #include <stdexcept> 1 #include <stdexcept>
2 #include <functional> 2 #include <functional>
3 #include <wctype.h> 3 #include <wctype.h>
4 // <thread> is C++11, but implemented in VS2012 4 // <thread> is C++11, but implemented in VS2012
5 #include <thread> 5 #include <thread>
6 6
7 #include "installer-lib.h" 7 #include "installer-lib.h"
8 #include "process.h" 8 #include "process.h"
9 9
10 //------------------------------------------------------- 10 //-------------------------------------------------------
11 //------------------------------------------------------- 11 //-------------------------------------------------------
12 bool process_by_any_exe_with_any_module::operator()( const PROCESSENTRY32W & pro cess ) 12 typedef int (__stdcall *IsImmersiveDynamicFunc)(HANDLE);
13 bool process_by_any_exe_not_immersive::operator()( const PROCESSENTRY32W & proce ss )
13 { 14 {
14 if (processNames.find(process.szExeFile) != processNames.end()) 15 if (processNames.find(process.szExeFile) != processNames.end())
15 { 16 {
16 if (moduleNames.empty()) 17 // Make sure the process is still alive
17 return true; 18 HANDLE procHandle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, process.th 32ProcessID);
19 if ((procHandle == NULL) || (procHandle == INVALID_HANDLE_VALUE)) return fal se;
18 20
19 Module_Snapshot ms(process.th32ProcessID); 21 DWORD exitCode;
20 const MODULEENTRY32W* me = ms.first(); 22 if (!GetExitCodeProcess(procHandle, &exitCode)) return false;
21 while (me != 0) 23
22 { 24 if (exitCode != STILL_ACTIVE) return false;
23 if (moduleNames.find(me->szModule) != moduleNames.end()) 25
24 { 26 // Check if this is a Windows Store app process (we don't care for IE in Mod ern UI)
25 return true; 27 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
26 } 28 if (!user32Dll) return true;
27 me = ms.next(); 29
28 } 30 IsImmersiveDynamicFunc IsImmersiveDynamicCall = (IsImmersiveDynamicFunc)GetP rocAddress(user32Dll, "IsImmersiveProcess");
31 if (!IsImmersiveDynamicCall) return true;
32
33 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
34 CloseHandle(procHandle);
Eric 2014/06/25 15:08:51 Resource Leak. CloseHandle() won't be called under
35
36 return retValue;
29 } 37 }
30 return false;
31 } 38 }
32 39
33 //------------------------------------------------------- 40 //-------------------------------------------------------
34 // creator_process 41 // creator_process
35 //------------------------------------------------------- 42 //-------------------------------------------------------
36 DWORD creator_process( HWND window ) 43 DWORD creator_process( HWND window )
37 { 44 {
38 DWORD pid ; 45 DWORD pid ;
39 DWORD r = GetWindowThreadProcessId( window, & pid ) ; 46 DWORD r = GetWindowThreadProcessId( window, & pid ) ;
40 if ( r == 0 ) 47 if ( r == 0 )
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 * Send WM_ENDSESSION if all processes are ready to shut down. 249 * Send WM_ENDSESSION if all processes are ready to shut down.
243 * We try this technique first, since this allows an application to restore its application state when it starts up again. 250 * We try this technique first, since this allows an application to restore its application state when it starts up again.
244 */ 251 */
245 { 252 {
246 endsession_accumulator acc ; 253 endsession_accumulator acc ;
247 send_message m1( WM_QUERYENDSESSION, 0, ENDSESSION_CLOSEAPP, acc ) ; 254 send_message m1( WM_QUERYENDSESSION, 0, ENDSESSION_CLOSEAPP, acc ) ;
248 iterate_our_windows( m1 ) ; 255 iterate_our_windows( m1 ) ;
249 256
250 if ( acc.permit_end_session ) 257 if ( acc.permit_end_session )
251 { 258 {
252 send_message m2( WM_ENDSESSION, 0, 0 ) ; 259 send_message m2( WM_ENDSESSION, 0, ENDSESSION_CLOSEAPP ) ;
253 iterate_our_windows( m2 ) ; 260 iterate_our_windows( m2 ) ;
254 } 261 }
255 } 262 }
256 break ; 263 break ;
257 264
258 case 2 : 265 case 2 :
259 { 266 {
260 /* 267 /*
261 * Send WM_QUERYENDSESSION and WM_ENDSESSION to every admissible window s ingly, not accumulating results. 268 * Send WM_QUERYENDSESSION and WM_ENDSESSION to every admissible window s ingly, not accumulating results.
262 */ 269 */
(...skipping 29 matching lines...) Expand all
292 if ( ! is_running() ) 299 if ( ! is_running() )
293 { 300 {
294 return true ; 301 return true ;
295 } 302 }
296 } 303 }
297 // Assert is_running() 304 // Assert is_running()
298 } 305 }
299 // No control path leaves the for-loop. 306 // No control path leaves the for-loop.
300 } ; 307 } ;
301 308
OLDNEW

Powered by Google App Engine
This is Rietveld