Skip to content

Commit 995db80

Browse files
authored
Update recipe-576362.py, for x64 and unicode
New version uses size_t instead of uint, so it works on both x32 and x64. Added Unicode versions of functions where available. PROCESSENTRY32 had two fields no more in MSDN. And recipe converted to python 3.
1 parent 73b09ed commit 995db80

File tree

1 file changed

+142
-67
lines changed

1 file changed

+142
-67
lines changed

recipes/Python/576362_List_System_Process_Process/recipe-576362.py

+142-67
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,72 @@
1-
from ctypes import c_long , c_int , c_uint , c_char , c_ubyte , c_char_p , c_void_p
1+
from ctypes import c_long , c_int , c_uint , c_char , c_ubyte , c_char_p , c_void_p, c_size_t, c_ulong, c_wchar
22
from ctypes import windll
33
from ctypes import Structure
44
from ctypes import sizeof , POINTER , pointer , cast
55

66
# const variable
77
TH32CS_SNAPPROCESS = 2
8-
STANDARD_RIGHTS_REQUIRED = 0x000F0000
9-
SYNCHRONIZE = 0x00100000
10-
PROCESS_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)
118
TH32CS_SNAPMODULE = 0x00000008
129
TH32CS_SNAPTHREAD = 0x00000004
1310

11+
STANDARD_RIGHTS_REQUIRED = 0x000F0000
12+
SYNCHRONIZE = 0x00100000
13+
PROCESS_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)
1414

