summaryrefslogtreecommitdiff
path: root/sal/systools/win32/uwinapi/EnumProcesses.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sal/systools/win32/uwinapi/EnumProcesses.cpp')
-rw-r--r--sal/systools/win32/uwinapi/EnumProcesses.cpp41
1 files changed, 41 insertions, 0 deletions
diff --git a/sal/systools/win32/uwinapi/EnumProcesses.cpp b/sal/systools/win32/uwinapi/EnumProcesses.cpp
new file mode 100644
index 000000000000..b98541ff1f40
--- /dev/null
+++ b/sal/systools/win32/uwinapi/EnumProcesses.cpp
@@ -0,0 +1,41 @@
+#include "macros.h"
+#include <tlhelp32.h>
+
+IMPLEMENT_THUNK( psapi, WINDOWS, BOOL, WINAPI, EnumProcesses, ( LPDWORD lpProcesses, DWORD cbSize, LPDWORD lpcbCopied ) )
+{
+ BOOL fSuccess = FALSE;
+ HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
+
+ if ( IsValidHandle( hSnapshot ) )
+ {
+ PROCESSENTRY32 pe;
+
+ if ( lpcbCopied )
+ *lpcbCopied = 0;
+
+ pe.dwSize = sizeof(pe);
+ if ( Process32First( hSnapshot, &pe ) )
+ {
+ fSuccess = TRUE;
+
+ while ( cbSize >= sizeof(*lpProcesses) )
+ {
+ *(lpProcesses++) = pe.th32ProcessID;
+ if ( lpcbCopied )
+ *lpcbCopied += sizeof(*lpProcesses);
+ cbSize -= sizeof(*lpProcesses);
+
+ if ( !Process32Next( hSnapshot, &pe ) )
+ break;
+ }
+ }
+
+ CloseHandle( hSnapshot );
+ }
+ else
+ SetLastError( ERROR_INVALID_HANDLE );
+
+ return fSuccess;
+}
+
+