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
22from ctypes import windll
33from ctypes import Structure
44from ctypes import sizeof , POINTER , pointer , cast
55
66# const variable
77TH32CS_SNAPPROCESS = 2
8- STANDARD_RIGHTS_REQUIRED = 0x000F0000
9- SYNCHRONIZE = 0x00100000
10- PROCESS_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF )
118TH32CS_SNAPMODULE = 0x00000008
129TH32CS_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+
4370class THREADENTRY32 (Structure ):
4471 _fields_ = [
4572 ('dwSize' , c_long ),
@@ -58,46 +85,94 @@ class THREADENTRY32(Structure):
5885## CreateToolhelp32Snapshot
5986CreateToolhelp32Snapshot = windll .kernel32 .CreateToolhelp32Snapshot
6087CreateToolhelp32Snapshot .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
71112OpenProcess = 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
75117GetPriorityClass = windll .kernel32 .GetPriorityClass
76118GetPriorityClass .argtypes = [ c_void_p ]
77119GetPriorityClass .rettype = c_long
120+
78121## CloseHandle
79122CloseHandle = windll .kernel32 .CloseHandle
80123CloseHandle .argtypes = [ c_void_p ]
81124CloseHandle .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
91147Thread32First = windll .kernel32 .Thread32First
92148Thread32First .argtypes = [ c_void_p , POINTER (THREADENTRY32 ) ]
93149Thread32First .rettype = c_int
150+
94151## Thread32Next
95152Thread32Next = windll .kernel32 .Thread32Next
96153Thread32Next .argtypes = [ c_void_p , POINTER (THREADENTRY32 ) ]
97154Thread32Next .rettype = c_int
155+
98156## GetLastError
99157GetLastError = 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
103178def 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