15-
# struct
16-
class PROCESSENTRY32(Structure):
17-
_fields_ = [ ( 'dwSize' , c_uint ) ,
18-
( 'cntUsage' , c_uint) ,
19-
( 'th32ProcessID' , c_uint) ,
20-
( 'th32DefaultHeapID' , c_uint) ,
21-
( 'th32ModuleID' , c_uint) ,
22-
( 'cntThreads' , c_uint) ,
23-
( 'th32ParentProcessID' , c_uint) ,
15+
MAX_PATH=260
16+
MAX_MODULE_NAME32 = 255
17+
18+
# originally just PROCESSENTRY32
19+
class PROCESSENTRY32A(Structure):
20+
_fields_ = [ ( 'dwSize' , c_ulong ) ,
21+
( 'cntUsage' , c_ulong) ,
22+
( 'th32ProcessID' , c_ulong) ,
23+
( 'th32DefaultHeapID' , c_size_t) ,
24+
( 'th32ModuleID' , c_ulong) ,
25+
( 'cntThreads' , c_ulong) ,
26+
( 'th32ParentProcessID' , c_ulong) ,
2427
( 'pcPriClassBase' , c_long) ,
25-
( 'dwFlags' , c_uint) ,
26-
( 'szExeFile' , c_char * 260 ) ,
27-
( 'th32MemoryBase' , c_long) ,
28-
( 'th32AccessKey' , c_long ) ]
29-
30-
31-
class MODULEENTRY32(Structure):
32-
_fields_ = [ ( 'dwSize' , c_long ) ,
33-
( 'th32ModuleID' , c_long ),
34-
( 'th32ProcessID' , c_long ),
35-
( 'GlblcntUsage' , c_long ),
36-
( 'ProccntUsage' , c_long ) ,
37-
( 'modBaseAddr' , c_long ) ,
38-
( 'modBaseSize' , c_long ) ,
28+
( 'dwFlags' , c_ulong) ,
29+
( 'szExeFile' , c_char * MAX_PATH ) ]
30+
31+
# c_wchar instead of c_char is the only difference
32+
class PROCESSENTRY32W(Structure):
33+
_fields_ = [ ( 'dwSize' , c_ulong ) ,
34+
( 'cntUsage' , c_ulong) ,
35+
( 'th32ProcessID' , c_ulong) ,
36+
( 'th32DefaultHeapID' , c_size_t) ,
37+
( 'th32ModuleID' , c_ulong) ,
38+
( 'cntThreads' , c_ulong) ,
39+
( 'th32ParentProcessID' , c_ulong) ,
40+
( 'pcPriClassBase' , c_long) ,
41+
( 'dwFlags' , c_ulong) ,
42+
( 'szExeFile' , c_wchar * MAX_PATH ) ]
43+
44+
# originally just MODULEENTRY32
45+
class MODULEENTRY32A(Structure):
46+
_fields_ = [ ( 'dwSize' , c_ulong ) ,
47+
( 'th32ModuleID' , c_ulong ),
48+
( 'th32ProcessID' , c_ulong ),
49+
( 'GlblcntUsage' , c_ulong ),
50+
( 'ProccntUsage' , c_ulong ) ,
51+
( 'modBaseAddr' , c_size_t ) , #POINTER(c_ubyte) in MSDN
52+
( 'modBaseSize' , c_ulong ) ,
3953
( 'hModule' , c_void_p ) ,
40-
( 'szModule' , c_char * 256 ),
41-
( 'szExePath' , c_char * 260 ) ]
42-
54+
( 'szModule' , c_char * (MAX_MODULE_NAME32+1) ),
55+
( 'szExePath' , c_char * MAX_PATH ) ]
56+
57+
# c_wchar instead of c_char is the only difference
58+
class MODULEENTRY32W(Structure):
59+
_fields_ = [ ( 'dwSize' , c_ulong ) ,
60+
( 'th32ModuleID' , c_ulong ),
61+
( 'th32ProcessID' , c_ulong ),
62+
( 'GlblcntUsage' , c_ulong ),
63+
( 'ProccntUsage' , c_ulong ) ,
64+
( 'modBaseAddr' , c_size_t ) , #POINTER(c_ubyte) in MSDN
65+
( 'modBaseSize' , c_ulong ) ,
66+
( 'hModule' , c_void_p ) ,
67+
( 'szModule' , c_wchar * (MAX_MODULE_NAME32+1) ),
68+
( 'szExePath' , c_wchar * MAX_PATH ) ]
69+
4370
class THREADENTRY32(Structure):
4471
_fields_ = [
4572
('dwSize' , c_long ),
@@ -58,46 +85,94 @@ class THREADENTRY32(Structure):
5885
## CreateToolhelp32Snapshot
5986
CreateToolhelp32Snapshot= windll.kernel32.CreateToolhelp32Snapshot
6087
CreateToolhelp32Snapshot.reltype = c_long
61-
CreateToolhelp32Snapshot.argtypes = [ c_int , c_int ]
88+
CreateToolhelp32Snapshot.argtypes = [ c_ulong , c_ulong ]
89+
90+
6291
## Process32First
63-
Process32First = windll.kernel32.Process32First
64-
Process32First.argtypes = [ c_void_p , POINTER( PROCESSENTRY32 ) ]
65-
Process32First.rettype = c_int
92+
Process32FirstA = windll.kernel32.Process32First
93+
Process32FirstA.argtypes = [ c_void_p , POINTER( PROCESSENTRY32A ) ]
94+
Process32FirstA.rettype = c_int
95+
96+
## Process32FirstW
97+
Process32FirstW = windll.kernel32.Process32FirstW
98+
Process32FirstW.argtypes = [ c_void_p , POINTER( PROCESSENTRY32W ) ]
99+
Process32FirstW.rettype = c_int
100+
66101
## Process32Next
67-
Process32Next = windll.kernel32.Process32Next
68-
Process32Next.argtypes = [ c_void_p , POINTER(PROCESSENTRY32) ]
69-
Process32Next.rettype = c_int
102+
Process32NextA = windll.kernel32.Process32Next
103+
Process32NextA.argtypes = [ c_void_p , POINTER(PROCESSENTRY32A) ]
104+
Process32NextA.rettype = c_int
105+
106+
## Process32NextW
107+
Process32NextW = windll.kernel32.Process32NextW
108+
Process32NextW.argtypes = [ c_void_p , POINTER(PROCESSENTRY32W) ]
109+
Process32NextW.rettype = c_int
110+
70111
## OpenProcess
71112
OpenProcess = windll.kernel32.OpenProcess
72-
OpenProcess.argtypes = [ c_void_p , c_int , c_long ]
73-
OpenProcess.rettype = c_long
113+
OpenProcess.argtypes = [ c_ulong , c_int , c_ulong ]
114+
OpenProcess.rettype = c_void_p
115+
74116
## GetPriorityClass
75117
GetPriorityClass = windll.kernel32.GetPriorityClass
76118
GetPriorityClass.argtypes = [ c_void_p ]
77119
GetPriorityClass.rettype = c_long
120+
78121
## CloseHandle
79122
CloseHandle = windll.kernel32.CloseHandle
80123
CloseHandle.argtypes = [ c_void_p ]
81124
CloseHandle.rettype = c_int
125+
82126
## Module32First
83-
Module32First = windll.kernel32.Module32First
84-
Module32First.argtypes = [ c_void_p , POINTER(MODULEENTRY32) ]
85-
Module32First.rettype = c_int
127+
Module32FirstA = windll.kernel32.Module32First
128+
Module32FirstA.argtypes = [ c_void_p , POINTER(MODULEENTRY32A) ]
129+
Module32FirstA.rettype = c_int
130+
131+
## Module32FirstW
132+
Module32FirstW = windll.kernel32.Module32FirstW
133+
Module32FirstW.argtypes = [ c_void_p , POINTER(MODULEENTRY32W) ]
134+
Module32FirstW.rettype = c_int
135+
86136
## Module32Next
87-
Module32Next = windll.kernel32.Module32Next
88-
Module32Next.argtypes = [ c_void_p , POINTER(MODULEENTRY32) ]
89-
Module32Next.rettype = c_int
137+
Module32NextA = windll.kernel32.Module32Next
138+
Module32NextA.argtypes = [ c_void_p , POINTER(MODULEENTRY32A) ]
139+
Module32NextA.rettype = c_int
140+
141+
## Module32NextW
142+
Module32NextW = windll.kernel32.Module32NextW
143+
Module32NextW.argtypes = [ c_void_p , POINTER(MODULEENTRY32W) ]
144+
Module32NextW.rettype = c_int
145+
90146
## Thread32First
91147
Thread32First = windll.kernel32.Thread32First
92148
Thread32First.argtypes = [ c_void_p , POINTER(THREADENTRY32) ]
93149
Thread32First.rettype = c_int
150+
94151
## Thread32Next
95152
Thread32Next = windll.kernel32.Thread32Next
96153
Thread32Next.argtypes = [ c_void_p , POINTER(THREADENTRY32) ]
97154
Thread32Next.rettype = c_int
155+
98156
## GetLastError
99157
GetLastError = windll.kernel32.GetLastError
100-
GetLastError.rettype = c_long
158+
GetLastError.rettype = c_ulong
159+
160+
161+
use_unicode=True
162+
if use_unicode:
163+
Process32First=Process32FirstW
164+
Process32Next=Process32NextW
165+
Module32First=Module32FirstW
166+
Module32Next=Module32NextW
167+
PROCESSENTRY32=PROCESSENTRY32W
168+
MODULEENTRY32=MODULEENTRY32W
169+
else: #ANSI version
170+
Process32First=Process32FirstA
171+
Process32Next=Process32NextA
172+
Module32First=Module32FirstA
173+
Module32Next=Module32NextA
174+
PROCESSENTRY32=PROCESSENTRY32A
175+
MODULEENTRY32=MODULEENTRY32A
101176

102177

103178
def ListProcessModules( ProcessID ):
@@ -108,18 +183,18 @@ def ListProcessModules( ProcessID ):
108183

109184
ret = Module32First( hModuleSnap, pointer(me32) )
110185
if ret == 0 :
111-
print 'ListProcessModules() Error on Module32First[%d]' % GetLastError()
186+
print('ListProcessModules() Error on Module32First[%d]' % GetLastError())
112187
CloseHandle( hModuleSnap )
113188
return False
114189

115190
while ret :
116-
print " MODULE NAME: %s"% me32.szModule
117-
print " executable = %s"% me32.szExePath
118-
print " process ID = 0x%08X"% me32.th32ProcessID
119-
print " ref count (g) = 0x%04X"% me32.GlblcntUsage
120-
print " ref count (p) = 0x%04X"% me32.ProccntUsage
121-
print " base address = 0x%08X"% me32.modBaseAddr
122-
print " base size = %d"% me32.modBaseSize
191+
print(" MODULE NAME: %s"% me32.szModule)
192+
print(" executable = %s"% me32.szExePath)
193+
print(" process ID = 0x%08X"% me32.th32ProcessID)
194+
print(" ref count (g) = 0x%04X"% me32.GlblcntUsage)
195+
print(" ref count (p) = 0x%04X"% me32.ProccntUsage)
196+
print(" base address = 0x%08X"% me32.modBaseAddr)
197+
print(" base size = %d"% me32.modBaseSize)
123198

124199
ret = Module32Next( hModuleSnap , pointer(me32) )
125200

@@ -139,15 +214,15 @@ def ListProcessThreads( ProcessID ):
139214
ret = Thread32First( hThreadSnap, pointer(te32) )
140215

141216
if ret == 0 :
142-
print 'ListProcessThreads() Error on Thread32First[%d]' % GetLastError()
217+
print('ListProcessThreads() Error on Thread32First[%d]' % GetLastError())
143218
CloseHandle( hThreadSnap )
144219
return False
145220

146221
while ret :
147222
if te32.th32OwnerProcessID == ProcessID :
148-
print " THREAD ID = 0x%08X"% te32.th32ThreadID
149-
print " base priority = %d"% te32.tpBasePri
150-
print " delta priority = %d"% te32.tpDeltaPri
223+
print(" THREAD ID = 0x%08X"% te32.th32ThreadID)
224+
print(" base priority = %d"% te32.tpBasePri)
225+
print(" delta priority = %d"% te32.tpDeltaPri)
151226

152227
ret = Thread32Next( hThreadSnap, pointer(te32) )
153228

@@ -171,22 +246,22 @@ def ListProcessThreads( ProcessID ):
171246
ret = Process32First( hProcessSnap , pointer( pe32 ) )
172247

173248
while ret :
174-
print ""
175-
print "=================================================="
176-
print "Process Name : %s " % pe32.szExeFile
177-
print "--------------------------------------------------"
249+
print("")
250+
print("==================================================")
251+
print("Process Name : %s " % pe32.szExeFile)
252+
print("--------------------------------------------------")
178253

179254
hProcess = OpenProcess( PROCESS_ALL_ACCESS , 0 , pe32.th32ProcessID )
180255
dwPriorityClass = GetPriorityClass( hProcess )
181256
if dwPriorityClass == 0 :
182257
CloseHandle( hProcess )
183258

184259

185-
print " process ID = 0x%08X" % pe32.th32ProcessID
186-
print " thread count = %d" % pe32.cntThreads
187-
print " parent process ID = 0x%08X" % pe32.th32ParentProcessID
188-
print " Priority Base = %d" % pe32.pcPriClassBase
189-
print " Priority Class = %d" % dwPriorityClass
260+
print(" process ID = 0x%08X" % pe32.th32ProcessID)
261+
print(" thread count = %d" % pe32.cntThreads)
262+
print(" parent process ID = 0x%08X" % pe32.th32ParentProcessID)
263+
print(" Priority Base = %d" % pe32.pcPriClassBase)
264+
print(" Priority Class = %d" % dwPriorityClass)
190265

191266
ListProcessModules( pe32.th32ProcessID )
192267
ListProcessThreads( pe32.th32ProcessID )

0 commit comments

Comments
 (0)