1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 """
29 Wrapper for psapi.dll in ctypes.
30 """
31
32 __revision__ = "$Id: psapi.py 618 2010-02-11 02:15:09Z qvasimodo $"
33
34 from defines import *
35
36
37
38 LIST_MODULES_DEFAULT = 0x00
39 LIST_MODULES_32BIT = 0x01
40 LIST_MODULES_64BIT = 0x02
41 LIST_MODULES_ALL = 0x03
42
43
44
45
46
47
49 _fields_ = [
50 ("lpBaseOfDll", LPVOID),
51 ("SizeOfImage", DWORD),
52 ("EntryPoint", LPVOID),
53 ]
54 LPMODULEINFO = POINTER(MODULEINFO)
55
56
57
58
59
60
61
62
64 _EnumDeviceDrivers = windll.psapi.EnumDeviceDrivers
65 _EnumDeviceDrivers.argtypes = [LPVOID, DWORD, LPDWORD]
66 _EnumDeviceDrivers.restype = bool
67 _EnumDeviceDrivers.errcheck = RaiseIfZero
68
69 size = 0x1000
70 lpcbNeeded = DWORD(size)
71 unit = sizeof(LPVOID)
72 while 1:
73 lpImageBase = (LPVOID * (size // unit))()
74 _EnumDeviceDrivers(ctypes.byref(lpImageBase), lpcbNeeded, ctypes.byref(lpcbNeeded))
75 needed = lpcbNeeded.value
76 if needed <= size:
77 break
78 size = needed
79 return [ lpImageBase[index] for index in xrange(0, (needed // unit)) ]
80
81
82
83
84
85
87 _EnumProcesses = windll.psapi.EnumProcesses
88 _EnumProcesses.argtypes = [LPVOID, DWORD, LPDWORD]
89 _EnumProcesses.restype = bool
90 _EnumProcesses.errcheck = RaiseIfZero
91
92 size = 0x1000
93 cbBytesReturned = DWORD()
94 unit = sizeof(DWORD)
95 while 1:
96 ProcessIds = (DWORD * (size // unit))()
97 cbBytesReturned.value = size
98 _EnumProcesses(ctypes.byref(ProcessIds), cbBytesReturned, ctypes.byref(cbBytesReturned))
99 returned = cbBytesReturned.value
100 if returned < size:
101 break
102 size = size + 0x1000
103 ProcessIdList = list()
104 for ProcessId in ProcessIds:
105 if ProcessId is None:
106 break
107 ProcessIdList.append(ProcessId)
108 return ProcessIdList
109
110
111
112
113
114
115
117 _EnumProcessModules = windll.psapi.EnumProcessModules
118 _EnumProcessModules.argtypes = [HANDLE, LPVOID, DWORD, LPDWORD]
119 _EnumProcessModules.restype = bool
120 _EnumProcessModules.errcheck = RaiseIfZero
121
122 size = 0x1000
123 lpcbNeeded = DWORD(size)
124 unit = sizeof(HMODULE)
125 while 1:
126 lphModule = (HMODULE * (size // unit))()
127 _EnumProcessModules(hProcess, ctypes.byref(lphModule), lpcbNeeded, ctypes.byref(lpcbNeeded))
128 needed = lpcbNeeded.value
129 if needed <= size:
130 break
131 size = needed
132 return [ lphModule[index] for index in xrange(0, int(needed // unit)) ]
133
134
135
136
137
138
139
140
142 _EnumProcessModulesEx = windll.psapi.EnumProcessModulesEx
143 _EnumProcessModulesEx.argtypes = [HANDLE, LPVOID, DWORD, LPDWORD, DWORD]
144 _EnumProcessModulesEx.restype = bool
145 _EnumProcessModulesEx.errcheck = RaiseIfZero
146
147 size = 0x1000
148 lpcbNeeded = DWORD(size)
149 unit = sizeof(HMODULE)
150 while 1:
151 lphModule = (HMODULE * (size // unit))()
152 _EnumProcessModulesEx(hProcess, ctypes.byref(lphModule), lpcbNeeded, ctypes.byref(lpcbNeeded), dwFilterFlag)
153 needed = lpcbNeeded.value
154 if needed <= size:
155 break
156 size = needed
157 return [ lphModule[index] for index in xrange(0, (needed // unit)) ]
158
159
160
161
162
163
165 _GetDeviceDriverBaseNameA = windll.psapi.GetDeviceDriverBaseNameA
166 _GetDeviceDriverBaseNameA.argtypes = [LPVOID, LPSTR, DWORD]
167 _GetDeviceDriverBaseNameA.restype = DWORD
168
169 nSize = MAX_PATH
170 while 1:
171 lpBaseName = ctypes.create_string_buffer("", nSize)
172 nCopied = _GetDeviceDriverBaseNameA(ImageBase, lpBaseName, nSize)
173 if nCopied == 0:
174 raise ctypes.WinError()
175 if nCopied < (nSize - 1):
176 break
177 nSize = nSize + MAX_PATH
178 return lpBaseName.value
179
181 _GetDeviceDriverBaseNameW = windll.psapi.GetDeviceDriverBaseNameW
182 _GetDeviceDriverBaseNameW.argtypes = [LPVOID, LPWSTR, DWORD]
183 _GetDeviceDriverBaseNameW.restype = DWORD
184
185 nSize = MAX_PATH
186 while 1:
187 lpBaseName = ctypes.create_unicode_buffer(u"", nSize)
188 nCopied = _GetDeviceDriverBaseNameW(ImageBase, lpBaseName, nSize)
189 if nCopied == 0:
190 raise ctypes.WinError()
191 if nCopied < (nSize - 1):
192 break
193 nSize = nSize + MAX_PATH
194 return lpBaseName.value
195
196 GetDeviceDriverBaseName = GuessStringType(GetDeviceDriverBaseNameA, GetDeviceDriverBaseNameW)
197
198
199
200
201
202
204 _GetDeviceDriverFileNameA = windll.psapi.GetDeviceDriverFileNameA
205 _GetDeviceDriverFileNameA.argtypes = [LPVOID, LPSTR, DWORD]
206 _GetDeviceDriverFileNameA.restype = DWORD
207
208 nSize = MAX_PATH
209 while 1:
210 lpFilename = ctypes.create_string_buffer("", nSize)
211 nCopied = ctypes.windll.psapi.GetDeviceDriverFileNameA(ImageBase, lpFilename, nSize)
212 if nCopied == 0:
213 raise ctypes.WinError()
214 if nCopied < (nSize - 1):
215 break
216 nSize = nSize + MAX_PATH
217 return lpFilename.value
218
220 _GetDeviceDriverFileNameW = windll.psapi.GetDeviceDriverFileNameW
221 _GetDeviceDriverFileNameW.argtypes = [LPVOID, LPWSTR, DWORD]
222 _GetDeviceDriverFileNameW.restype = DWORD
223
224 nSize = MAX_PATH
225 while 1:
226 lpFilename = ctypes.create_unicode_buffer(u"", nSize)
227 nCopied = ctypes.windll.psapi.GetDeviceDriverFileNameW(ImageBase, lpFilename, nSize)
228 if nCopied == 0:
229 raise ctypes.WinError()
230 if nCopied < (nSize - 1):
231 break
232 nSize = nSize + MAX_PATH
233 return lpFilename.value
234
235 GetDeviceDriverFileName = GuessStringType(GetDeviceDriverFileNameA, GetDeviceDriverFileNameW)
236
237
238
239
240
241
242
244 _GetMappedFileNameA = ctypes.windll.psapi.GetMappedFileNameA
245 _GetMappedFileNameA.argtypes = [HANDLE, LPVOID, LPSTR, DWORD]
246 _GetMappedFileNameA.restype = DWORD
247
248 nSize = MAX_PATH
249 while 1:
250 lpFilename = ctypes.create_string_buffer("", nSize)
251 nCopied = _GetMappedFileNameA(hProcess, lpv, lpFilename, nSize)
252 if nCopied == 0:
253 raise ctypes.WinError()
254 if nCopied < (nSize - 1):
255 break
256 nSize = nSize + MAX_PATH
257 return lpFilename.value
258
260 _GetMappedFileNameW = ctypes.windll.psapi.GetMappedFileNameW
261 _GetMappedFileNameW.argtypes = [HANDLE, LPVOID, LPWSTR, DWORD]
262 _GetMappedFileNameW.restype = DWORD
263
264 nSize = MAX_PATH
265 while 1:
266 lpFilename = ctypes.create_unicode_buffer(u"", nSize)
267 nCopied = _GetMappedFileNameW(hProcess, lpv, lpFilename, nSize)
268 if nCopied == 0:
269 raise ctypes.WinError()
270 if nCopied < (nSize - 1):
271 break
272 nSize = nSize + MAX_PATH
273 return lpFilename.value
274
275 GetMappedFileName = GuessStringType(GetMappedFileNameA, GetMappedFileNameW)
276
277
278
279
280
281
282
284 _GetModuleFileNameExA = ctypes.windll.psapi.GetModuleFileNameExA
285 _GetModuleFileNameExA.argtypes = [HANDLE, HMODULE, LPSTR, DWORD]
286 _GetModuleFileNameExA.restype = DWORD
287
288 nSize = MAX_PATH
289 while 1:
290 lpFilename = ctypes.create_string_buffer("", nSize)
291 nCopied = _GetModuleFileNameExA(hProcess, hModule, lpFilename, nSize)
292 if nCopied == 0:
293 raise ctypes.WinError()
294 if nCopied < (nSize - 1):
295 break
296 nSize = nSize + MAX_PATH
297 return lpFilename.value
298
300 _GetModuleFileNameExW = ctypes.windll.psapi.GetModuleFileNameExW
301 _GetModuleFileNameExW.argtypes = [HANDLE, HMODULE, LPWSTR, DWORD]
302 _GetModuleFileNameExW.restype = DWORD
303
304 nSize = MAX_PATH
305 while 1:
306 lpFilename = ctypes.create_unicode_buffer(u"", nSize)
307 nCopied = _GetModuleFileNameExW(hProcess, hModule, lpFilename, nSize)
308 if nCopied == 0:
309 raise ctypes.WinError()
310 if nCopied < (nSize - 1):
311 break
312 nSize = nSize + MAX_PATH
313 return lpFilename.value
314
315 GetModuleFileNameEx = GuessStringType(GetModuleFileNameExA, GetModuleFileNameExW)
316
317
318
319
320
321
322
333
334
335
336
337
338
340 _GetProcessImageFileNameA = windll.psapi.GetProcessImageFileNameA
341 _GetProcessImageFileNameA.argtypes = [HANDLE, LPSTR, DWORD]
342 _GetProcessImageFileNameA.restype = DWORD
343
344 nSize = MAX_PATH
345 while 1:
346 lpFilename = ctypes.create_string_buffer("", nSize)
347 nCopied = _GetProcessImageFileNameA(hProcess, lpFilename, nSize)
348 if nCopied == 0:
349 raise ctypes.WinError()
350 if nCopied < (nSize - 1):
351 break
352 nSize = nSize + MAX_PATH
353 return lpFilename.value
354
356 _GetProcessImageFileNameW = windll.psapi.GetProcessImageFileNameW
357 _GetProcessImageFileNameW.argtypes = [HANDLE, LPWSTR, DWORD]
358 _GetProcessImageFileNameW.restype = DWORD
359
360 nSize = MAX_PATH
361 while 1:
362 lpFilename = ctypes.create_unicode_buffer(u"", nSize)
363 nCopied = _GetProcessImageFileNameW(hProcess, lpFilename, nSize)
364 if nCopied == 0:
365 raise ctypes.WinError()
366 if nCopied < (nSize - 1):
367 break
368 nSize = nSize + MAX_PATH
369 return lpFilename.value
370
371 GetProcessImageFileName = GuessStringType(GetProcessImageFileNameA, GetProcessImageFileNameW)
372