| OLD | NEW | 
|    1 /** |    1 /** | 
|    2  * \file process.h |    2  * \file process.h | 
|    3  */ |    3  */ | 
|    4  |    4  | 
|    5 #ifndef PROCESS_H |    5 #ifndef PROCESS_H | 
|    6 #define PROCESS_H |    6 #define PROCESS_H | 
|    7  |    7  | 
 |    8 #include "installer-lib.h" | 
|    8 #include "handle.h" |    9 #include "handle.h" | 
|    9  |   10  | 
|   10 #include <string> |   11 #include <string> | 
|   11 #include <cctype> |   12 #include <cctype> | 
|   12 #include <vector> |   13 #include <vector> | 
|   13 #include <set> |   14 #include <set> | 
|   14 #include <algorithm> |   15 #include <algorithm> | 
|   15 #include <memory> |   16 #include <memory> | 
|   16  |   17  | 
|   17 #include <Windows.h> |   18 #include <Windows.h> | 
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   56         continue ; |   57         continue ; | 
|   57       } |   58       } | 
|   58       return ( l1 < l2 ) ? -1 : +1 ; |   59       return ( l1 < l2 ) ? -1 : +1 ; | 
|   59     } |   60     } | 
|   60     return 0  ; |   61     return 0  ; | 
|   61   } |   62   } | 
|   62 } ; |   63 } ; | 
|   63  |   64  | 
|   64 typedef std::basic_string< wchar_t, ci_traits< wchar_t > > wstring_ci ; |   65 typedef std::basic_string< wchar_t, ci_traits< wchar_t > > wstring_ci ; | 
|   65  |   66  | 
|   66  |  | 
|   67 //------------------------------------------------------- |   67 //------------------------------------------------------- | 
|   68 // file_name_set: case-insensitive wide-string set |   68 // file_name_set: case-insensitive wide-string set | 
|   69 //------------------------------------------------------- |   69 //------------------------------------------------------- | 
|   70 struct file_name_set |   70 struct file_name_set | 
|   71   : public std::set< wstring_ci > |   71   : public std::set< wstring_ci > | 
|   72 { |   72 { | 
|   73   /** |   73   /** | 
|   74    * Empty set constructor. |   74    * Empty set constructor. | 
|   75    */ |   75    */ | 
|   76   file_name_set() |   76   file_name_set() | 
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  160  * |  160  * | 
|  161  * \sa |  161  * \sa | 
|  162  *   MSDN [GetWindowThreadProcessId function](http://msdn.microsoft.com/en-us/li
     brary/windows/desktop/ms633522%28v=vs.85%29.aspx) |  162  *   MSDN [GetWindowThreadProcessId function](http://msdn.microsoft.com/en-us/li
     brary/windows/desktop/ms633522%28v=vs.85%29.aspx) | 
|  163  */ |  163  */ | 
|  164 DWORD creator_process( HWND window ) ; |  164 DWORD creator_process( HWND window ) ; | 
|  165  |  165  | 
|  166 //------------------------------------------------------- |  166 //------------------------------------------------------- | 
|  167 // Snapshot |  167 // Snapshot | 
|  168 //------------------------------------------------------- |  168 //------------------------------------------------------- | 
|  169 /** |  169 /** | 
|  170  * A snapshot of all the processes running on the system. |  170  * Traits class for snapshots of all processes on the system. | 
 |  171  */ | 
 |  172 struct Process_Snapshot_Traits | 
 |  173 { | 
 |  174   /** | 
 |  175    * The type of the data resulting from CreateToolhelp32Snapshot. | 
 |  176    */ | 
 |  177   typedef PROCESSENTRY32W result_type ; | 
 |  178  | 
 |  179   /** | 
 |  180    * Flags used to call CreateToolhelp32Snapshot. | 
 |  181    */ | 
 |  182   const static DWORD snapshot_flags = TH32CS_SNAPPROCESS ; | 
 |  183  | 
 |  184   /** | 
 |  185    * Wrapper for 'first' function for processes | 
 |  186    */ | 
 |  187   static BOOL first( HANDLE arg1, LPPROCESSENTRY32 arg2 ) | 
 |  188   { | 
 |  189     return ::Process32First( arg1, arg2 ) ; | 
 |  190   } | 
 |  191  | 
 |  192   /** | 
 |  193    * Wrapper for 'next' function for processes | 
 |  194    */ | 
 |  195   static BOOL next( HANDLE arg1, LPPROCESSENTRY32 arg2 ) | 
 |  196   { | 
 |  197     return ::Process32Next( arg1, arg2 ) ; | 
 |  198   } | 
 |  199 } ; | 
 |  200  | 
 |  201 /** | 
 |  202  * Traits class for snapshots of all modules loaded by a process. | 
 |  203  */ | 
 |  204 struct Module_Snapshot_Traits | 
 |  205 { | 
 |  206   /** | 
 |  207    * The type of the data resulting from CreateToolhelp32Snapshot. | 
 |  208    */ | 
 |  209   typedef MODULEENTRY32W result_type ; | 
 |  210  | 
 |  211   /** | 
 |  212    * Flags used to call CreateToolhelp32Snapshot. | 
 |  213    */ | 
 |  214   const static DWORD snapshot_flags = TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32 ; | 
 |  215  | 
 |  216   /** | 
 |  217    * Wrapper for 'first' function for modules | 
 |  218    */ | 
 |  219   static BOOL first( HANDLE arg1, LPMODULEENTRY32 arg2 ) | 
 |  220   { | 
 |  221     return ::Module32First( arg1, arg2 ) ; | 
 |  222   } | 
 |  223  | 
 |  224   /** | 
 |  225    * Wrapper for 'next' function for modules | 
 |  226    */ | 
 |  227   static BOOL next( HANDLE arg1, LPMODULEENTRY32 arg2 ) | 
 |  228   { | 
 |  229     return ::Module32Next( arg1, arg2 ) ; | 
 |  230   } | 
 |  231 } ; | 
 |  232  | 
 |  233 /** | 
 |  234  * A snapshot wrapping the results of CreateToolhelp32Snapshot system call. | 
|  171  * |  235  * | 
|  172  * Unfortunately, we cannot provide standard iterator for this class. |  236  * Unfortunately, we cannot provide standard iterator for this class. | 
|  173  * Standard iterators must be copy-constructible, which entails the possibility 
     of multiple, coexisting iteration states. |  237  * Standard iterators must be copy-constructible, which entails the possibility 
     of multiple, coexisting iteration states. | 
|  174  * The iteration behavior provided by Process32First and Process32Next relies up
     on state held within the snapshot itself. |  238  * The iteration behavior provided by Process32First and Process32Next relies up
     on state held within the snapshot itself. | 
|  175  * Thus, there can be only one iterator at a time for the snapshot. |  239  * Thus, there can be only one iterator at a time for the snapshot. | 
|  176  * The two requirements are not simultaneously satisfiable. |  240  * The two requirements are not simultaneously satisfiable. | 
|  177  * |  241  * | 
|  178  * As a substitute for a standard iterator, we provide a few functions mimicking
      the pattern of standard iterators. |  242  * Instead of a standard iterator, we provide a first() and next() functions wra
     pping the corresponding system calls. | 
|  179  * This class acts as its own iterator. |  | 
|  180  * The pointer returned is either one to the member variable "process" or else 0
     . |  | 
|  181  * |  243  * | 
|  182  * \par Implementation |  244  * \par Implementation | 
|  183  * |  245  * | 
|  184  * - MSDN [CreateToolhelp32Snapshot function](http://msdn.microsoft.com/en-us/li
     brary/windows/desktop/ms682489%28v=vs.85%29.aspx) |  246  * - MSDN [CreateToolhelp32Snapshot function](http://msdn.microsoft.com/en-us/li
     brary/windows/desktop/ms682489%28v=vs.85%29.aspx) | 
|  185  * - MSDN [Process32First function](http://msdn.microsoft.com/en-us/library/wind
     ows/desktop/ms684834%28v=vs.85%29.aspx) |  247  * - MSDN [Process32First function](http://msdn.microsoft.com/en-us/library/wind
     ows/desktop/ms684834%28v=vs.85%29.aspx) | 
|  186  * - MSDN [Process32Next function](http://msdn.microsoft.com/en-us/library/windo
     ws/desktop/ms684836%28v=vs.85%29.aspx) |  248  * - MSDN [Process32Next function](http://msdn.microsoft.com/en-us/library/windo
     ws/desktop/ms684836%28v=vs.85%29.aspx) | 
|  187  * - MSDN [PROCESSENTRY32 structure](http://msdn.microsoft.com/en-us/library/win
     dows/desktop/ms684839%28v=vs.85%29.aspx) |  249  * - MSDN [PROCESSENTRY32 structure](http://msdn.microsoft.com/en-us/library/win
     dows/desktop/ms684839%28v=vs.85%29.aspx) | 
 |  250  * | 
 |  251  * \par Design Note | 
 |  252  *   The traits class defines first() and next() functions instead of using func
     tion pointers. | 
 |  253  *   This arises from a limitation in the compiler. | 
 |  254  *   The system calls are declared 'WINAPI', which is a compiler-specific extens
     ion. | 
 |  255  *   That extension, however, does not go far enough to be able to declare a poi
     nter with the same modifier. | 
 |  256  *   Hence the system calls must be called directly; they are wrapped in the tra
     it functions. | 
|  188  */ |  257  */ | 
 |  258 template< class Traits > | 
|  189 class Snapshot |  259 class Snapshot | 
|  190 { |  260 { | 
 |  261 public: | 
|  191   /** |  262   /** | 
|  192    * Handle to the process snapshot. |  263    * Expose the result type from the traits class as our own. | 
 |  264    */ | 
 |  265   typedef typename Traits::result_type result_type ; | 
 |  266  | 
 |  267 private: | 
 |  268   /** | 
 |  269    * Process ID argument for CreateToolhelp32Snapshot. | 
 |  270    */ | 
 |  271   DWORD _id ; | 
 |  272  | 
 |  273   /** | 
 |  274    * Handle to the underlying snapshot. | 
|  193    */ |  275    */ | 
|  194   Windows_Handle handle ; |  276   Windows_Handle handle ; | 
|  195  |  277  | 
|  196   /** |  278   /** | 
|  197    * Buffer for reading a single process entry out of the snapshot. |  279    * Buffer for reading a single process entry out of the snapshot. | 
 |  280    * | 
 |  281    * This buffer is constant insofar as the code outside this class is concerned
     . | 
 |  282    * The accessor functions first() and next() return pointers to constant resul
     t_type. | 
|  198    */ |  283    */ | 
|  199   PROCESSENTRY32W process; |  284   result_type buffer; | 
|  200  |  285  | 
|  201   /** |  286   /** | 
|  202    * Copy constructor declared private and not defined. |  287    * Copy constructor declared private and not defined. | 
|  203    * |  288    * | 
|  204    * \par Implementation |  289    * \par Implementation | 
|  205    *   Add "= delete" for C++11. |  290    *   Add "= delete" for C++11. | 
|  206    */ |  291    */ | 
|  207   Snapshot( const Snapshot & ) ; |  292   Snapshot( const Snapshot & ) ; | 
|  208  |  293  | 
|  209   /** |  294   /** | 
|  210    * Copy assignment declared private and not defined. |  295    * Copy assignment declared private and not defined. | 
|  211    * |  296    * | 
|  212    * \par Implementation |  297    * \par Implementation | 
|  213    *   Add "= delete" for C++11. |  298    *   Add "= delete" for C++11. | 
|  214    */ |  299    */ | 
|  215   Snapshot operator=( const Snapshot & ) ; |  300   Snapshot operator=( const Snapshot & ) ; | 
|  216  |  301  | 
 |  302   /** | 
 |  303    * Create a new snapshot and return its handle. | 
 |  304    */ | 
 |  305   Windows_Handle::handle_type make_handle() | 
 |  306   { | 
 |  307     Windows_Handle::handle_type h = ::CreateToolhelp32Snapshot( Traits::snapshot
     _flags, _id ) ; | 
 |  308     if ( h == INVALID_HANDLE_VALUE ) | 
 |  309     { | 
 |  310       throw windows_api_error( "CreateToolhelp32Snapshot", "INVALID_HANDLE_VALUE
     " ) ; | 
 |  311     } | 
 |  312     return h ; | 
 |  313   } | 
 |  314  | 
 |  315 protected: | 
 |  316   /** | 
 |  317    * Constructor takes a snapshot. | 
 |  318    */ | 
 |  319   Snapshot( DWORD id ) | 
 |  320     : _id( id ), handle( make_handle() ) | 
 |  321   { | 
 |  322     // The various result types all define 'dwSize' with the same semantics. | 
 |  323     buffer.dwSize = sizeof( result_type ) ; | 
 |  324   } | 
|  217  |  325  | 
|  218 public: |  326 public: | 
|  219   /** |  327   /** | 
|  220    * Default constructor takes the snapshot. |  328    * Reconstruct the current instance with a new system snapshot. | 
 |  329    * | 
 |  330    * This function uses reinitialization assignment in the Windows_Handle class, | 
 |  331    *   which takes care of closing the old handle. | 
|  221    */ |  332    */ | 
|  222   Snapshot() ; |  333   void refresh() | 
 |  334   { | 
 |  335     handle = make_handle(); | 
 |  336   } | 
|  223  |  337  | 
|  224   /** |  338   /** | 
|  225    * Reconstruct the current instance with a new system snapshot. |  339    * Retrieve the first snapshot item into our member buffer. | 
 |  340    * | 
 |  341    * \return | 
 |  342    *   Pointer to our member buffer if there was a first item | 
 |  343    *   0 otherwise | 
 |  344    * | 
 |  345    * \par Design Note | 
 |  346    *   There's no error handling in the present version of this function. | 
 |  347    *   In part that's because the underlying system call returns either true or 
     false, both of which are ordinarily valid answers. | 
 |  348    *   The trouble is that a false return is overloaded. | 
 |  349    *   It can mean either that (ordinary) there are no more items or (exceptiona
     l) the snapshot did not contain the right kind of item. | 
 |  350    *   GetLastError is no help here; it doesn't distinguish between these cases. | 
 |  351    *   The upshot is that we rely that our implementation calls the right functi
     ons on the snapshot, | 
 |  352    *     and so we ignore the case where we've passed bad arguments to the syste
     m call. | 
|  226    */ |  353    */ | 
|  227   void refresh() ; |  354   const result_type * first() | 
 |  355   { | 
 |  356     return Traits::first(handle, &buffer) ? &buffer : 0; | 
 |  357   } | 
|  228  |  358  | 
|  229   /** |  359   /** | 
|  230    * Return a pointer to the first process in the snapshot. |  360    * Retrieve the next snapshot item into our member buffer and return a pointer
      to it. | 
 |  361    * begin() must have been called first. | 
 |  362    * | 
 |  363    * \return | 
 |  364    *   Pointer to our member buffer if there was a first item | 
 |  365    *   0 otherwise | 
 |  366    * | 
 |  367    * \par Design Note | 
 |  368    *   See the Design Note for first(); the same considerations apply here. | 
|  231    */ |  369    */ | 
|  232   PROCESSENTRY32W * first() ; |  370   const result_type * next() | 
|  233  |  371   { | 
|  234   /** |  372     return Traits::next(handle, &buffer) ? &buffer : 0; | 
|  235    * Return a pointer to the next process in the snapshot. |  373   } | 
|  236    * begin() must have been called first. |  | 
|  237    */ |  | 
|  238   PROCESSENTRY32W * next() ; |  | 
|  239 } ; |  374 } ; | 
|  240  |  375  | 
|  241 class ModulesSnapshot |  376 /** | 
 |  377  * A snapshot of all processes running on the system. | 
 |  378  */ | 
 |  379 struct Process_Snapshot | 
 |  380   : public Snapshot< Process_Snapshot_Traits > | 
|  242 { |  381 { | 
|  243   /** |  382   Process_Snapshot() | 
|  244    * Handle to the process snapshot. |  383     : Snapshot( 0 )  | 
|  245    */ |  384   {} | 
|  246   Windows_Handle handle; |  385 } ; | 
|  247  |  386  | 
|  248   /** |  387 /** | 
|  249    * Buffer for reading a single module entry out of the snapshot. |  388  * A snapshot of all modules loaded for a given process. | 
|  250    */ |  389  */ | 
|  251   MODULEENTRY32W module; |  390 struct Module_Snapshot | 
|  252  |  391   : public Snapshot< Module_Snapshot_Traits > | 
|  253   /** |  392 { | 
|  254    * Copy constructor declared private and not defined. |  393   Module_Snapshot( DWORD process_id ) | 
|  255    * |  394     : Snapshot( process_id ) | 
|  256    * \par Implementation |  395   {} | 
|  257    *   Add "= delete" for C++11. |  396 } ; | 
|  258    */ |  | 
|  259   ModulesSnapshot(const ModulesSnapshot&); |  | 
|  260  |  | 
|  261   /** |  | 
|  262    * Copy assignment declared private and not defined. |  | 
|  263    * |  | 
|  264    * \par Implementation |  | 
|  265    *   Add "= delete" for C++11. |  | 
|  266    */ |  | 
|  267   ModulesSnapshot operator=(const ModulesSnapshot&); |  | 
|  268  |  | 
|  269  |  | 
|  270 public: |  | 
|  271   /** |  | 
|  272    * Default constructor takes the snapshot. |  | 
|  273    */ |  | 
|  274   ModulesSnapshot(DWORD processId); |  | 
|  275  |  | 
|  276   /** |  | 
|  277    * Return a pointer to the first process in the snapshot. |  | 
|  278    */ |  | 
|  279   MODULEENTRY32W* first(); |  | 
|  280  |  | 
|  281   /** |  | 
|  282    * Return a pointer to the next process in the snapshot. |  | 
|  283    * begin() must have been called first. |  | 
|  284    */ |  | 
|  285   MODULEENTRY32W* next(); |  | 
|  286 }; |  | 
|  287  |  | 
|  288  |  397  | 
|  289 //------------------------------------------------------- |  398 //------------------------------------------------------- | 
|  290 // initialize_process_list |  399 // initialize_process_list | 
|  291 //------------------------------------------------------- |  400 //------------------------------------------------------- | 
|  292 /** |  401 /** | 
|  293  * \tparam T The type into which a PROCESSENTRY32W struture is extracted. |  402  * \tparam T The type into which a PROCESSENTRY32W struture is extracted. | 
|  294  * \tparam Admittance Function type for argument 'admit' |  403  * \tparam Admittance Function type for argument 'admit' | 
|  295  * \tparam Extractor Function type for argument 'extract' |  404  * \tparam Extractor Function type for argument 'extract' | 
|  296  * \param admit A unary predicate function class that determines what's included |  405  * \param admit A unary predicate function class that determines what's included | 
|  297  *      A process appears in the list only if the predicate returns true.  |  406  *      A process appears in the list only if the predicate returns true.  | 
|  298  *      The use of this predicate is analogous to that in std::copy_if. |  407  *      The use of this predicate is analogous to that in std::copy_if. | 
|  299  * \param convert A conversion function that takes a PROCESSENTRY32W as input ar
     gument and returns an element of type T. |  408  * \param convert A conversion function that takes a PROCESSENTRY32W as input ar
     gument and returns an element of type T. | 
|  300  */ |  409  */ | 
|  301 template<class T, class Admittance, class Extractor> |  410 template<class T, class Admittance, class Extractor> | 
|  302 void initialize_process_list(std::vector<T>& v, Snapshot& snap, Admittance admit
      = Admittance(), Extractor extract = Extractor()) |  411 void initialize_process_list(std::vector<T>& v, Process_Snapshot &snap, Admittan
     ce admit = Admittance(), Extractor extract = Extractor()) | 
|  303 { |  412 { | 
|  304   PROCESSENTRY32W* p = snap.first(); |  413   const PROCESSENTRY32W* p = snap.first(); | 
|  305   while (p != NULL) |  414   while (p != 0) | 
|  306   { |  415   { | 
|  307     if (admit(*p )) |  416     if (admit(*p )) | 
|  308     { |  417     { | 
|  309       /* |  418       /* | 
|  310         * We don't have C++11 emplace_back, which can construct the element in p
     lace. |  419         * We don't have C++11 emplace_back, which can construct the element in p
     lace. | 
|  311         * Instead, we copy the return value of the converter. |  420         * Instead, we copy the return value of the converter. | 
|  312         */ |  421         */ | 
|  313       v.push_back(extract(*p)); |  422       v.push_back(extract(*p)); | 
|  314     } |  423     } | 
|  315     p = snap.next(); |  424     p = snap.next(); | 
|  316   } |  425   } | 
|  317 }; |  426 }; | 
|  318  |  427  | 
|  319 //------------------------------------------------------- |  428 //------------------------------------------------------- | 
|  320 // initialize_process_set |  429 // initialize_process_set | 
|  321 //------------------------------------------------------- |  430 //------------------------------------------------------- | 
|  322 /** |  431 /** | 
|  323  * \tparam T The type into which a PROCESSENTRY32W struture is extracted. |  432  * \tparam T The type into which a PROCESSENTRY32W struture is extracted. | 
|  324  * \tparam Admittance Function type for argument 'admit' |  433  * \tparam Admittance Function type for argument 'admit' | 
|  325  * \tparam Extractor Function type for argument 'extract' |  434  * \tparam Extractor Function type for argument 'extract' | 
|  326  * \param admit A unary predicate function class that determines what's included |  435  * \param admit A unary predicate function class that determines what's included | 
|  327  *      A process appears in the list only if the predicate returns true.  |  436  *      A process appears in the list only if the predicate returns true.  | 
|  328  *      The use of this predicate is analogous to that in std::copy_if. |  437  *      The use of this predicate is analogous to that in std::copy_if. | 
|  329  * \param convert A conversion function that takes a PROCESSENTRY32W as input ar
     gument and returns an element of type T. |  438  * \param convert A conversion function that takes a PROCESSENTRY32W as input ar
     gument and returns an element of type T. | 
|  330  */ |  439  */ | 
|  331 template<class T, class Admittance, class Extractor> |  440 template<class T, class Admittance, class Extractor> | 
|  332 void initialize_process_set(std::set< T > & set, Snapshot& snap, Admittance admi
     t = Admittance(), Extractor extract = Extractor()) |  441 void initialize_process_set(std::set< T > & set, Process_Snapshot &snap, Admitta
     nce admit = Admittance(), Extractor extract = Extractor()) | 
|  333 { |  442 { | 
|  334   PROCESSENTRY32W* p = snap.first(); |  443   const PROCESSENTRY32W* p = snap.first(); | 
|  335   while (p != NULL) |  444   while (p != 0) | 
|  336   { |  445   { | 
|  337     if (admit(*p)) |  446     if (admit(*p)) | 
|  338     { |  447     { | 
|  339       set.insert(extract(*p)); |  448       set.insert(extract(*p)); | 
|  340     } |  449     } | 
|  341     p = snap.next(); |  450     p = snap.next(); | 
|  342   } |  451   } | 
|  343 }; |  452 }; | 
|  344  |  453  | 
|  345 //------------------------------------------------------- |  454 //------------------------------------------------------- | 
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  507   process_by_any_exe_with_any_module filter ; |  616   process_by_any_exe_with_any_module filter ; | 
|  508  |  617  | 
|  509   /** |  618   /** | 
|  510    * Copy function object copies just the process ID. |  619    * Copy function object copies just the process ID. | 
|  511    */ |  620    */ | 
|  512   copy_PID copy ; |  621   copy_PID copy ; | 
|  513  |  622  | 
|  514   /**  |  623   /**  | 
|  515    * Snapshot of running processes. |  624    * Snapshot of running processes. | 
|  516    */ |  625    */ | 
|  517   Snapshot & snapshot ; |  626   Process_Snapshot & snapshot ; | 
|  518  |  627  | 
|  519   void update() |  628   void update() | 
|  520   { |  629   { | 
|  521     initialize_process_set( pid_set, snapshot, filter, copy ) ; |  630     initialize_process_set( pid_set, snapshot, filter, copy ) ; | 
|  522   } ; |  631   } ; | 
|  523  |  632  | 
|  524   template< class F > |  633   template< class F > | 
|  525   class only_our_processes |  634   class only_our_processes | 
|  526   { |  635   { | 
|  527     Process_Closer & self ; |  636     Process_Closer & self ; | 
| (...skipping 21 matching lines...) Expand all  Loading... | 
|  549       { |  658       { | 
|  550         // Assert the process that created the window is not in our pid_set |  659         // Assert the process that created the window is not in our pid_set | 
|  551         return true ; |  660         return true ; | 
|  552       } |  661       } | 
|  553       return f( window ) ; |  662       return f( window ) ; | 
|  554     } |  663     } | 
|  555   } ; |  664   } ; | 
|  556  |  665  | 
|  557 public: |  666 public: | 
|  558   template <size_t n_file_names, size_t n_module_names> |  667   template <size_t n_file_names, size_t n_module_names> | 
|  559   Process_Closer(Snapshot & snapshot, const wchar_t* (&file_name_list)[n_file_na
     mes], const wchar_t* (&module_name_list)[n_module_names]) |  668   Process_Closer(Process_Snapshot & snapshot, const wchar_t* (&file_name_list)[n
     _file_names], const wchar_t* (&module_name_list)[n_module_names]) | 
|  560     : snapshot(snapshot), process_names(file_name_list), module_names(module_nam
     e_list), filter(process_names, module_names) |  669     : snapshot(snapshot), process_names(file_name_list), module_names(module_nam
     e_list), filter(process_names, module_names) | 
|  561   { |  670   { | 
|  562     update() ; |  671     update() ; | 
|  563   } |  672   } | 
|  564   template <size_t n_file_names> |  673   template <size_t n_file_names> | 
|  565   Process_Closer(Snapshot & snapshot, const wchar_t * (&file_name_list)[n_file_n
     ames]) |  674   Process_Closer(Process_Snapshot & snapshot, const wchar_t * (&file_name_list)[
     n_file_names]) | 
|  566     : snapshot(snapshot), process_names(file_name_list), module_names(), filter(
     process_names, module_names) |  675     : snapshot(snapshot), process_names(file_name_list), module_names(), filter(
     process_names, module_names) | 
|  567   { |  676   { | 
|  568     update() ; |  677     update() ; | 
|  569   } |  678   } | 
|  570  |  679  | 
|  571   /** |  680   /** | 
|  572    * Refresh our state to match the snapshot state. |  681    * Refresh our state to match the snapshot state. | 
|  573    */ |  682    */ | 
|  574   void refresh() |  683   void refresh() | 
|  575   { |  684   { | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
|  589   } |  698   } | 
|  590  |  699  | 
|  591   /* |  700   /* | 
|  592    * Shut down every process in the pid_set. |  701    * Shut down every process in the pid_set. | 
|  593    */ |  702    */ | 
|  594   bool shut_down() ; |  703   bool shut_down() ; | 
|  595  |  704  | 
|  596 } ; |  705 } ; | 
|  597  |  706  | 
|  598 #endif |  707 #endif | 
| OLD | NEW |