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
2
2
from ctypes import windll
3
3
from ctypes import Structure
4
4
from ctypes import sizeof , POINTER , pointer , cast
5
5
6
6
# const variable
7
7
TH32CS_SNAPPROCESS = 2
8
- STANDARD_RIGHTS_REQUIRED = 0x000F0000
9
- SYNCHRONIZE = 0x00100000
10
- PROCESS_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF )
11
8
TH32CS_SNAPMODULE = 0x00000008
12
9
TH32CS_SNAPTHREAD = 0x00000004
13
10
11
+ STANDARD_RIGHTS_REQUIRED = 0x000F0000
12
+ SYNCHRONIZE = 0x00100000
13
+ PROCESS_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF )
14
14
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 ) ,
24
27
( '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 ) ,
39
53
( '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
+
43
70
class THREADENTRY32 (Structure ):
44
71
_fields_ = [
45
72
('dwSize' , c_long ),
@@ -58,46 +85,94 @@ class THREADENTRY32(Structure):
58
85
## CreateToolhelp32Snapshot
59
86
CreateToolhelp32Snapshot = windll .kernel32 .CreateToolhelp32Snapshot
60
87
CreateToolhelp32Snapshot .reltype = c_long
61
- CreateToolhelp32Snapshot .argtypes = [ c_int , c_int ]
88
+ CreateToolhelp32Snapshot .argtypes = [ c_ulong , c_ulong ]
89
+
90
+
62
91
## 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
+
66
101
## 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
+
70
111
## OpenProcess
71
112
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
+
74
116
## GetPriorityClass
75
117
GetPriorityClass = windll .kernel32 .GetPriorityClass
76
118
GetPriorityClass .argtypes = [ c_void_p ]
77
119
GetPriorityClass .rettype = c_long
120
+
78
121
## CloseHandle
79
122
CloseHandle = windll .kernel32 .CloseHandle
80
123
CloseHandle .argtypes = [ c_void_p ]
81
124
CloseHandle .rettype = c_int
125
+
82
126
## 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
+
86
136
## 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
+
90
146
## Thread32First
91
147
Thread32First = windll .kernel32 .Thread32First
92
148
Thread32First .argtypes = [ c_void_p , POINTER (THREADENTRY32 ) ]
93
149
Thread32First .rettype = c_int
150
+
94
151
## Thread32Next
95
152
Thread32Next = windll .kernel32 .Thread32Next
96
153
Thread32Next .argtypes = [ c_void_p , POINTER (THREADENTRY32 ) ]
97
154
Thread32Next .rettype = c_int
155
+
98
156
## GetLastError
99
157
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
101
176
102
177
103
178
def ListProcessModules ( ProcessID ):
@@ -108,18 +183,18 @@ def ListProcessModules( ProcessID ):
108
183
109
184
ret = Module32First ( hModuleSnap , pointer (me32 ) )
110
185
if ret == 0 :
111
- print 'ListProcessModules() Error on Module32First[%d]' % GetLastError ()
186
+ print ( 'ListProcessModules() Error on Module32First[%d]' % GetLastError () )
112
187
CloseHandle ( hModuleSnap )
113
188
return False
114
189
115
190
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 )
123
198
124
199
ret = Module32Next ( hModuleSnap , pointer (me32 ) )
125
200
@@ -139,15 +214,15 @@ def ListProcessThreads( ProcessID ):
139
214
ret = Thread32First ( hThreadSnap , pointer (te32 ) )
140
215
141
216
if ret == 0 :
142
- print 'ListProcessThreads() Error on Thread32First[%d]' % GetLastError ()
217
+ print ( 'ListProcessThreads() Error on Thread32First[%d]' % GetLastError () )
143
218
CloseHandle ( hThreadSnap )
144
219
return False
145
220
146
221
while ret :
147
222
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 )
151
226
152
227
ret = Thread32Next ( hThreadSnap , pointer (te32 ) )
153
228
@@ -171,22 +246,22 @@ def ListProcessThreads( ProcessID ):
171
246
ret = Process32First ( hProcessSnap , pointer ( pe32 ) )
172
247
173
248
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 ( "--------------------------------------------------" )
178
253
179
254
hProcess = OpenProcess ( PROCESS_ALL_ACCESS , 0 , pe32 .th32ProcessID )
180
255
dwPriorityClass = GetPriorityClass ( hProcess )
181
256
if dwPriorityClass == 0 :
182
257
CloseHandle ( hProcess )
183
258
184
259
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 )
190
265
191
266
ListProcessModules ( pe32 .th32ProcessID )
192
267
ListProcessThreads ( pe32 .th32ProcessID )
0 commit comments