Index: src/installer-ca/dutil/proc2utl.cpp |
=================================================================== |
new file mode 100644 |
--- /dev/null |
+++ b/src/installer-ca/dutil/proc2utl.cpp |
@@ -0,0 +1,79 @@ |
+//------------------------------------------------------------------------------------------------- |
+// <copyright file="proc2utl.cpp" company="Outercurve Foundation"> |
+// Copyright (c) 2004, Outercurve Foundation. |
+// This software is released under Microsoft Reciprocal License (MS-RL). |
+// The license and further copyright text can be found in the file |
+// LICENSE.TXT at the root directory of the distribution. |
+// </copyright> |
+// |
+// <summary> |
+// Process helper functions that require PSAPI.DLL. |
+// </summary> |
+//------------------------------------------------------------------------------------------------- |
+ |
+#include "../precomp.h" |
+ |
+/******************************************************************** |
+ ProcFindAllIdsFromExeName() - returns an array of process ids that are running specified executable. |
+ |
+*******************************************************************/ |
+extern "C" HRESULT DAPI ProcFindAllIdsFromExeName( |
+ __in_z LPCWSTR wzExeName, |
+ __out DWORD** ppdwProcessIds, |
+ __out DWORD* pcProcessIds |
+ ) |
+{ |
+ HRESULT hr = S_OK; |
+ DWORD er = ERROR_SUCCESS; |
+ HANDLE hSnap = INVALID_HANDLE_VALUE; |
+ BOOL fContinue = FALSE; |
+ PROCESSENTRY32W peData = { sizeof(peData) }; |
+ |
+ hSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); |
+ if (INVALID_HANDLE_VALUE == hSnap) |
+ { |
+ ExitWithLastError(hr, "Failed to create snapshot of processes on system"); |
+ } |
+ |
+ fContinue = ::Process32FirstW(hSnap, &peData); |
+ |
+ while (fContinue) |
+ { |
+ if (0 == lstrcmpiW((LPCWSTR)&(peData.szExeFile), wzExeName)) |
+ { |
+ if (!*ppdwProcessIds) |
+ { |
+ *ppdwProcessIds = static_cast<DWORD*>(MemAlloc(sizeof(DWORD), TRUE)); |
+ ExitOnNull(ppdwProcessIds, hr, E_OUTOFMEMORY, "Failed to allocate array for returned process IDs."); |
+ } |
+ else |
+ { |
+ DWORD* pdwReAllocReturnedPids = NULL; |
+ pdwReAllocReturnedPids = static_cast<DWORD*>(MemReAlloc(*ppdwProcessIds, sizeof(DWORD) * ((*pcProcessIds) + 1), TRUE)); |
+ ExitOnNull(pdwReAllocReturnedPids, hr, E_OUTOFMEMORY, "Failed to re-allocate array for returned process IDs."); |
+ |
+ *ppdwProcessIds = pdwReAllocReturnedPids; |
+ } |
+ |
+ (*ppdwProcessIds)[*pcProcessIds] = peData.th32ProcessID; |
+ ++(*pcProcessIds); |
+ } |
+ |
+ fContinue = ::Process32NextW(hSnap, &peData); |
+ } |
+ |
+ er = ::GetLastError(); |
+ if (ERROR_NO_MORE_FILES == er) |
+ { |
+ hr = S_OK; |
+ } |
+ else |
+ { |
+ hr = HRESULT_FROM_WIN32(er); |
+ } |
+ |
+LExit: |
+ ReleaseFile(hSnap); |
+ |
+ return hr; |
+} |