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 kernel32.dll in ctypes.
30 """
31
32 __revision__ = "$Id: kernel32.py 720 2010-07-11 12:38:14Z qvasimodo $"
33
34 from defines import *
35 from version import *
36
37
38
39 import context_i386
40 import context_amd64
41 import context_ia64
42
43 from context_i386 import CONTEXT_i386, CONTEXT_i486
44 from context_amd64 import CONTEXT_AMD64
45 from context_ia64 import CONTEXT_IA64
46
47 ContextArchMask = context_i386.CONTEXT_i386
48
49 ContextArchMask = ContextArchMask | context_amd64.CONTEXT_AMD64
50 ContextArchMask = ContextArchMask | context_ia64.CONTEXT_IA64
51
52 if arch == 'i386':
53 from context_i386 import *
54 elif arch == 'amd64':
55 if sizeof(SIZE_T) == sizeof(DWORD64):
56 from context_amd64 import *
57 else:
58 from context_i386 import *
59 elif arch == 'ia64':
60 if sizeof(SIZE_T) == sizeof(DWORD64):
61 from context_ia64 import *
62 else:
63 from context_i386 import *
64 else:
65 print "Warning, unknown or unsupported architecture"
66
67
68
69 STILL_ACTIVE = 259
70
71 WAIT_TIMEOUT = 0x102
72 WAIT_FAILED = -1
73 WAIT_OBJECT_0 = 0
74
75 EXCEPTION_NONCONTINUABLE = 0x1
76 EXCEPTION_MAXIMUM_PARAMETERS = 15
77 MAXIMUM_WAIT_OBJECTS = 64
78 MAXIMUM_SUSPEND_COUNT = 0x7f
79
80 FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100
81 FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000
82
83 GR_GDIOBJECTS = 0
84 GR_USEROBJECTS = 1
85
86 PROCESS_NAME_NATIVE = 1
87
88 MAXINTATOM = 0xC000
89
90
91 DONT_RESOLVE_DLL_REFERENCES = 0x00000001
92 LOAD_LIBRARY_AS_DATAFILE = 0x00000002
93 LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008
94 LOAD_IGNORE_CODE_AUTHZ_LEVEL = 0x00000010
95 LOAD_LIBRARY_AS_IMAGE_RESOURCE = 0x00000020
96 LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE = 0x00000040
97
98
99
100
101
102
103
104
105 CTRL_C_EVENT = 0
106 CTRL_BREAK_EVENT = 1
107 CTRL_CLOSE_EVENT = 2
108 CTRL_LOGOFF_EVENT = 5
109 CTRL_SHUTDOWN_EVENT = 6
110
111
112 HEAP_NO_SERIALIZE = 0x00000001
113 HEAP_GENERATE_EXCEPTIONS = 0x00000004
114 HEAP_ZERO_MEMORY = 0x00000008
115 HEAP_CREATE_ENABLE_EXECUTE = 0x00040000
116
117
118 DELETE = (0x00010000L)
119 READ_CONTROL = (0x00020000L)
120 WRITE_DAC = (0x00040000L)
121 WRITE_OWNER = (0x00080000L)
122 SYNCHRONIZE = (0x00100000L)
123 STANDARD_RIGHTS_REQUIRED = (0x000F0000L)
124 STANDARD_RIGHTS_READ = (READ_CONTROL)
125 STANDARD_RIGHTS_WRITE = (READ_CONTROL)
126 STANDARD_RIGHTS_EXECUTE = (READ_CONTROL)
127 STANDARD_RIGHTS_ALL = (0x001F0000L)
128 SPECIFIC_RIGHTS_ALL = (0x0000FFFFL)
129
130
131 PROCESS_TERMINATE = (0x0001)
132 PROCESS_CREATE_THREAD = (0x0002)
133 PROCESS_SET_SESSIONID = (0x0004)
134 PROCESS_VM_OPERATION = (0x0008)
135 PROCESS_VM_READ = (0x0010)
136 PROCESS_VM_WRITE = (0x0020)
137 PROCESS_DUP_HANDLE = (0x0040)
138 PROCESS_CREATE_PROCESS = (0x0080)
139 PROCESS_SET_QUOTA = (0x0100)
140 PROCESS_SET_INFORMATION = (0x0200)
141 PROCESS_QUERY_INFORMATION = (0x0400)
142 PROCESS_SUSPEND_RESUME = (0x0800)
143 PROCESS_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)
144
145
146
147 IDLE_PRIORITY_CLASS = 0x00000040
148 BELOW_NORMAL_PRIORITY_CLASS = 0x00004000
149 NORMAL_PRIORITY_CLASS = 0x00000020
150 ABOVE_NORMAL_PRIORITY_CLASS = 0x00008000
151 HIGH_PRIORITY_CLASS = 0x00000080
152 REALTIME_PRIORITY_CLASS = 0x00000100
153
154 PROCESS_MODE_BACKGROUND_BEGIN = 0x00100000
155 PROCESS_MODE_BACKGROUND_END = 0x00200000
156
157
158
159 DEBUG_PROCESS = 0x00000001
160 DEBUG_ONLY_THIS_PROCESS = 0x00000002
161 CREATE_SUSPENDED = 0x00000004
162 DETACHED_PROCESS = 0x00000008
163 CREATE_NEW_CONSOLE = 0x00000010
164 NORMAL_PRIORITY_CLASS = 0x00000020
165 IDLE_PRIORITY_CLASS = 0x00000040
166 HIGH_PRIORITY_CLASS = 0x00000080
167 REALTIME_PRIORITY_CLASS = 0x00000100
168 CREATE_NEW_PROCESS_GROUP = 0x00000200
169 CREATE_UNICODE_ENVIRONMENT = 0x00000400
170 CREATE_SEPARATE_WOW_VDM = 0x00000800
171 CREATE_SHARED_WOW_VDM = 0x00001000
172 CREATE_FORCEDOS = 0x00002000
173 BELOW_NORMAL_PRIORITY_CLASS = 0x00004000
174 ABOVE_NORMAL_PRIORITY_CLASS = 0x00008000
175 INHERIT_PARENT_AFFINITY = 0x00010000
176 STACK_SIZE_PARAM_IS_A_RESERVATION = 0x00010000
177 INHERIT_CALLER_PRIORITY = 0x00020000
178 CREATE_PROTECTED_PROCESS = 0x00040000
179 EXTENDED_STARTUPINFO_PRESENT = 0x00080000
180 PROCESS_MODE_BACKGROUND_BEGIN = 0x00100000
181 PROCESS_MODE_BACKGROUND_END = 0x00200000
182 CREATE_BREAKAWAY_FROM_JOB = 0x01000000
183 CREATE_PRESERVE_CODE_AUTHZ_LEVEL = 0x02000000
184 CREATE_DEFAULT_ERROR_MODE = 0x04000000
185 CREATE_NO_WINDOW = 0x08000000
186 PROFILE_USER = 0x10000000
187 PROFILE_KERNEL = 0x20000000
188 PROFILE_SERVER = 0x40000000
189 CREATE_IGNORE_SYSTEM_DEFAULT = 0x80000000
190
191
192
193 THREAD_BASE_PRIORITY_LOWRT = 15
194 THREAD_BASE_PRIORITY_MAX = 2
195 THREAD_BASE_PRIORITY_MIN = (-2)
196 THREAD_BASE_PRIORITY_IDLE = (-15)
197
198 THREAD_PRIORITY_LOWEST = THREAD_BASE_PRIORITY_MIN
199 THREAD_PRIORITY_BELOW_NORMAL = (THREAD_PRIORITY_LOWEST+1)
200 THREAD_PRIORITY_NORMAL = 0
201 THREAD_PRIORITY_HIGHEST = THREAD_BASE_PRIORITY_MAX
202 THREAD_PRIORITY_ABOVE_NORMAL = (THREAD_PRIORITY_HIGHEST-1)
203 THREAD_PRIORITY_ERROR_RETURN = (0xFFFFFFFFL)
204
205 THREAD_PRIORITY_TIME_CRITICAL = THREAD_BASE_PRIORITY_LOWRT
206 THREAD_PRIORITY_IDLE = THREAD_BASE_PRIORITY_IDLE
207
208
209 SECTION_QUERY = 0x0001
210 SECTION_MAP_WRITE = 0x0002
211 SECTION_MAP_READ = 0x0004
212 SECTION_MAP_EXECUTE = 0x0008
213 SECTION_EXTEND_SIZE = 0x0010
214 SECTION_MAP_EXECUTE_EXPLICIT = 0x0020
215
216 SECTION_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
217 SECTION_MAP_WRITE | \
218 SECTION_MAP_READ | \
219 SECTION_MAP_EXECUTE | \
220 SECTION_EXTEND_SIZE)
221 PAGE_NOACCESS = 0x01
222 PAGE_READONLY = 0x02
223 PAGE_READWRITE = 0x04
224 PAGE_WRITECOPY = 0x08
225 PAGE_EXECUTE = 0x10
226 PAGE_EXECUTE_READ = 0x20
227 PAGE_EXECUTE_READWRITE = 0x40
228 PAGE_EXECUTE_WRITECOPY = 0x80
229 PAGE_GUARD = 0x100
230 PAGE_NOCACHE = 0x200
231 PAGE_WRITECOMBINE = 0x400
232 MEM_COMMIT = 0x1000
233 MEM_RESERVE = 0x2000
234 MEM_DECOMMIT = 0x4000
235 MEM_RELEASE = 0x8000
236 MEM_FREE = 0x10000
237 MEM_PRIVATE = 0x20000
238 MEM_MAPPED = 0x40000
239 MEM_RESET = 0x80000
240 MEM_TOP_DOWN = 0x100000
241 MEM_WRITE_WATCH = 0x200000
242 MEM_PHYSICAL = 0x400000
243 MEM_LARGE_PAGES = 0x20000000
244 MEM_4MB_PAGES = 0x80000000
245 SEC_FILE = 0x800000
246 SEC_IMAGE = 0x1000000
247 SEC_RESERVE = 0x4000000
248 SEC_COMMIT = 0x8000000
249 SEC_NOCACHE = 0x10000000
250 SEC_LARGE_PAGES = 0x80000000
251 MEM_IMAGE = SEC_IMAGE
252 WRITE_WATCH_FLAG_RESET = 0x01
253 FILE_MAP_ALL_ACCESS = 0xF001F
254
255 SECTION_QUERY = 0x0001
256 SECTION_MAP_WRITE = 0x0002
257 SECTION_MAP_READ = 0x0004
258 SECTION_MAP_EXECUTE = 0x0008
259 SECTION_EXTEND_SIZE = 0x0010
260 SECTION_MAP_EXECUTE_EXPLICIT = 0x0020
261
262 SECTION_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
263 SECTION_MAP_WRITE | \
264 SECTION_MAP_READ | \
265 SECTION_MAP_EXECUTE | \
266 SECTION_EXTEND_SIZE)
267
268 FILE_MAP_COPY = SECTION_QUERY
269 FILE_MAP_WRITE = SECTION_MAP_WRITE
270 FILE_MAP_READ = SECTION_MAP_READ
271 FILE_MAP_ALL_ACCESS = SECTION_ALL_ACCESS
272 FILE_MAP_EXECUTE = SECTION_MAP_EXECUTE_EXPLICIT
273
274 GENERIC_READ = 0x80000000
275 GENERIC_WRITE = 0x40000000
276 GENERIC_EXECUTE = 0x20000000
277 GENERIC_ALL = 0x10000000
278
279 FILE_SHARE_READ = 0x00000001
280 FILE_SHARE_WRITE = 0x00000002
281 FILE_SHARE_DELETE = 0x00000004
282
283 CREATE_NEW = 1
284 CREATE_ALWAYS = 2
285 OPEN_EXISTING = 3
286 OPEN_ALWAYS = 4
287 TRUNCATE_EXISTING = 5
288
289 FILE_ATTRIBUTE_READONLY = 0x00000001
290 FILE_ATTRIBUTE_NORMAL = 0x00000080
291 FILE_ATTRIBUTE_TEMPORARY = 0x00000100
292
293 FILE_FLAG_WRITE_THROUGH = 0x80000000
294 FILE_FLAG_NO_BUFFERING = 0x20000000
295 FILE_FLAG_RANDOM_ACCESS = 0x10000000
296 FILE_FLAG_SEQUENTIAL_SCAN = 0x08000000
297 FILE_FLAG_DELETE_ON_CLOSE = 0x04000000
298 FILE_FLAG_OVERLAPPED = 0x40000000
299
300 FILE_ATTRIBUTE_READONLY = 0x00000001
301 FILE_ATTRIBUTE_HIDDEN = 0x00000002
302 FILE_ATTRIBUTE_SYSTEM = 0x00000004
303 FILE_ATTRIBUTE_DIRECTORY = 0x00000010
304 FILE_ATTRIBUTE_ARCHIVE = 0x00000020
305 FILE_ATTRIBUTE_DEVICE = 0x00000040
306 FILE_ATTRIBUTE_NORMAL = 0x00000080
307 FILE_ATTRIBUTE_TEMPORARY = 0x00000100
308
309
310 EXCEPTION_DEBUG_EVENT = 1
311 CREATE_THREAD_DEBUG_EVENT = 2
312 CREATE_PROCESS_DEBUG_EVENT = 3
313 EXIT_THREAD_DEBUG_EVENT = 4
314 EXIT_PROCESS_DEBUG_EVENT = 5
315 LOAD_DLL_DEBUG_EVENT = 6
316 UNLOAD_DLL_DEBUG_EVENT = 7
317 OUTPUT_DEBUG_STRING_EVENT = 8
318 RIP_EVENT = 9
319
320
321 DBG_CONTINUE = 0x00010002L
322 DBG_EXCEPTION_HANDLED = 0x00010001L
323 DBG_EXCEPTION_NOT_HANDLED = 0x80010001L
324 DBG_TERMINATE_THREAD = 0x40010003L
325 DBG_TERMINATE_PROCESS = 0x40010004L
326 DBG_CONTROL_C = 0x40010005L
327 DBG_CONTROL_BREAK = 0x40010008L
328 DBG_COMMAND_EXCEPTION = 0x40010009L
329
330
331 STATUS_WAIT_0 = 0x00000000L
332 STATUS_ABANDONED_WAIT_0 = 0x00000080L
333 STATUS_USER_APC = 0x000000C0L
334 STATUS_TIMEOUT = 0x00000102L
335 STATUS_PENDING = 0x00000103L
336 STATUS_SEGMENT_NOTIFICATION = 0x40000005L
337 STATUS_GUARD_PAGE_VIOLATION = 0x80000001L
338 STATUS_DATATYPE_MISALIGNMENT = 0x80000002L
339 STATUS_BREAKPOINT = 0x80000003L
340 STATUS_SINGLE_STEP = 0x80000004L
341 STATUS_INVALID_INFO_CLASS = 0xC0000003L
342 STATUS_ACCESS_VIOLATION = 0xC0000005L
343 STATUS_IN_PAGE_ERROR = 0xC0000006L
344 STATUS_INVALID_HANDLE = 0xC0000008L
345 STATUS_NO_MEMORY = 0xC0000017L
346 STATUS_ILLEGAL_INSTRUCTION = 0xC000001DL
347 STATUS_NONCONTINUABLE_EXCEPTION = 0xC0000025L
348 STATUS_INVALID_DISPOSITION = 0xC0000026L
349 STATUS_ARRAY_BOUNDS_EXCEEDED = 0xC000008CL
350 STATUS_FLOAT_DENORMAL_OPERAND = 0xC000008DL
351 STATUS_FLOAT_DIVIDE_BY_ZERO = 0xC000008EL
352 STATUS_FLOAT_INEXACT_RESULT = 0xC000008FL
353 STATUS_FLOAT_INVALID_OPERATION = 0xC0000090L
354 STATUS_FLOAT_OVERFLOW = 0xC0000091L
355 STATUS_FLOAT_STACK_CHECK = 0xC0000092L
356 STATUS_FLOAT_UNDERFLOW = 0xC0000093L
357 STATUS_INTEGER_DIVIDE_BY_ZERO = 0xC0000094L
358 STATUS_INTEGER_OVERFLOW = 0xC0000095L
359 STATUS_PRIVILEGED_INSTRUCTION = 0xC0000096L
360 STATUS_STACK_OVERFLOW = 0xC00000FDL
361 STATUS_CONTROL_C_EXIT = 0xC000013AL
362 STATUS_FLOAT_MULTIPLE_FAULTS = 0xC00002B4L
363 STATUS_FLOAT_MULTIPLE_TRAPS = 0xC00002B5L
364 STATUS_REG_NAT_CONSUMPTION = 0xC00002C9L
365 STATUS_SXS_EARLY_DEACTIVATION = 0xC015000FL
366 STATUS_SXS_INVALID_DEACTIVATION = 0xC0150010L
367
368 STATUS_STACK_BUFFER_OVERRUN = 0xC0000409L
369 STATUS_WX86_BREAKPOINT = 0x4000001FL
370 STATUS_HEAP_CORRUPTION = 0xC0000374L
371
372 STATUS_POSSIBLE_DEADLOCK = 0xC0000194L
373
374 STATUS_UNWIND_CONSOLIDATE = 0x80000029L
375
376
377
378 EXCEPTION_ACCESS_VIOLATION = STATUS_ACCESS_VIOLATION
379 EXCEPTION_ARRAY_BOUNDS_EXCEEDED = STATUS_ARRAY_BOUNDS_EXCEEDED
380 EXCEPTION_BREAKPOINT = STATUS_BREAKPOINT
381 EXCEPTION_DATATYPE_MISALIGNMENT = STATUS_DATATYPE_MISALIGNMENT
382 EXCEPTION_FLT_DENORMAL_OPERAND = STATUS_FLOAT_DENORMAL_OPERAND
383 EXCEPTION_FLT_DIVIDE_BY_ZERO = STATUS_FLOAT_DIVIDE_BY_ZERO
384 EXCEPTION_FLT_INEXACT_RESULT = STATUS_FLOAT_INEXACT_RESULT
385 EXCEPTION_FLT_INVALID_OPERATION = STATUS_FLOAT_INVALID_OPERATION
386 EXCEPTION_FLT_OVERFLOW = STATUS_FLOAT_OVERFLOW
387 EXCEPTION_FLT_STACK_CHECK = STATUS_FLOAT_STACK_CHECK
388 EXCEPTION_FLT_UNDERFLOW = STATUS_FLOAT_UNDERFLOW
389 EXCEPTION_ILLEGAL_INSTRUCTION = STATUS_ILLEGAL_INSTRUCTION
390 EXCEPTION_IN_PAGE_ERROR = STATUS_IN_PAGE_ERROR
391 EXCEPTION_INT_DIVIDE_BY_ZERO = STATUS_INTEGER_DIVIDE_BY_ZERO
392 EXCEPTION_INT_OVERFLOW = STATUS_INTEGER_OVERFLOW
393 EXCEPTION_INVALID_DISPOSITION = STATUS_INVALID_DISPOSITION
394 EXCEPTION_NONCONTINUABLE_EXCEPTION = STATUS_NONCONTINUABLE_EXCEPTION
395 EXCEPTION_PRIV_INSTRUCTION = STATUS_PRIVILEGED_INSTRUCTION
396 EXCEPTION_SINGLE_STEP = STATUS_SINGLE_STEP
397 EXCEPTION_STACK_OVERFLOW = STATUS_STACK_OVERFLOW
398
399 EXCEPTION_GUARD_PAGE = STATUS_GUARD_PAGE_VIOLATION
400 EXCEPTION_INVALID_HANDLE = STATUS_INVALID_HANDLE
401 EXCEPTION_POSSIBLE_DEADLOCK = STATUS_POSSIBLE_DEADLOCK
402 EXCEPTION_WX86_BREAKPOINT = STATUS_WX86_BREAKPOINT
403
404 CONTROL_C_EXIT = STATUS_CONTROL_C_EXIT
405
406 DBG_CONTROL_C = 0x40010005L
407 MS_VC_EXCEPTION = 0x406D1388L
408
409
410 ACCESS_VIOLATION_TYPE_READ = EXCEPTION_READ_FAULT
411 ACCESS_VIOLATION_TYPE_WRITE = EXCEPTION_WRITE_FAULT
412 ACCESS_VIOLATION_TYPE_DEP = EXCEPTION_EXECUTE_FAULT
413
414
415 DUPLICATE_CLOSE_SOURCE = 0x00000001
416 DUPLICATE_SAME_ACCESS = 0x00000002
417
418
419 FILE_NAME_NORMALIZED = 0x0
420 FILE_NAME_OPENED = 0x8
421 VOLUME_NAME_DOS = 0x0
422 VOLUME_NAME_GUID = 0x1
423 VOLUME_NAME_NONE = 0x4
424 VOLUME_NAME_NT = 0x2
425
426
427 PRODUCT_BUSINESS = 0x00000006
428 PRODUCT_BUSINESS_N = 0x00000010
429 PRODUCT_CLUSTER_SERVER = 0x00000012
430 PRODUCT_DATACENTER_SERVER = 0x00000008
431 PRODUCT_DATACENTER_SERVER_CORE = 0x0000000C
432 PRODUCT_DATACENTER_SERVER_CORE_V = 0x00000027
433 PRODUCT_DATACENTER_SERVER_V = 0x00000025
434 PRODUCT_ENTERPRISE = 0x00000004
435 PRODUCT_ENTERPRISE_E = 0x00000046
436 PRODUCT_ENTERPRISE_N = 0x0000001B
437 PRODUCT_ENTERPRISE_SERVER = 0x0000000A
438 PRODUCT_ENTERPRISE_SERVER_CORE = 0x0000000E
439 PRODUCT_ENTERPRISE_SERVER_CORE_V = 0x00000029
440 PRODUCT_ENTERPRISE_SERVER_IA64 = 0x0000000F
441 PRODUCT_ENTERPRISE_SERVER_V = 0x00000026
442 PRODUCT_HOME_BASIC = 0x00000002
443 PRODUCT_HOME_BASIC_E = 0x00000043
444 PRODUCT_HOME_BASIC_N = 0x00000005
445 PRODUCT_HOME_PREMIUM = 0x00000003
446 PRODUCT_HOME_PREMIUM_E = 0x00000044
447 PRODUCT_HOME_PREMIUM_N = 0x0000001A
448 PRODUCT_HYPERV = 0x0000002A
449 PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT = 0x0000001E
450 PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING = 0x00000020
451 PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY = 0x0000001F
452 PRODUCT_PROFESSIONAL = 0x00000030
453 PRODUCT_PROFESSIONAL_E = 0x00000045
454 PRODUCT_PROFESSIONAL_N = 0x00000031
455 PRODUCT_SERVER_FOR_SMALLBUSINESS = 0x00000018
456 PRODUCT_SERVER_FOR_SMALLBUSINESS_V = 0x00000023
457 PRODUCT_SERVER_FOUNDATION = 0x00000021
458 PRODUCT_SMALLBUSINESS_SERVER = 0x00000009
459 PRODUCT_STANDARD_SERVER = 0x00000007
460 PRODUCT_STANDARD_SERVER_CORE = 0x0000000D
461 PRODUCT_STANDARD_SERVER_CORE_V = 0x00000028
462 PRODUCT_STANDARD_SERVER_V = 0x00000024
463 PRODUCT_STARTER = 0x0000000B
464 PRODUCT_STARTER_E = 0x00000042
465 PRODUCT_STARTER_N = 0x0000002F
466 PRODUCT_STORAGE_ENTERPRISE_SERVER = 0x00000017
467 PRODUCT_STORAGE_EXPRESS_SERVER = 0x00000014
468 PRODUCT_STORAGE_STANDARD_SERVER = 0x00000015
469 PRODUCT_STORAGE_WORKGROUP_SERVER = 0x00000016
470 PRODUCT_UNDEFINED = 0x00000000
471 PRODUCT_UNLICENSED = 0xABCDABCD
472 PRODUCT_ULTIMATE = 0x00000001
473 PRODUCT_ULTIMATE_E = 0x00000047
474 PRODUCT_ULTIMATE_N = 0x0000001C
475 PRODUCT_WEB_SERVER = 0x00000011
476 PRODUCT_WEB_SERVER_CORE = 0x0000001D
477
478
479
480 -class Handle (object):
481 """
482 Encapsulates Win32 handles to avoid leaking them.
483
484 @see:
485 L{ProcessHandle}, L{ThreadHandle}, L{FileHandle}, L{SnapshotHandle}
486 """
487
488
489
490
491
492 __bLeakDetection = False
493
494 - def __init__(self, aHandle = None, bOwnership = True):
495 """
496 @type aHandle: int
497 @param aHandle: Win32 handle value.
498
499 @type bOwnership: bool
500 @param bOwnership:
501 C{True} if we own the handle and we need to close it.
502 C{False} if someone else will be calling L{CloseHandle}.
503 """
504 super(Handle, self).__init__()
505 self.value = self._normalize(aHandle)
506 self.bOwnership = bOwnership
507 if Handle.__bLeakDetection:
508 print "INIT HANDLE (%r) %r" % (self.value, self)
509
511 """
512 Closes the Win32 handle when the Python object is destroyed.
513 """
514 if Handle.__bLeakDetection:
515 print "DEL HANDLE %r" % self
516 try:
517 self.close()
518 except Exception:
519 pass
520
522 """
523 Compatibility with the "C{with}" Python statement.
524 """
525 if Handle.__bLeakDetection:
526 print "ENTER HANDLE %r" % self
527 return self
528
529 - def __exit__(self, type, value, traceback):
530 """
531 Compatibility with the "C{with}" Python statement.
532 """
533 if Handle.__bLeakDetection:
534 print "EXIT HANDLE %r" % self
535 try:
536 self.close()
537 except Exception:
538 pass
539
541 """
542 Duplicates the Win32 handle when copying the Python object.
543
544 @rtype: L{Handle}
545 @return: A new handle to the same Win32 object.
546 """
547 return self.dup()
548
550 """
551 Duplicates the Win32 handle when copying the Python object.
552
553 @rtype: L{Handle}
554 @return: A new handle to the same win32 object.
555 """
556 return self.dup()
557
558 @property
560 """
561 Compatibility with ctypes.
562 Allows passing transparently a Handle object to an API call.
563 """
564 return HANDLE(self.value)
565
566 @staticmethod
568 """
569 Compatibility with ctypes.
570 Allows passing transparently a Handle object to an API call.
571
572 @type value: int
573 @param value: Numeric handle value.
574 """
575 return HANDLE(value)
576
588
590 """
591 @rtype: L{Handle}
592 @return: A new handle to the same Win32 object.
593 """
594 new_value = DuplicateHandle(self.value)
595 if Handle.__bLeakDetection:
596 print "DUP HANDLE (%d -> %d) %r" % (self.value, new_value, self)
597 return new_value
598
599 @staticmethod
611
612 - def wait(self, dwMilliseconds = None):
613 """
614 Wait for the Win32 object to be signaled.
615
616 @type dwMilliseconds: int
617 @param dwMilliseconds: (Optional) Timeout value in milliseconds.
618 Use C{INFINITE} or C{None} for no timeout.
619 """
620 if dwMilliseconds is None:
621 dwMilliseconds = INFINITE
622 r = WaitForSingleObject(self.value, dwMilliseconds)
623 if r != WAIT_OBJECT_0:
624 raise ctypes.WinError(r)
625
627 """
628 Win32 process handle.
629
630 @see: L{Handle}
631 """
632
634 """
635 @rtype: int
636 @return: Process global ID.
637 """
638 return GetProcessId(self.value)
639
641 """
642 Win32 thread handle.
643
644 @see: L{Handle}
645 """
646
648 """
649 @rtype: int
650 @return: Thread global ID.
651 """
652 return GetThreadId(self.value)
653
655 """
656 Win32 file handle.
657
658 @see: L{Handle}
659 """
660
662 """
663 @rtype: None or str
664 @return: Name of the open file, or C{None} if unavailable.
665 """
666
667
668
669
670
671
672
673
674
675
676
677
678 dwBufferSize = 0x1004
679 lpFileInformation = ctypes.create_string_buffer(dwBufferSize)
680 try:
681 GetFileInformationByHandleEx(self.value,
682 FILE_INFO_BY_HANDLE_CLASS.FileNameInfo,
683 lpFileInformation, dwBufferSize)
684 except AttributeError:
685 from ntdll import NtQueryInformationFile, \
686 FileNameInformation, \
687 FILE_NAME_INFORMATION
688 NtQueryInformationFile(self.value,
689 FileNameInformation,
690 lpFileInformation,
691 dwBufferSize)
692 FileName = unicode(lpFileInformation.raw[sizeof(DWORD):], 'U16')
693 FileName = ctypes.create_unicode_buffer(FileName).value
694 if not FileName:
695 FileName = None
696 elif FileName[1:2] != ':':
697
698
699 import os
700 FileName = os.environ['SYSTEMROOT'][:2] + FileName
701 return FileName
702
704 """
705 File mapping handle.
706
707 @see: L{Handle}
708 """
709 pass
710
713 """
714 Toolhelp32 snapshot handle.
715
716 @see: L{Handle}
717 """
718
720 "This method is meaningless for Toolhelp32 snaphots."
721 raise NotImplementedError, \
722 "This method is meaningless for Toolhelp32 snaphots."
723
724 - def wait(self, dwMilliseconds = None):
725 "This method is meaningless for Toolhelp32 snaphots."
726 raise NotImplementedError, \
727 "This method is meaningless for Toolhelp32 snaphots."
728
741
914
916 """
917 Extended process and thread attribute support.
918
919 To be used with L{STARTUPINFOEX}.
920 Only available for Windows Vista and above.
921
922 @type AttributeList: list of tuple( int, ctypes-compatible object )
923 @ivar AttributeList: List of (Attribute, Value) pairs.
924
925 @type AttributeListBuffer: L{LPPROC_THREAD_ATTRIBUTE_LIST}
926 @ivar AttributeListBuffer: Memory buffer used to store the attribute list.
927 L{InitializeProcThreadAttributeList},
928 L{UpdateProcThreadAttribute},
929 L{DeleteProcThreadAttributeList} and
930 L{STARTUPINFOEX}.
931 """
932
948
955
958
960 return self.__class__(self.AttributeList)
961
962 @property
964 return ctypes.cast(ctypes.pointer(self.AttributeListBuffer), LPVOID)
965
966 @property
969
970
971 @staticmethod
973 raise NotImplementedError
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989 -class _OVERLAPPED_STRUCT(Structure):
990 _fields_ = [
991 ('Offset', DWORD),
992 ('OffsetHigh', DWORD),
993 ]
1000 _fields_ = [
1001 ('Internal', ULONG_PTR),
1002 ('InternalHigh', ULONG_PTR),
1003 ('u', _OVERLAPPED_UNION),
1004 ('hEvent', HANDLE),
1005 ]
1006 LPOVERLAPPED = POINTER(OVERLAPPED)
1016 _fields_ = [
1017 ('nLength', DWORD),
1018 ('lpSecurityDescriptor', LPVOID),
1019 ('bInheritHandle', BOOL),
1020 ]
1021 LPSECURITY_ATTRIBUTES = POINTER(SECURITY_ATTRIBUTES)
1022
1023
1024
1025 PPROC_THREAD_ATTRIBUTE_LIST = LPVOID
1026 LPPROC_THREAD_ATTRIBUTE_LIST = PPROC_THREAD_ATTRIBUTE_LIST
1027
1028 PROC_THREAD_ATTRIBUTE_NUMBER = 0x0000FFFF
1029 PROC_THREAD_ATTRIBUTE_THREAD = 0x00010000
1030 PROC_THREAD_ATTRIBUTE_INPUT = 0x00020000
1031 PROC_THREAD_ATTRIBUTE_ADDITIVE = 0x00040000
1032
1033
1034 ProcThreadAttributeParentProcess = 0
1035 ProcThreadAttributeExtendedFlags = 1
1036 ProcThreadAttributeHandleList = 2
1037 ProcThreadAttributeGroupAffinity = 3
1038 ProcThreadAttributePreferredNode = 4
1039 ProcThreadAttributeIdealProcessor = 5
1040 ProcThreadAttributeUmsThread = 6
1041 ProcThreadAttributeMitigationPolicy = 7
1042 ProcThreadAttributeMax = 8
1043
1044 PROC_THREAD_ATTRIBUTE_PARENT_PROCESS = ProcThreadAttributeParentProcess | PROC_THREAD_ATTRIBUTE_INPUT
1045 PROC_THREAD_ATTRIBUTE_EXTENDED_FLAGS = ProcThreadAttributeExtendedFlags | PROC_THREAD_ATTRIBUTE_INPUT | PROC_THREAD_ATTRIBUTE_ADDITIVE
1046 PROC_THREAD_ATTRIBUTE_HANDLE_LIST = ProcThreadAttributeHandleList | PROC_THREAD_ATTRIBUTE_INPUT
1047 PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY = ProcThreadAttributeGroupAffinity | PROC_THREAD_ATTRIBUTE_THREAD | PROC_THREAD_ATTRIBUTE_INPUT
1048 PROC_THREAD_ATTRIBUTE_PREFERRED_NODE = ProcThreadAttributePreferredNode | PROC_THREAD_ATTRIBUTE_INPUT
1049 PROC_THREAD_ATTRIBUTE_IDEAL_PROCESSOR = ProcThreadAttributeIdealProcessor | PROC_THREAD_ATTRIBUTE_THREAD | PROC_THREAD_ATTRIBUTE_INPUT
1050 PROC_THREAD_ATTRIBUTE_UMS_THREAD = ProcThreadAttributeUmsThread | PROC_THREAD_ATTRIBUTE_THREAD | PROC_THREAD_ATTRIBUTE_INPUT
1051 PROC_THREAD_ATTRIBUTE_MITIGATION_POLICY = ProcThreadAttributeMitigationPolicy | PROC_THREAD_ATTRIBUTE_INPUT
1052
1053 PROCESS_CREATION_MITIGATION_POLICY_DEP_ENABLE = 0x01
1054 PROCESS_CREATION_MITIGATION_POLICY_DEP_ATL_THUNK_ENABLE = 0x02
1055 PROCESS_CREATION_MITIGATION_POLICY_SEHOP_ENABLE = 0x04
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074 -class VS_FIXEDFILEINFO (Structure):
1075 _fields_ = [
1076 ("dwSignature", DWORD),
1077 ("dwStrucVersion", DWORD),
1078 ("dwFileVersionMS", DWORD),
1079 ("dwFileVersionLS", DWORD),
1080 ("dwProductVersionMS", DWORD),
1081 ("dwProductVersionLS", DWORD),
1082 ("dwFileFlagsMask", DWORD),
1083 ("dwFileFlags", DWORD),
1084 ("dwFileOS", DWORD),
1085 ("dwFileType", DWORD),
1086 ("dwFileSubtype", DWORD),
1087 ("dwFileDateMS", DWORD),
1088 ("dwFileDateLS", DWORD),
1089 ]
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100 -class THREADNAME_INFO(Structure):
1101 _fields_ = [
1102 ("dwType", DWORD),
1103 ("szName", LPVOID),
1104 ("dwThreadID", DWORD),
1105 ("dwFlags", DWORD),
1106 ]
1107
1129
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163 if sizeof(SIZE_T) == sizeof(DWORD):
1166 elif sizeof(SIZE_T) == sizeof(DWORD64):
1169 else:
1180 PMEMORY_BASIC_INFORMATION = POINTER(MEMORY_BASIC_INFORMATION)
1181
1182
1183
1184
1185
1186
1187
1188 -class FILETIME(Structure):
1189 _fields_ = [
1190 ('dwLowDateTime', DWORD),
1191 ('dwHighDateTime', DWORD),
1192 ]
1193 LPFILETIME = POINTER(FILETIME)
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205 -class SYSTEMTIME(Structure):
1206 _fields_ = [
1207 ('wYear', WORD),
1208 ('wMonth', WORD),
1209 ('wDayOfWeek', WORD),
1210 ('wDay', WORD),
1211 ('wHour', WORD),
1212 ('wMinute', WORD),
1213 ('wSecond', WORD),
1214 ('wMilliseconds', WORD),
1215 ]
1216 LPSYSTEMTIME = POINTER(SYSTEMTIME)
1243 LPBY_HANDLE_FILE_INFORMATION = ctypes.POINTER(BY_HANDLE_FILE_INFORMATION)
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261 -class FILE_INFO_BY_HANDLE_CLASS(object):
1276
1304 LPPROCESS_INFORMATION = POINTER(PROCESS_INFORMATION)
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328 -class STARTUPINFO(Structure):
1329 _fields_ = [
1330 ('cb', DWORD),
1331 ('lpReserved', LPSTR),
1332 ('lpDesktop', LPSTR),
1333 ('lpTitle', LPSTR),
1334 ('dwX', DWORD),
1335 ('dwY', DWORD),
1336 ('dwXSize', DWORD),
1337 ('dwYSize', DWORD),
1338 ('dwXCountChars', DWORD),
1339 ('dwYCountChars', DWORD),
1340 ('dwFillAttribute', DWORD),
1341 ('dwFlags', DWORD),
1342 ('wShowWindow', WORD),
1343 ('cbReserved2', WORD),
1344 ('lpReserved2', LPVOID),
1345 ('hStdInput', HANDLE),
1346 ('hStdOutput', HANDLE),
1347 ('hStdError', HANDLE),
1348 ]
1349 LPSTARTUPINFO = POINTER(STARTUPINFO)
1356 _fields_ = [
1357 ('StartupInfo', STARTUPINFO),
1358 ('lpAttributeList', PPROC_THREAD_ATTRIBUTE_LIST),
1359 ]
1360 LPSTARTUPINFOEX = POINTER(STARTUPINFOEX)
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373 -class JIT_DEBUG_INFO(Structure):
1374 _fields_ = [
1375 ('dwSize', DWORD),
1376 ('dwProcessorArchitecture', DWORD),
1377 ('dwThreadID', DWORD),
1378 ('dwReserved0', DWORD),
1379 ('lpExceptionAddress', ULONG64),
1380 ('lpExceptionRecord', ULONG64),
1381 ('lpContextRecord', ULONG64),
1382 ]
1383 JIT_DEBUG_INFO32 = JIT_DEBUG_INFO
1384 JIT_DEBUG_INFO64 = JIT_DEBUG_INFO
1385
1386 LPJIT_DEBUG_INFO = ctypes.POINTER(JIT_DEBUG_INFO)
1387 LPJIT_DEBUG_INFO32 = ctypes.POINTER(JIT_DEBUG_INFO32)
1388 LPJIT_DEBUG_INFO64 = ctypes.POINTER(JIT_DEBUG_INFO64)
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400 -class EXCEPTION_RECORD32(Structure):
1401 _fields_ = [
1402 ('ExceptionCode', DWORD),
1403 ('ExceptionFlags', DWORD),
1404 ('ExceptionRecord', DWORD),
1405 ('ExceptionAddress', DWORD),
1406 ('NumberParameters', DWORD),
1407 ('ExceptionInformation', DWORD * EXCEPTION_MAXIMUM_PARAMETERS),
1408 ]
1409
1410 PEXCEPTION_RECORD32 = POINTER(EXCEPTION_RECORD32)
1422 _fields_ = [
1423 ('ExceptionCode', DWORD),
1424 ('ExceptionFlags', DWORD),
1425 ('ExceptionRecord', DWORD64),
1426 ('ExceptionAddress', DWORD64),
1427 ('NumberParameters', DWORD),
1428 ('__unusedAlignment', DWORD),
1429 ('ExceptionInformation', DWORD64 * EXCEPTION_MAXIMUM_PARAMETERS),
1430 ]
1431
1432 PEXCEPTION_RECORD64 = POINTER(EXCEPTION_RECORD64)
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442 -class EXCEPTION_RECORD(Structure):
1444 PEXCEPTION_RECORD = POINTER(EXCEPTION_RECORD)
1445 EXCEPTION_RECORD._fields_ = [
1446 ('ExceptionCode', DWORD),
1447 ('ExceptionFlags', DWORD),
1448 ('ExceptionRecord', PEXCEPTION_RECORD),
1449 ('ExceptionAddress', LPVOID),
1450 ('NumberParameters', DWORD),
1451 ('ExceptionInformation', LPVOID * EXCEPTION_MAXIMUM_PARAMETERS),
1452 ]
1463
1470 _fields_ = [
1471 ('hThread', HANDLE),
1472 ('lpThreadLocalBase', LPVOID),
1473 ('lpStartAddress', LPVOID),
1474 ]
1475
1489 _fields_ = [
1490 ('hFile', HANDLE),
1491 ('hProcess', HANDLE),
1492 ('hThread', HANDLE),
1493 ('lpBaseOfImage', LPVOID),
1494 ('dwDebugInfoFileOffset', DWORD),
1495 ('nDebugInfoSize', DWORD),
1496 ('lpThreadLocalBase', LPVOID),
1497 ('lpStartAddress', LPVOID),
1498 ('lpImageName', LPVOID),
1499 ('fUnicode', WORD),
1500 ]
1501
1506 _fields_ = [
1507 ('dwExitCode', DWORD),
1508 ]
1509
1514 _fields_ = [
1515 ('dwExitCode', DWORD),
1516 ]
1517
1527 _fields_ = [
1528 ('hFile', HANDLE),
1529 ('lpBaseOfDll', LPVOID),
1530 ('dwDebugInfoFileOffset', DWORD),
1531 ('nDebugInfoSize', DWORD),
1532 ('lpImageName', LPVOID),
1533 ('fUnicode', WORD),
1534 ]
1535
1540 _fields_ = [
1541 ('lpBaseOfDll', LPVOID),
1542 ]
1543
1550 _fields_ = [
1551 ('lpDebugStringData', LPVOID),
1552 ('fUnicode', WORD),
1553 ('nDebugStringLength', WORD),
1554 ]
1555
1556
1557
1558
1559
1560 -class RIP_INFO(Structure):
1561 _fields_ = [
1562 ('dwError', DWORD),
1563 ('dwType', DWORD),
1564 ]
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582 -class _DEBUG_EVENT_UNION_(Union):
1583 _fields_ = [
1584 ('Exception', EXCEPTION_DEBUG_INFO),
1585 ('CreateThread', CREATE_THREAD_DEBUG_INFO),
1586 ('CreateProcessInfo', CREATE_PROCESS_DEBUG_INFO),
1587 ('ExitThread', EXIT_THREAD_DEBUG_INFO),
1588 ('ExitProcess', EXIT_PROCESS_DEBUG_INFO),
1589 ('LoadDll', LOAD_DLL_DEBUG_INFO),
1590 ('UnloadDll', UNLOAD_DLL_DEBUG_INFO),
1591 ('DebugString', OUTPUT_DEBUG_STRING_INFO),
1592 ('RipInfo', RIP_INFO),
1593 ]
1595 _fields_ = [
1596 ('dwDebugEventCode', DWORD),
1597 ('dwProcessId', DWORD),
1598 ('dwThreadId', DWORD),
1599 ('u', _DEBUG_EVENT_UNION_),
1600 ]
1601 LPDEBUG_EVENT = ctypes.POINTER(DEBUG_EVENT)
1602
1603
1604
1605 TH32CS_SNAPHEAPLIST = 0x00000001
1606 TH32CS_SNAPPROCESS = 0x00000002
1607 TH32CS_SNAPTHREAD = 0x00000004
1608 TH32CS_SNAPMODULE = 0x00000008
1609 TH32CS_INHERIT = 0x80000000
1610 TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE)
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621 -class THREADENTRY32(Structure):
1622 _fields_ = [
1623 ('dwSize', DWORD),
1624 ('cntUsage', DWORD),
1625 ('th32ThreadID', DWORD),
1626 ('th32OwnerProcessID', DWORD),
1627 ('tpBasePri', LONG),
1628 ('tpDeltaPri', LONG),
1629 ('dwFlags', DWORD),
1630 ]
1631 LPTHREADENTRY32 = ctypes.POINTER(THREADENTRY32)
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645 -class PROCESSENTRY32(Structure):
1646 _fields_ = [
1647 ('dwSize', DWORD),
1648 ('cntUsage', DWORD),
1649 ('th32ProcessID', DWORD),
1650 ('th32DefaultHeapID', ULONG_PTR),
1651 ('th32ModuleID', DWORD),
1652 ('cntThreads', DWORD),
1653 ('th32ParentProcessID', DWORD),
1654 ('pcPriClassBase', LONG),
1655 ('dwFlags', DWORD),
1656 ('szExeFile', TCHAR * 260),
1657 ]
1658 LPPROCESSENTRY32 = ctypes.POINTER(PROCESSENTRY32)
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672 -class MODULEENTRY32(Structure):
1673 _fields_ = [
1674 ("dwSize", DWORD),
1675 ("th32ModuleID", DWORD),
1676 ("th32ProcessID", DWORD),
1677 ("GlblcntUsage", DWORD),
1678 ("ProccntUsage", DWORD),
1679 ("modBaseAddr", LPVOID),
1680 ("modBaseSize", DWORD),
1681 ("hModule", HMODULE),
1682 ("szModule", TCHAR * (MAX_MODULE_NAME32 + 1)),
1683 ("szExePath", TCHAR * MAX_PATH),
1684 ]
1685 LPMODULEENTRY32 = ctypes.POINTER(MODULEENTRY32)
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699 -class HEAPENTRY32(Structure):
1700 _fields_ = [
1701 ("dwSize", SIZE_T),
1702 ("hHandle", HANDLE),
1703 ("dwAddress", ULONG_PTR),
1704 ("dwBlockSize", SIZE_T),
1705 ("dwFlags", DWORD),
1706 ("dwLockCount", DWORD),
1707 ("dwResvd", DWORD),
1708 ("th32ProcessID", DWORD),
1709 ("th32HeapID", ULONG_PTR),
1710 ]
1711 LPHEAPENTRY32 = ctypes.POINTER(HEAPENTRY32)
1712
1713
1714
1715
1716
1717
1718
1719
1720 -class HEAPLIST32(Structure):
1721 _fields_ = [
1722 ("dwSize", SIZE_T),
1723 ("th32ProcessID", DWORD),
1724 ("th32HeapID", ULONG_PTR),
1725 ("dwFlags", DWORD),
1726 ]
1727 LPHEAPLIST32 = POINTER(HEAPLIST32)
1733 _GetLastError = windll.kernel32.GetLastError
1734 _GetLastError.argtypes = []
1735 _GetLastError.restype = DWORD
1736 return _GetLastError()
1737
1742 _SetLastError = windll.kernel32.SetLastError
1743 _SetLastError.argtypes = [DWORD]
1744 _SetLastError.restype = None
1745 _SetLastError(dwErrCode)
1746
1760
1771 _DuplicateHandle = windll.kernel32.DuplicateHandle
1772 _DuplicateHandle.argtypes = [HANDLE, HANDLE, HANDLE, LPHANDLE, DWORD, BOOL, DWORD]
1773 _DuplicateHandle.restype = bool
1774 _DuplicateHandle.errcheck = RaiseIfZero
1775
1776 if hSourceProcessHandle is None:
1777 hSourceProcessHandle = GetCurrentProcess()
1778 if hTargetProcessHandle is None:
1779 hTargetProcessHandle = hSourceProcessHandle
1780 lpTargetHandle = HANDLE(INVALID_HANDLE_VALUE)
1781 _DuplicateHandle(hSourceHandle, hSourceProcessHandle, hTargetProcessHandle, ctypes.byref(lpTargetHandle), dwDesiredAccess, bool(bInheritHandle), dwOptions)
1782 if isinstance(hSourceHandle, Handle):
1783 HandleClass = hSourceHandle.__class__
1784 else:
1785 HandleClass = Handle
1786 return HandleClass(lpTargetHandle.value)
1787
1792 _LocalFree = windll.kernel32.LocalFree
1793 _LocalFree.argtypes = [HLOCAL]
1794 _LocalFree.restype = HLOCAL
1795
1796 result = _LocalFree(hMem)
1797 if result != NULL:
1798 ctypes.WinError()
1799
1808 _GetDllDirectoryA = windll.kernel32.GetDllDirectoryA
1809 _GetDllDirectoryA.argytpes = [DWORD, LPSTR]
1810 _GetDllDirectoryA.restype = DWORD
1811
1812 nBufferLength = _GetDllDirectoryA(0, None)
1813 if nBufferLength == 0:
1814 return None
1815 lpBuffer = ctypes.create_string_buffer("", nBufferLength)
1816 _GetDllDirectoryA(nBufferLength, ctypes.byref(lpBuffer))
1817 return lpBuffer.value
1818
1820 _GetDllDirectoryW = windll.kernel32.GetDllDirectoryW
1821 _GetDllDirectoryW.argytpes = [DWORD, LPWSTR]
1822 _GetDllDirectoryW.restype = DWORD
1823
1824 nBufferLength = _GetDllDirectoryW(0, None)
1825 if nBufferLength == 0:
1826 return None
1827 lpBuffer = ctypes.create_unicode_buffer(u"", nBufferLength)
1828 _GetDllDirectoryW(nBufferLength, ctypes.byref(lpBuffer))
1829 return lpBuffer.value
1830
1831 GetDllDirectory = GuessStringType(GetDllDirectoryA, GetDllDirectoryW)
1837 _SetDllDirectoryA = windll.kernel32.SetDllDirectoryA
1838 _SetDllDirectoryA.argytpes = [LPSTR]
1839 _SetDllDirectoryA.restype = bool
1840 _SetDllDirectoryA.errcheck = RaiseIfZero
1841 _SetDllDirectoryA(lpPathName)
1842
1844 _SetDllDirectoryW = windll.kernel32.SetDllDirectoryW
1845 _SetDllDirectoryW.argytpes = [LPWSTR]
1846 _SetDllDirectoryW.restype = bool
1847 _SetDllDirectoryW.errcheck = RaiseIfZero
1848 _SetDllDirectoryW(lpPathName)
1849
1850 SetDllDirectory = GuessStringType(SetDllDirectoryA, SetDllDirectoryW)
1863
1872
1873 LoadLibrary = GuessStringType(LoadLibraryA, LoadLibraryW)
1874
1875
1876
1877
1878
1879
1880 -def LoadLibraryExA(pszLibrary, dwFlags = 0):
1888
1897
1898 LoadLibraryEx = GuessStringType(LoadLibraryExA, LoadLibraryExW)
1911
1920
1921 GetModuleHandle = GuessStringType(GetModuleHandleA, GetModuleHandleW)
1928 _GetProcAddress = windll.kernel32.GetProcAddress
1929 _GetProcAddress.argtypes = [HMODULE, LPVOID]
1930 _GetProcAddress.restype = LPVOID
1931
1932 if type(lpProcName) in (type(0), type(0L)):
1933 lpProcName = LPVOID(lpProcName)
1934 if lpProcName.value & (~0xFFFF):
1935 raise ValueError, 'Ordinal number too large: %d' % lpProcName.value
1936 elif type(lpProcName) == type(""):
1937 lpProcName = ctypes.c_char_p(lpProcName)
1938 else:
1939 raise TypeError, str(type(lpProcName))
1940 return _GetProcAddress(hModule, lpProcName)
1941
1951
1982
2004
2005 QueryFullProcessImageName = GuessStringType(QueryFullProcessImageNameA, QueryFullProcessImageNameW)
2012 _GetLogicalDriveStringsA = ctypes.windll.kernel32.GetLogicalDriveStringsA
2013 _GetLogicalDriveStringsA.argtypes = [DWORD, LPSTR]
2014 _GetLogicalDriveStringsA.restype = DWORD
2015 _GetLogicalDriveStringsA.errcheck = RaiseIfZero
2016
2017 nBufferLength = (4 * 26) + 1
2018 lpBuffer = ctypes.create_string_buffer('', nBufferLength)
2019 _GetLogicalDriveStringsA(nBufferLength, lpBuffer)
2020 drive_strings = list()
2021 string_p = ctypes.addressof(lpBuffer)
2022 sizeof_char = ctypes.sizeof(ctypes.c_char)
2023 while True:
2024 string_v = ctypes.string_at(string_p)
2025 if string_v == '':
2026 break
2027 drive_strings.append(string_v)
2028 string_p += len(string_v) + sizeof_char
2029 return drive_strings
2030
2032 _GetLogicalDriveStringsW = ctypes.windll.kernel32.GetLogicalDriveStringsW
2033 _GetLogicalDriveStringsW.argtypes = [DWORD, LPWSTR]
2034 _GetLogicalDriveStringsW.restype = DWORD
2035 _GetLogicalDriveStringsW.errcheck = RaiseIfZero
2036
2037 nBufferLength = (4 * 26) + 1
2038 lpBuffer = ctypes.create_unicode_buffer(u'', nBufferLength)
2039 _GetLogicalDriveStringsW(nBufferLength, lpBuffer)
2040 drive_strings = list()
2041 string_p = ctypes.addressof(lpBuffer)
2042 sizeof_wchar = ctypes.sizeof(ctypes.c_wchar)
2043 while True:
2044 string_v = ctypes.wstring_at(string_p)
2045 if string_v == u'':
2046 break
2047 drive_strings.append(string_v)
2048 string_p += (len(string_v) * sizeof_wchar) + sizeof_wchar
2049 return drive_strings
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099 GetLogicalDriveStrings = GuessStringType(GetLogicalDriveStringsA, GetLogicalDriveStringsW)
2107 _QueryDosDeviceA = windll.kernel32.QueryDosDeviceA
2108 _QueryDosDeviceA.argtypes = [LPSTR, LPSTR, DWORD]
2109 _QueryDosDeviceA.restype = DWORD
2110 _QueryDosDeviceA.errcheck = RaiseIfZero
2111
2112 if not lpDeviceName:
2113 lpDeviceName = None
2114 ucchMax = 0x1000
2115 lpTargetPath = ctypes.create_string_buffer('', ucchMax)
2116 _QueryDosDeviceA(lpDeviceName, lpTargetPath, ucchMax)
2117 return lpTargetPath.value
2118
2120 _QueryDosDeviceW = windll.kernel32.QueryDosDeviceW
2121 _QueryDosDeviceW.argtypes = [LPWSTR, LPWSTR, DWORD]
2122 _QueryDosDeviceW.restype = DWORD
2123 _QueryDosDeviceW.errcheck = RaiseIfZero
2124
2125 if not lpDeviceName:
2126 lpDeviceName = None
2127 ucchMax = 0x1000
2128 lpTargetPath = ctypes.create_unicode_buffer(u'', ucchMax)
2129 _QueryDosDeviceW(lpDeviceName, lpTargetPath, ucchMax)
2130 return lpTargetPath.value
2131
2132 QueryDosDevice = GuessStringType(QueryDosDeviceA, QueryDosDeviceW)
2142 _MapViewOfFile = windll.kernel32.MapViewOfFile
2143 _MapViewOfFile.argtypes = [HANDLE, DWORD, DWORD, DWORD, SIZE_T]
2144 _MapViewOfFile.restype = LPVOID
2145 lpBaseAddress = _MapViewOfFile(hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap)
2146 if lpBaseAddress == NULL:
2147 raise ctypes.WinError()
2148 return lpBaseAddress
2149
2154 _UnmapViewOfFile = windll.kernel32.UnmapViewOfFile
2155 _UnmapViewOfFile.argtypes = [LPVOID]
2156 _UnmapViewOfFile.restype = bool
2157 _UnmapViewOfFile.errcheck = RaiseIfZero
2158 _UnmapViewOfFile(lpBaseAddress)
2159
2160
2161
2162
2163
2164
2165 -def OpenFileMappingA(dwDesiredAccess, bInheritHandle, lpName):
2172
2180
2181 OpenFileMapping = GuessStringType(OpenFileMappingA, OpenFileMappingW)
2192 _CreateFileMappingA = windll.kernel32.CreateFileMappingA
2193 _CreateFileMappingA.argtypes = [HANDLE, LPVOID, DWORD, DWORD, DWORD, LPSTR]
2194 _CreateFileMappingA.restype = HANDLE
2195 _CreateFileMappingA.errcheck = RaiseIfZero
2196
2197 if lpAttributes:
2198 lpAttributes = ctypes.pointer(lpAttributes)
2199 if not lpName:
2200 lpName = None
2201 hFileMappingObject = _CreateFileMappingA(hFile, lpAttributes, flProtect, dwMaximumSizeHigh, dwMaximumSizeLow, lpName)
2202 return FileMappingHandle(hFileMappingObject)
2203
2205 _CreateFileMappingW = windll.kernel32.CreateFileMappingW
2206 _CreateFileMappingW.argtypes = [HANDLE, LPVOID, DWORD, DWORD, DWORD, LPWSTR]
2207 _CreateFileMappingW.restype = HANDLE
2208 _CreateFileMappingW.errcheck = RaiseIfZero
2209
2210 if lpAttributes:
2211 lpAttributes = ctypes.pointer(lpAttributes)
2212 if not lpName:
2213 lpName = None
2214 hFileMappingObject = _CreateFileMappingW(hFile, lpAttributes, flProtect, dwMaximumSizeHigh, dwMaximumSizeLow, lpName)
2215 return FileMappingHandle(hFileMappingObject)
2216
2217 CreateFileMapping = GuessStringType(CreateFileMappingA, CreateFileMappingW)
2229 _CreateFileA = windll.kernel32.CreateFileA
2230 _CreateFileA.argtypes = [LPSTR, DWORD, DWORD, LPVOID, DWORD, DWORD, HANDLE]
2231 _CreateFileA.restype = HANDLE
2232
2233 if not lpFileName:
2234 lpFileName = None
2235 if lpSecurityAttributes:
2236 lpSecurityAttributes = ctypes.pointer(lpSecurityAttributes)
2237 hFile = _CreateFileA(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile)
2238 if hFile == INVALID_HANDLE_VALUE:
2239 raise ctypes.WinError()
2240 return FileHandle(hFile)
2241
2243 _CreateFileW = windll.kernel32.CreateFileW
2244 _CreateFileW.argtypes = [LPWSTR, DWORD, DWORD, LPVOID, DWORD, DWORD, HANDLE]
2245 _CreateFileW.restype = HANDLE
2246
2247 if not lpFileName:
2248 lpFileName = None
2249 if lpSecurityAttributes:
2250 lpSecurityAttributes = ctypes.pointer(lpSecurityAttributes)
2251 hFile = _CreateFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile)
2252 if hFile == INVALID_HANDLE_VALUE:
2253 raise ctypes.WinError()
2254 return FileHandle(hFile)
2255
2256 CreateFile = GuessStringType(CreateFileA, CreateFileW)
2267
2268
2269
2270
2271
2272 -def FlushViewOfFile(lpBaseAddress, dwNumberOfBytesToFlush = 0):
2273 _FlushViewOfFile = windll.kernel32.FlushViewOfFile
2274 _FlushViewOfFile.argtypes = [LPVOID, SIZE_T]
2275 _FlushViewOfFile.restype = bool
2276 _FlushViewOfFile.errcheck = RaiseIfZero
2277 _FlushViewOfFile(lpBaseAddress, dwNumberOfBytesToFlush)
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287 -def SearchPathA(lpPath, lpFileName, lpExtension):
2288 _SearchPathA = windll.kernel32.SearchPathA
2289 _SearchPathA.argtypes = [LPSTR, LPSTR, LPSTR, DWORD, LPSTR, ctypes.POINTER(LPSTR)]
2290 _SearchPathA.restype = DWORD
2291 _SearchPathA.errcheck = RaiseIfZero
2292
2293 if not lpPath:
2294 lpPath = None
2295 if not lpExtension:
2296 lpExtension = None
2297 nBufferLength = _SearchPathA(lpPath, lpFileName, lpExtension, 0, None, None)
2298 lpBuffer = ctypes.create_string_buffer('', nBufferLength + 1)
2299 lpFilePart = LPSTR()
2300 _SearchPathA(lpPath, lpFileName, lpExtension, nBufferLength, lpBuffer, ctypes.byref(lpFilePart))
2301 lpFilePart = lpFilePart.value
2302 lpBuffer = lpBuffer.value
2303 if lpBuffer == '':
2304 if GetLastError() == ERROR_SUCCESS:
2305 raise ctypes.WinError(ERROR_FILE_NOT_FOUND)
2306 raise ctypes.WinError()
2307 return (lpBuffer, lpFilePart)
2308
2310 _SearchPathW = windll.kernel32.SearchPathW
2311 _SearchPathW.argtypes = [LPWSTR, LPWSTR, LPWSTR, DWORD, LPWSTR, POINTER(LPWSTR)]
2312 _SearchPathW.restype = DWORD
2313 _SearchPathW.errcheck = RaiseIfZero
2314
2315 if not lpPath:
2316 lpPath = None
2317 if not lpExtension:
2318 lpExtension = None
2319 nBufferLength = _SearchPathW(lpPath, lpFileName, lpExtension, 0, None, None)
2320 lpBuffer = ctypes.create_unicode_buffer(u'', nBufferLength + 1)
2321 lpFilePart = LPWSTR()
2322 _SearchPathW(lpPath, lpFileName, lpExtension, nBufferLength, lpBuffer, ctypes.byref(lpFilePart))
2323 lpFilePart = lpFilePart.value
2324 lpBuffer = lpBuffer.value
2325 if lpBuffer == u'':
2326 if GetLastError() == ERROR_SUCCESS:
2327 raise ctypes.WinError(ERROR_FILE_NOT_FOUND)
2328 raise ctypes.WinError()
2329 return (lpBuffer, lpFilePart)
2330
2331 SearchPath = GuessStringType(SearchPathA, SearchPathW)
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353 -def DeviceIoControl(hDevice, dwIoControlCode, lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, lpOverlapped):
2354 _DeviceIoControl = windll.kernel32.DeviceIoControl
2355 _DeviceIoControl.argtypes = [HANDLE, DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPOVERLAPPED]
2356 _DeviceIoControl.restype = bool
2357 _DeviceIoControl.errcheck = RaiseIfZero
2358
2359 if not lpInBuffer:
2360 lpInBuffer = None
2361 if not lpOutBuffer:
2362 lpOutBuffer = None
2363 if lpOverlapped:
2364 lpOverlapped = ctypes.pointer(lpOverlapped)
2365 lpBytesReturned = DWORD(0)
2366 _DeviceIoControl(hDevice, dwIoControlCode, lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, ctypes.byref(lpBytesReturned), lpOverlapped)
2367 return lpBytesReturned.value
2368
2382
2398
2406 _GetFinalPathNameByHandleA = windll.kernel32.GetFinalPathNameByHandleA
2407 _GetFinalPathNameByHandleA.argtypes = [HANDLE, LPSTR, DWORD, DWORD]
2408 _GetFinalPathNameByHandleA.restype = DWORD
2409
2410 cchFilePath = _GetFinalPathNameByHandleA(hFile, None, 0, dwFlags)
2411 if cchFilePath == 0:
2412 raise ctypes.WinError()
2413 lpszFilePath = ctypes.create_string_buffer('', cchFilePath + 1)
2414 nCopied = _GetFinalPathNameByHandleA(hFile, lpszFilePath, cchFilePath, dwFlags)
2415 if nCopied <= 0 or nCopied > cchFilePath:
2416 raise ctypes.WinError()
2417 return lpszFilePath.value
2418
2420 _GetFinalPathNameByHandleW = windll.kernel32.GetFinalPathNameByHandleW
2421 _GetFinalPathNameByHandleW.argtypes = [HANDLE, LPWSTR, DWORD, DWORD]
2422 _GetFinalPathNameByHandleW.restype = DWORD
2423
2424 cchFilePath = _GetFinalPathNameByHandleW(hFile, None, 0, dwFlags)
2425 if cchFilePath == 0:
2426 raise ctypes.WinError()
2427 lpszFilePath = ctypes.create_unicode_buffer(u'', cchFilePath + 1)
2428 nCopied = _GetFinalPathNameByHandleW(hFile, lpszFilePath, cchFilePath, dwFlags)
2429 if nCopied <= 0 or nCopied > cchFilePath:
2430 raise ctypes.WinError()
2431 return lpszFilePath.value
2432
2433 GetFinalPathNameByHandle = GuessStringType(GetFinalPathNameByHandleA, GetFinalPathNameByHandleW)
2442 _GetFullPathNameA = windll.kernel32.GetFullPathNameA
2443 _GetFullPathNameA.argtypes = [LPSTR, DWORD, LPSTR, ctypes.POINTER(LPSTR)]
2444 _GetFullPathNameA.restype = DWORD
2445
2446 nBufferLength = _GetFullPathNameA(lpFileName, 0, None, None)
2447 if nBufferLength <= 0:
2448 raise ctypes.WinError()
2449 lpBuffer = ctypes.create_string_buffer('', nBufferLength + 1)
2450 lpFilePart = LPSTR
2451 nCopied = _GetFullPathNameA(lpFileName, nBufferLength, lpBuffer, ctypes.byref(lpFilePart))
2452 if nCopied > nBufferLength or nCopied == 0:
2453 raise ctypes.WinError()
2454 return lpBuffer.value, lpFilePart.value
2455
2457 _GetFullPathNameW = windll.kernel32.GetFullPathNameW
2458 _GetFullPathNameW.argtypes = [LPWSTR, DWORD, LPWSTR, POINTER(LPWSTR)]
2459 _GetFullPathNameW.restype = DWORD
2460
2461 nBufferLength = _GetFullPathNameW(lpFileName, 0, None, None)
2462 if nBufferLength <= 0:
2463 raise ctypes.WinError()
2464 lpBuffer = ctypes.create_unicode_buffer(u'', nBufferLength + 1)
2465 lpFilePart = LPSTR
2466 nCopied = _GetFullPathNameW(lpFileName, nBufferLength, lpBuffer, ctypes.byref(lpFilePart))
2467 if nCopied > nBufferLength or nCopied == 0:
2468 raise ctypes.WinError()
2469 return lpBuffer.value, lpFilePart.value
2470
2471 GetFullPathName = GuessStringType(GetFullPathNameA, GetFullPathNameW)
2478 _GetTempPathA = windll.kernel32.GetTempPathA
2479 _GetTempPathA.argtypes = [DWORD, LPSTR]
2480 _GetTempPathA.restype = DWORD
2481
2482 nBufferLength = _GetTempPathA(0, None)
2483 if nBufferLength <= 0:
2484 raise ctypes.WinError()
2485 lpBuffer = ctypes.create_string_buffer('', nBufferLength)
2486 nCopied = _GetTempPathA(nBufferLength, lpBuffer)
2487 if nCopied > nBufferLength or nCopied == 0:
2488 raise ctypes.WinError()
2489 return lpBuffer.value
2490
2492 _GetTempPathW = windll.kernel32.GetTempPathW
2493 _GetTempPathW.argtypes = [DWORD, LPWSTR]
2494 _GetTempPathW.restype = DWORD
2495
2496 nBufferLength = _GetTempPathW(0, None)
2497 if nBufferLength <= 0:
2498 raise ctypes.WinError()
2499 lpBuffer = ctypes.create_unicode_buffer(u'', nBufferLength)
2500 nCopied = _GetTempPathW(nBufferLength, lpBuffer)
2501 if nCopied > nBufferLength or nCopied == 0:
2502 raise ctypes.WinError()
2503 return lpBuffer.value
2504
2505 GetTempPath = GuessStringType(GetTempPathA, GetTempPathW)
2506
2507
2508
2509
2510
2511
2512
2513 -def GetTempFileNameA(lpPathName = None, lpPrefixString = "TMP", uUnique = 0):
2514 _GetTempFileNameA = windll.kernel32.GetTempFileNameA
2515 _GetTempFileNameA.argtypes = [LPSTR, LPSTR, UINT, LPSTR]
2516 _GetTempFileNameA.restype = UINT
2517
2518 if lpPathName is None:
2519 lpPathName = GetTempPathA()
2520 lpTempFileName = ctypes.create_string_buffer('', MAX_PATH)
2521 uUnique = _GetTempFileNameA(lpPathName, lpPrefixString, uUnique, lpTempFileName)
2522 if uUnique == 0:
2523 raise ctypes.WinError()
2524 return lpTempFileName.value, uUnique
2525
2527 _GetTempFileNameW = windll.kernel32.GetTempFileNameW
2528 _GetTempFileNameW.argtypes = [LPWSTR, LPWSTR, UINT, LPWSTR]
2529 _GetTempFileNameW.restype = UINT
2530
2531 if lpPathName is None:
2532 lpPathName = GetTempPathW()
2533 lpTempFileName = ctypes.create_unicode_buffer(u'', MAX_PATH)
2534 uUnique = _GetTempFileNameW(lpPathName, lpPrefixString, uUnique, lpTempFileName)
2535 if uUnique == 0:
2536 raise ctypes.WinError()
2537 return lpTempFileName.value, uUnique
2538
2539 GetTempFileName = GuessStringType(GetTempFileNameA, GetTempFileNameW)
2546 _GetCurrentDirectoryA = windll.kernel32.GetCurrentDirectoryA
2547 _GetCurrentDirectoryA.argtypes = [DWORD, LPSTR]
2548 _GetCurrentDirectoryA.restype = DWORD
2549
2550 nBufferLength = _GetCurrentDirectoryA(0, None)
2551 if nBufferLength <= 0:
2552 raise ctypes.WinError()
2553 lpBuffer = ctypes.create_string_buffer('', nBufferLength)
2554 nCopied = _GetCurrentDirectoryA(nBufferLength, lpBuffer)
2555 if nCopied > nBufferLength or nCopied == 0:
2556 raise ctypes.WinError()
2557 return lpBuffer.value
2558
2560 _GetCurrentDirectoryW = windll.kernel32.GetCurrentDirectoryW
2561 _GetCurrentDirectoryW.argtypes = [DWORD, LPWSTR]
2562 _GetCurrentDirectoryW.restype = DWORD
2563
2564 nBufferLength = _GetCurrentDirectoryW(0, None)
2565 if nBufferLength <= 0:
2566 raise ctypes.WinError()
2567 lpBuffer = ctypes.create_unicode_buffer(u'', nBufferLength)
2568 nCopied = _GetCurrentDirectoryW(nBufferLength, lpBuffer)
2569 if nCopied > nBufferLength or nCopied == 0:
2570 raise ctypes.WinError()
2571 return lpBuffer.value
2572
2573 GetCurrentDirectory = GuessStringType(GetCurrentDirectoryA, GetCurrentDirectoryW)
2574
2575
2576
2577
2578
2579
2580
2581 PHANDLER_ROUTINE = ctypes.WINFUNCTYPE(BOOL, DWORD)
2588 _SetConsoleCtrlHandler = windll.kernel32.SetConsoleCtrlHandler
2589 _SetConsoleCtrlHandler.argtypes = [PHANDLER_ROUTINE, BOOL]
2590 _SetConsoleCtrlHandler.restype = bool
2591 _SetConsoleCtrlHandler.errcheck = RaiseIfZero
2592 _SetConsoleCtrlHandler(HandlerRoutine, bool(Add))
2593
2602 _GenerateConsoleCtrlEvent = windll.kernel32.GenerateConsoleCtrlEvent
2603 _GenerateConsoleCtrlEvent.argtypes = [DWORD, DWORD]
2604 _GenerateConsoleCtrlEvent.restype = bool
2605 _GenerateConsoleCtrlEvent.errcheck = RaiseIfZero
2606 _GenerateConsoleCtrlEvent(dwCtrlEvent, dwProcessGroupId)
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625 -def WaitForSingleObject(hHandle, dwMilliseconds = INFINITE):
2626 _WaitForSingleObject = windll.kernel32.WaitForSingleObject
2627 _WaitForSingleObject.argtypes = [HANDLE, DWORD]
2628 _WaitForSingleObject.restype = DWORD
2629
2630 if not dwMilliseconds and dwMilliseconds != 0:
2631 dwMilliseconds = INFINITE
2632 if dwMilliseconds != INFINITE:
2633 r = _WaitForSingleObject(hHandle, dwMilliseconds)
2634 if r == WAIT_FAILED:
2635 raise ctypes.WinError()
2636 else:
2637 while 1:
2638 r = _WaitForSingleObject(hHandle, 100)
2639 if r == WAIT_FAILED:
2640 raise ctypes.WinError()
2641 if r != WAIT_TIMEOUT:
2642 break
2643 return r
2644
2651 _WaitForSingleObjectEx = windll.kernel32.WaitForSingleObjectEx
2652 _WaitForSingleObjectEx.argtypes = [HANDLE, DWORD, BOOL]
2653 _WaitForSingleObjectEx.restype = DWORD
2654
2655 if not dwMilliseconds and dwMilliseconds != 0:
2656 dwMilliseconds = INFINITE
2657 if dwMilliseconds != INFINITE:
2658 r = _WaitForSingleObjectEx(hHandle, dwMilliseconds, bool(bAlertable))
2659 if r == WAIT_FAILED:
2660 raise ctypes.WinError()
2661 else:
2662 while 1:
2663 r = _WaitForSingleObjectEx(hHandle, 100, bool(bAlertable))
2664 if r == WAIT_FAILED:
2665 raise ctypes.WinError()
2666 if r != WAIT_TIMEOUT:
2667 break
2668 return r
2669
2698
2728
2737 _WaitForDebugEvent = windll.kernel32.WaitForDebugEvent
2738 _WaitForDebugEvent.argtypes = [LPDEBUG_EVENT, DWORD]
2739 _WaitForDebugEvent.restype = DWORD
2740
2741 if not dwMilliseconds and dwMilliseconds != 0:
2742 dwMilliseconds = INFINITE
2743 lpDebugEvent = DEBUG_EVENT()
2744 lpDebugEvent.dwDebugEventCode = 0
2745 lpDebugEvent.dwProcessId = 0
2746 lpDebugEvent.dwThreadId = 0
2747 if dwMilliseconds != INFINITE:
2748 success = _WaitForDebugEvent(ctypes.byref(lpDebugEvent), dwMilliseconds)
2749 if success == 0:
2750 raise ctypes.WinError()
2751 else:
2752 while 1:
2753 success = _WaitForDebugEvent(ctypes.byref(lpDebugEvent), 100)
2754 if success != 0:
2755 break
2756 code = GetLastError()
2757 if code not in (ERROR_SEM_TIMEOUT, WAIT_TIMEOUT):
2758 raise ctypes.WinError(code)
2759 return lpDebugEvent
2760
2772
2785
2795
2805
2811 _CheckRemoteDebuggerPresent = windll.kernel32.CheckRemoteDebuggerPresent
2812 _CheckRemoteDebuggerPresent.argtypes = [HANDLE, PBOOL]
2813 _CheckRemoteDebuggerPresent.restype = bool
2814 _CheckRemoteDebuggerPresent.errcheck = RaiseIfZero
2815
2816 pbDebuggerPresent = BOOL(0)
2817 _CheckRemoteDebuggerPresent(hProcess, ctypes.byref(pbDebuggerPresent))
2818 return bool(pbDebuggerPresent.value)
2819
2824 _DebugSetProcessKillOnExit = windll.kernel32.DebugSetProcessKillOnExit
2825 _DebugSetProcessKillOnExit.argtypes = [BOOL]
2826 _DebugSetProcessKillOnExit.restype = bool
2827 _DebugSetProcessKillOnExit.errcheck = RaiseIfZero
2828 _DebugSetProcessKillOnExit(bool(KillOnExit))
2829
2839
2844 _OutputDebugStringA = windll.kernel32.OutputDebugStringA
2845 _OutputDebugStringA.argtypes = [LPSTR]
2846 _OutputDebugStringA.restype = None
2847 _OutputDebugStringA(lpOutputString)
2848
2850 _OutputDebugStringW = windll.kernel32.OutputDebugStringW
2851 _OutputDebugStringW.argtypes = [LPWSTR]
2852 _OutputDebugStringW.restype = None
2853 _OutputDebugStringW(lpOutputString)
2854
2855 OutputDebugString = GuessStringType(OutputDebugStringA, OutputDebugStringW)
2856
2857
2858
2859
2860
2861
2862
2863
2864 -def ReadProcessMemory(hProcess, lpBaseAddress, nSize):
2865 _ReadProcessMemory = windll.kernel32.ReadProcessMemory
2866 _ReadProcessMemory.argtypes = [HANDLE, LPVOID, LPVOID, SIZE_T, POINTER(SIZE_T)]
2867 _ReadProcessMemory.restype = bool
2868
2869 lpBuffer = ctypes.create_string_buffer('', nSize)
2870 lpNumberOfBytesRead = SIZE_T(0)
2871 success = _ReadProcessMemory(hProcess, lpBaseAddress, lpBuffer, nSize, ctypes.byref(lpNumberOfBytesRead))
2872 if not success and GetLastError() != ERROR_PARTIAL_COPY:
2873 raise ctypes.WinError()
2874 return str(lpBuffer.raw)[:lpNumberOfBytesRead.value]
2875
2876
2877
2878
2879
2880
2881
2882
2883 -def WriteProcessMemory(hProcess, lpBaseAddress, lpBuffer):
2884 _WriteProcessMemory = windll.kernel32.WriteProcessMemory
2885 _WriteProcessMemory.argtypes = [HANDLE, LPVOID, LPVOID, SIZE_T, ctypes.POINTER(SIZE_T)]
2886 _WriteProcessMemory.restype = bool
2887
2888 nSize = len(lpBuffer)
2889 lpBuffer = ctypes.create_string_buffer(lpBuffer)
2890 lpNumberOfBytesWritten = SIZE_T(0)
2891 success = _WriteProcessMemory(hProcess, lpBaseAddress, lpBuffer, nSize, ctypes.byref(lpNumberOfBytesWritten))
2892 if not success and GetLastError() != ERROR_PARTIAL_COPY:
2893 raise ctypes.WinError()
2894 return lpNumberOfBytesWritten.value
2895
2904 _VirtualAllocEx = windll.kernel32.VirtualAllocEx
2905 _VirtualAllocEx.argtypes = [HANDLE, LPVOID, SIZE_T, DWORD, DWORD]
2906 _VirtualAllocEx.restype = LPVOID
2907
2908 lpAddress = _VirtualAllocEx(hProcess, lpAddress, dwSize, flAllocationType, flProtect)
2909 if lpAddress == NULL:
2910 raise ctypes.WinError()
2911 return lpAddress
2912
2913
2914
2915
2916
2917
2918
2919 -def VirtualQueryEx(hProcess, lpAddress):
2930
2939 _VirtualProtectEx = windll.kernel32.VirtualProtectEx
2940 _VirtualProtectEx.argtypes = [HANDLE, LPVOID, SIZE_T, DWORD, PDWORD]
2941 _VirtualProtectEx.restype = bool
2942 _VirtualProtectEx.errcheck = RaiseIfZero
2943
2944 flOldProtect = DWORD(0)
2945 _VirtualProtectEx(hProcess, lpAddress, dwSize, flNewProtect, ctypes.byref(flOldProtect))
2946 return flOldProtect.value
2947
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970 -def CreateRemoteThread(hProcess, lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags):
2971 _CreateRemoteThread = windll.kernel32.CreateRemoteThread
2972 _CreateRemoteThread.argtypes = [HANDLE, LPSECURITY_ATTRIBUTES, SIZE_T, LPVOID, LPVOID, DWORD, LPDWORD]
2973 _CreateRemoteThread.restype = HANDLE
2974
2975 if not lpThreadAttributes:
2976 lpThreadAttributes = None
2977 else:
2978 lpThreadAttributes = ctypes.byref(lpThreadAttributes)
2979 dwThreadId = DWORD(0)
2980 hThread = _CreateRemoteThread(hProcess, lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, ctypes.byref(dwThreadId))
2981 if hThread == INVALID_HANDLE_VALUE:
2982 raise ctypes.WinError()
2983 return ThreadHandle(hThread), dwThreadId.value
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000 -def CreateProcessA(lpApplicationName, lpCommandLine=None, lpProcessAttributes=None, lpThreadAttributes=None, bInheritHandles=False, dwCreationFlags=0, lpEnvironment=None, lpCurrentDirectory=None, lpStartupInfo=None):
3001 _CreateProcessA = windll.kernel32.CreateProcessA
3002 _CreateProcessA.argtypes = [LPSTR, LPSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, BOOL, DWORD, LPVOID, LPSTR, LPVOID, LPPROCESS_INFORMATION]
3003 _CreateProcessA.restype = bool
3004 _CreateProcessA.errcheck = RaiseIfZero
3005
3006 if not lpApplicationName:
3007 lpApplicationName = None
3008 if not lpCommandLine:
3009 lpCommandLine = None
3010 else:
3011 lpCommandLine = ctypes.create_string_buffer(lpCommandLine)
3012 if not lpEnvironment:
3013 lpEnvironment = None
3014 else:
3015 lpEnvironment = ctypes.create_string_buffer(lpEnvironment)
3016 if not lpCurrentDirectory:
3017 lpCurrentDirectory = None
3018 if not lpProcessAttributes:
3019 lpProcessAttributes = None
3020 else:
3021 lpProcessAttributes = ctypes.byref(lpProcessAttributes)
3022 if not lpThreadAttributes:
3023 lpThreadAttributes = None
3024 else:
3025 lpThreadAttributes = ctypes.byref(lpThreadAttributes)
3026 if not lpStartupInfo:
3027 lpStartupInfo = STARTUPINFO()
3028 lpStartupInfo.cb = sizeof(STARTUPINFO)
3029 lpStartupInfo.lpReserved = 0
3030 lpStartupInfo.lpDesktop = 0
3031 lpStartupInfo.lpTitle = 0
3032 lpStartupInfo.dwFlags = 0
3033 lpStartupInfo.cbReserved2 = 0
3034 lpStartupInfo.lpReserved2 = 0
3035 lpProcessInformation = PROCESS_INFORMATION()
3036 lpProcessInformation.hProcess = INVALID_HANDLE_VALUE
3037 lpProcessInformation.hThread = INVALID_HANDLE_VALUE
3038 lpProcessInformation.dwProcessId = 0
3039 lpProcessInformation.dwThreadId = 0
3040 _CreateProcessA(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bool(bInheritHandles), dwCreationFlags, lpEnvironment, lpCurrentDirectory, ctypes.byref(lpStartupInfo), ctypes.byref(lpProcessInformation))
3041 return ProcessInformation(lpProcessInformation)
3042
3043 -def CreateProcessW(lpApplicationName, lpCommandLine=None, lpProcessAttributes=None, lpThreadAttributes=None, bInheritHandles=False, dwCreationFlags=0, lpEnvironment=None, lpCurrentDirectory=None, lpStartupInfo=None):
3044 _CreateProcessW = windll.kernel32.CreateProcessW
3045 _CreateProcessW.argtypes = [LPWSTR, LPWSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, BOOL, DWORD, LPVOID, LPWSTR, LPVOID, LPPROCESS_INFORMATION]
3046 _CreateProcessW.restype = bool
3047 _CreateProcessW.errcheck = RaiseIfZero
3048
3049 if not lpApplicationName:
3050 lpApplicationName = None
3051 if not lpCommandLine:
3052 lpCommandLine = None
3053 else:
3054 lpCommandLine = ctypes.create_unicode_buffer(lpCommandLine)
3055 if not lpEnvironment:
3056 lpEnvironment = None
3057 else:
3058 lpEnvironment = ctypes.create_unicode_buffer(lpEnvironment)
3059 if not lpCurrentDirectory:
3060 lpCurrentDirectory = None
3061 if not lpProcessAttributes:
3062 lpProcessAttributes = None
3063 else:
3064 lpProcessAttributes = ctypes.byref(lpProcessAttributes)
3065 if not lpThreadAttributes:
3066 lpThreadAttributes = None
3067 else:
3068 lpThreadAttributes = ctypes.byref(lpThreadAttributes)
3069 if not lpStartupInfo:
3070 lpStartupInfo = STARTUPINFO()
3071 lpStartupInfo.cb = sizeof(STARTUPINFO)
3072 lpStartupInfo.lpReserved = 0
3073 lpStartupInfo.lpDesktop = 0
3074 lpStartupInfo.lpTitle = 0
3075 lpStartupInfo.dwFlags = 0
3076 lpStartupInfo.cbReserved2 = 0
3077 lpStartupInfo.lpReserved2 = 0
3078 lpProcessInformation = PROCESS_INFORMATION()
3079 lpProcessInformation.hProcess = INVALID_HANDLE_VALUE
3080 lpProcessInformation.hThread = INVALID_HANDLE_VALUE
3081 lpProcessInformation.dwProcessId = 0
3082 lpProcessInformation.dwThreadId = 0
3083 _CreateProcessW(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bool(bInheritHandles), dwCreationFlags, lpEnvironment, lpCurrentDirectory, ctypes.byref(lpStartupInfo), ctypes.byref(lpProcessInformation))
3084 return ProcessInformation(lpProcessInformation)
3085
3086 CreateProcess = GuessStringType(CreateProcessA, CreateProcessW)
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101 -def CreateProcessAsUserA(hToken, lpApplicationName, lpCommandLine=None, lpProcessAttributes=None, lpThreadAttributes=None, bInheritHandles=False, dwCreationFlags=0, lpEnvironment=None, lpCurrentDirectory=None, lpStartupInfo=None):
3102 _CreateProcessAsUserA = windll.kernel32.CreateProcessAsUserA
3103 _CreateProcessAsUserA.argtypes = [HANDLE, LPSTR, LPSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, BOOL, DWORD, LPVOID, LPSTR, LPVOID, LPPROCESS_INFORMATION]
3104 _CreateProcessAsUserA.restype = bool
3105 _CreateProcessAsUserA.errcheck = RaiseIfZero
3106
3107 if not lpApplicationName:
3108 lpApplicationName = None
3109 if not lpCommandLine:
3110 lpCommandLine = None
3111 else:
3112 lpCommandLine = ctypes.create_string_buffer(lpCommandLine)
3113 if not lpEnvironment:
3114 lpEnvironment = None
3115 else:
3116 lpEnvironment = ctypes.create_string_buffer(lpEnvironment)
3117 if not lpCurrentDirectory:
3118 lpCurrentDirectory = None
3119 if not lpProcessAttributes:
3120 lpProcessAttributes = None
3121 else:
3122 lpProcessAttributes = ctypes.byref(lpProcessAttributes)
3123 if not lpThreadAttributes:
3124 lpThreadAttributes = None
3125 else:
3126 lpThreadAttributes = ctypes.byref(lpThreadAttributes)
3127 if not lpStartupInfo:
3128 lpStartupInfo = STARTUPINFO()
3129 lpStartupInfo.cb = sizeof(STARTUPINFO)
3130 lpStartupInfo.lpReserved = 0
3131 lpStartupInfo.lpDesktop = 0
3132 lpStartupInfo.lpTitle = 0
3133 lpStartupInfo.dwFlags = 0
3134 lpStartupInfo.cbReserved2 = 0
3135 lpStartupInfo.lpReserved2 = 0
3136 lpProcessInformation = PROCESS_INFORMATION()
3137 lpProcessInformation.hProcess = INVALID_HANDLE_VALUE
3138 lpProcessInformation.hThread = INVALID_HANDLE_VALUE
3139 lpProcessInformation.dwProcessId = 0
3140 lpProcessInformation.dwThreadId = 0
3141 _CreateProcessAsUserA(hToken, lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bool(bInheritHandles), dwCreationFlags, lpEnvironment, lpCurrentDirectory, ctypes.byref(lpStartupInfo), ctypes.byref(lpProcessInformation))
3142 return ProcessInformation(lpProcessInformation)
3143
3144 -def CreateProcessAsUserW(hToken, lpApplicationName, lpCommandLine=None, lpProcessAttributes=None, lpThreadAttributes=None, bInheritHandles=False, dwCreationFlags=0, lpEnvironment=None, lpCurrentDirectory=None, lpStartupInfo=None):
3145 _CreateProcessAsUserW = windll.kernel32.CreateProcessAsUserW
3146 _CreateProcessAsUserW.argtypes = [HANDLE, LPWSTR, LPWSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, BOOL, DWORD, LPVOID, LPWSTR, LPVOID, LPPROCESS_INFORMATION]
3147 _CreateProcessAsUserW.restype = bool
3148 _CreateProcessAsUserW.errcheck = RaiseIfZero
3149
3150 if not lpApplicationName:
3151 lpApplicationName = None
3152 if not lpCommandLine:
3153 lpCommandLine = None
3154 else:
3155 lpCommandLine = ctypes.create_unicode_buffer(lpCommandLine)
3156 if not lpEnvironment:
3157 lpEnvironment = None
3158 else:
3159 lpEnvironment = ctypes.create_unicode_buffer(lpEnvironment)
3160 if not lpCurrentDirectory:
3161 lpCurrentDirectory = None
3162 if not lpProcessAttributes:
3163 lpProcessAttributes = None
3164 else:
3165 lpProcessAttributes = ctypes.byref(lpProcessAttributes)
3166 if not lpThreadAttributes:
3167 lpThreadAttributes = None
3168 else:
3169 lpThreadAttributes = ctypes.byref(lpThreadAttributes)
3170 if not lpStartupInfo:
3171 lpStartupInfo = STARTUPINFO()
3172 lpStartupInfo.cb = sizeof(STARTUPINFO)
3173 lpStartupInfo.lpReserved = 0
3174 lpStartupInfo.lpDesktop = 0
3175 lpStartupInfo.lpTitle = 0
3176 lpStartupInfo.dwFlags = 0
3177 lpStartupInfo.cbReserved2 = 0
3178 lpStartupInfo.lpReserved2 = 0
3179 lpProcessInformation = PROCESS_INFORMATION()
3180 lpProcessInformation.hProcess = INVALID_HANDLE_VALUE
3181 lpProcessInformation.hThread = INVALID_HANDLE_VALUE
3182 lpProcessInformation.dwProcessId = 0
3183 lpProcessInformation.dwThreadId = 0
3184 _CreateProcessAsUserW(hToken, lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bool(bInheritHandles), dwCreationFlags, lpEnvironment, lpCurrentDirectory, ctypes.byref(lpStartupInfo), ctypes.byref(lpProcessInformation))
3185 return ProcessInformation(lpProcessInformation)
3186
3187 CreateProcessAsUser = GuessStringType(CreateProcessAsUserA, CreateProcessAsUserW)
3196 _InitializeProcThreadAttributeList = windll.kernel32.InitializeProcThreadAttributeList
3197 _InitializeProcThreadAttributeList.argtypes = [LPPROC_THREAD_ATTRIBUTE_LIST, DWORD, DWORD, PSIZE_T]
3198 _InitializeProcThreadAttributeList.restype = bool
3199
3200 Size = SIZE_T(0)
3201 _InitializeProcThreadAttributeList(None, dwAttributeCount, 0, ctypes.byref(Size))
3202 RaiseIfZero(Size.value)
3203 AttributeList = (BYTE * Size.value)()
3204 success = _InitializeProcThreadAttributeList(ctypes.byref(AttributeList), dwAttributeCount, 0, ctypes.byref(Size))
3205 RaiseIfZero(success)
3206 return AttributeList
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217 -def UpdateProcThreadAttribute(lpAttributeList, Attribute, Value, cbSize = None):
3218 _UpdateProcThreadAttribute = windll.kernel32.UpdateProcThreadAttribute
3219 _UpdateProcThreadAttribute.argtypes = [LPPROC_THREAD_ATTRIBUTE_LIST, DWORD, DWORD_PTR, PVOID, SIZE_T, PVOID, PSIZE_T]
3220 _UpdateProcThreadAttribute.restype = bool
3221 _UpdateProcThreadAttribute.errcheck = RaiseIfZero
3222
3223 if cbSize is None:
3224 cbSize = ctypes.sizeof(Value)
3225 _UpdateProcThreadAttribute(ctypes.byref(lpAttributeList), 0, Attribute, ctypes.byref(Value), cbSize, None, None)
3226
3234
3235
3236
3237
3238
3239
3240 -def OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId):
3249
3250
3251
3252
3253
3254
3255 -def OpenThread(dwDesiredAccess, bInheritHandle, dwThreadId):
3264
3269 _SuspendThread = windll.kernel32.SuspendThread
3270 _SuspendThread.argtypes = [HANDLE]
3271 _SuspendThread.restype = DWORD
3272
3273 previousCount = _SuspendThread(hThread)
3274 if previousCount == DWORD(-1).value:
3275 raise ctypes.WinError()
3276 return previousCount
3277
3282 _ResumeThread = windll.kernel32.ResumeThread
3283 _ResumeThread.argtypes = [HANDLE]
3284 _ResumeThread.restype = DWORD
3285
3286 previousCount = _ResumeThread(hThread)
3287 if previousCount == DWORD(-1).value:
3288 raise ctypes.WinError()
3289 return previousCount
3290
3301
3312
3315 _GetCurrentProcess = windll.kernel32.GetCurrentProcess
3316 _GetCurrentProcess.argtypes = []
3317 _GetCurrentProcess.restype = HANDLE
3318 return _GetCurrentProcess()
3319
3322 _GetCurrentThread = windll.kernel32.GetCurrentThread
3323 _GetCurrentThread.argtypes = []
3324 _GetCurrentThread.restype = HANDLE
3325 return _GetCurrentThread()
3326
3329 _GetCurrentProcessId = windll.kernel32.GetCurrentProcessId
3330 _GetCurrentProcessId.argtypes = []
3331 _GetCurrentProcessId.restype = DWORD
3332 return _GetCurrentProcessId()
3333
3336 _GetCurrentThreadId = windll.kernel32.GetCurrentThreadId
3337 _GetCurrentThreadId.argtypes = []
3338 _GetCurrentThreadId.restype = DWORD
3339 return _GetCurrentThreadId()
3340
3350
3363
3376
3382 _GetExitCodeProcess = windll.kernel32.GetExitCodeProcess
3383 _GetExitCodeProcess.argtypes = [HANDLE]
3384 _GetExitCodeProcess.restype = bool
3385 _GetExitCodeProcess.errcheck = RaiseIfZero
3386
3387 lpExitCode = DWORD(0)
3388 _GetExitCodeProcess(hProcess, ctypes.byref(lpExitCode))
3389 return lpExitCode.value
3390
3396 _GetExitCodeThread = windll.kernel32.GetExitCodeThread
3397 _GetExitCodeThread.argtypes = [HANDLE]
3398 _GetExitCodeThread.restype = bool
3399 _GetExitCodeThread.errcheck = RaiseIfZero
3400
3401 lpExitCode = DWORD(0)
3402 _GetExitCodeThread(hThread, ctypes.byref(lpExitCode))
3403 return lpExitCode.value
3404
3409 _GetProcessVersion = windll.kernel32.GetProcessVersion
3410 _GetProcessVersion.argtypes = [DWORD]
3411 _GetProcessVersion.restype = DWORD
3412
3413 retval = _GetProcessVersion(ProcessId)
3414 if retval == 0:
3415 raise ctypes.WinError()
3416 return retval
3417
3422 _GetPriorityClass = windll.kernel32.GetPriorityClass
3423 _GetPriorityClass.argtypes = [HANDLE]
3424 _GetPriorityClass.restype = DWORD
3425
3426 retval = _GetPriorityClass(hProcess)
3427 if retval == 0:
3428 raise ctypes.WinError()
3429 return retval
3430
3441
3447 _GetProcessPriorityBoost = windll.kernel32.GetProcessPriorityBoost
3448 _GetProcessPriorityBoost.argtypes = [HANDLE, PBOOL]
3449 _GetProcessPriorityBoost.restype = bool
3450 _GetProcessPriorityBoost.errcheck = RaiseIfZero
3451
3452 pDisablePriorityBoost = BOOL(False)
3453 _GetProcessPriorityBoost(hProcess, ctypes.byref(pDisablePriorityBoost))
3454 return bool(pDisablePriorityBoost.value)
3455
3461 _SetProcessPriorityBoost = windll.kernel32.SetProcessPriorityBoost
3462 _SetProcessPriorityBoost.argtypes = [HANDLE, BOOL]
3463 _SetProcessPriorityBoost.restype = bool
3464 _SetProcessPriorityBoost.errcheck = RaiseIfZero
3465 _SetProcessPriorityBoost(hProcess, bool(DisablePriorityBoost))
3466
3473 _GetProcessAffinityMask = windll.kernel32.GetProcessAffinityMask
3474 _GetProcessAffinityMask.argtypes = [HANDLE, PDWORD_PTR, PDWORD_PTR]
3475 _GetProcessAffinityMask.restype = bool
3476 _GetProcessAffinityMask.errcheck = RaiseIfZero
3477
3478 lpProcessAffinityMask = DWORD_PTR(0)
3479 lpSystemAffinityMask = DWORD_PTR(0)
3480 _GetProcessAffinityMask(hProcess, ctypes.byref(lpProcessAffinityMask), ctypes.byref(lpSystemAffinityMask))
3481 return lpProcessAffinityMask.value, lpSystemAffinityMask.value
3482
3488 _SetProcessAffinityMask = windll.kernel32.SetProcessAffinityMask
3489 _SetProcessAffinityMask.argtypes = [HANDLE, DWORD_PTR]
3490 _SetProcessAffinityMask.restype = bool
3491 _SetProcessAffinityMask.errcheck = RaiseIfZero
3492 _SetProcessAffinityMask(hProcess, dwProcessAffinityMask)
3493
3510
3528
3547
3565
3566
3567
3568
3569
3570 -def Thread32Next(hSnapshot, te = None):
3584
3602
3603
3604
3605
3606
3607 -def Module32Next(hSnapshot, me = None):
3621
3622
3623
3624
3625
3626
3627 -def Heap32First(th32ProcessID, th32HeapID):
3640
3656
3674
3693
3712
3718 _GetCurrentProcessorNumber = windll.kernel32.GetCurrentProcessorNumber
3719 _GetCurrentProcessorNumber.argtypes = []
3720 _GetCurrentProcessorNumber.restype = DWORD
3721 _GetCurrentProcessorNumber.errcheck = RaiseIfZero
3722 return _GetCurrentProcessorNumber()
3723
3726 _FlushProcessWriteBuffers = windll.kernel32.FlushProcessWriteBuffers
3727 _FlushProcessWriteBuffers.argtypes = []
3728 _FlushProcessWriteBuffers.restype = None
3729 _FlushProcessWriteBuffers()
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749 -def GetGuiResources(hProcess, uiFlags = GR_GDIOBJECTS):
3750 _GetGuiResources = windll.kernel32.GetGuiResources
3751 _GetGuiResources.argtypes = [HANDLE, DWORD]
3752 _GetGuiResources.restype = DWORD
3753
3754 dwCount = _GetGuiResources(hProcess, uiFlags)
3755 if dwCount == 0:
3756 errcode = GetLastError()
3757 if errcode != ERROR_SUCCESS:
3758 raise ctypes.WinError(errcode)
3759 return dwCount
3760
3766 _GetProcessHandleCount = windll.kernel32.GetProcessHandleCount
3767 _GetProcessHandleCount.argtypes = [HANDLE, PDWORD]
3768 _GetProcessHandleCount.restype = DWORD
3769 _GetProcessHandleCount.errcheck = RaiseIfZero
3770
3771 pdwHandleCount = DWORD(0)
3772 _GetProcessHandleCount(hProcess, ctypes.byref(pdwHandleCount))
3773 return pdwHandleCount.value
3774
3783 _GetProcessTimes = windll.kernel32.GetProcessTimes
3784 _GetProcessTimes.argtypes = [HANDLE, LPFILETIME, LPFILETIME, LPFILETIME]
3785 _GetProcessTimes.restype = bool
3786 _GetProcessTimes.errcheck = RaiseIfZero
3787
3788 CreationTime = FILETIME()
3789 ExitTime = FILETIME()
3790 KernelTime = FILETIME()
3791 UserTime = FILETIME()
3792
3793 _GetProcessTimes(hProcess, ctypes.byref(CreationTime), ctypes.byref(ExitTime), ctypes.byref(KernelTime), ctypes.byref(UserTime))
3794
3795
3796
3797 KernelTime = KernelTime.dwLowDateTime + (KernelTime.dwHighDateTime << 32)
3798 UserTime = UserTime.dwLowDateTime + (UserTime.dwHighDateTime << 32)
3799
3800 CreationTime = FileTimeToSystemTime(CreationTime)
3801 ExitTime = FileTimeToSystemTime(ExitTime)
3802
3803 return (CreationTime, ExitTime, KernelTime, UserTime)
3804
3824
3829 _GetSystemTimeAsFileTime = windll.kernel32.GetSystemTimeAsFileTime
3830 _GetSystemTimeAsFileTime.argtypes = [LPFILETIME]
3831 _GetSystemTimeAsFileTime.restype = None
3832
3833 FileTime = FILETIME()
3834 _GetSystemTimeAsFileTime(ctypes.byref(FileTime))
3835 return FileTime
3836
3844 _GlobalAddAtomA = windll.kernel32.GlobalAddAtomA
3845 _GlobalAddAtomA.argtypes = [LPSTR]
3846 _GlobalAddAtomA.restype = ATOM
3847 _GlobalAddAtomA.errcheck = RaiseIfZero
3848 return _GlobalAddAtomA(lpString)
3849
3851 _GlobalAddAtomW = windll.kernel32.GlobalAddAtomW
3852 _GlobalAddAtomW.argtypes = [LPWSTR]
3853 _GlobalAddAtomW.restype = ATOM
3854 _GlobalAddAtomW.errcheck = RaiseIfZero
3855 return _GlobalAddAtomW(lpString)
3856
3857 GlobalAddAtom = GuessStringType(GlobalAddAtomA, GlobalAddAtomW)
3863 _GlobalFindAtomA = windll.kernel32.GlobalFindAtomA
3864 _GlobalFindAtomA.argtypes = [LPSTR]
3865 _GlobalFindAtomA.restype = ATOM
3866 _GlobalFindAtomA.errcheck = RaiseIfZero
3867 return _GlobalFindAtomA(lpString)
3868
3870 _GlobalFindAtomW = windll.kernel32.GlobalFindAtomW
3871 _GlobalFindAtomW.argtypes = [LPWSTR]
3872 _GlobalFindAtomW.restype = ATOM
3873 _GlobalFindAtomW.errcheck = RaiseIfZero
3874 return _GlobalFindAtomW(lpString)
3875
3876 GlobalFindAtom = GuessStringType(GlobalFindAtomA, GlobalFindAtomW)
3884 _GlobalGetAtomNameA = windll.kernel32.GlobalGetAtomNameA
3885 _GlobalGetAtomNameA.argtypes = [ATOM, LPSTR, ctypes.c_int]
3886 _GlobalGetAtomNameA.restype = UINT
3887 _GlobalGetAtomNameA.errcheck = RaiseIfZero
3888
3889 nSize = 64
3890 while 1:
3891 lpBuffer = ctypes.create_string_buffer("", nSize)
3892 nCopied = _GlobalGetAtomNameA(nAtom, lpBuffer, nSize)
3893 if nCopied < nSize - 1:
3894 break
3895 nSize = nSize + 64
3896 return lpBuffer.value
3897
3899 _GlobalGetAtomNameW = windll.kernel32.GlobalGetAtomNameW
3900 _GlobalGetAtomNameW.argtypes = [ATOM, LPWSTR, ctypes.c_int]
3901 _GlobalGetAtomNameW.restype = UINT
3902 _GlobalGetAtomNameW.errcheck = RaiseIfZero
3903
3904 nSize = 64
3905 while 1:
3906 lpBuffer = ctypes.create_unicode_buffer(u"", nSize)
3907 nCopied = _GlobalGetAtomNameW(nAtom, lpBuffer, nSize)
3908 if nCopied < nSize - 1:
3909 break
3910 nSize = nSize + 64
3911 return lpBuffer.value
3912
3913 GlobalGetAtomName = GuessStringType(GlobalGetAtomNameA, GlobalGetAtomNameW)
3927
3936 _IsWow64Process = windll.kernel32.IsWow64Process
3937 _IsWow64Process.argtypes = [HANDLE, PBOOL]
3938 _IsWow64Process.restype = bool
3939 _IsWow64Process.errcheck = RaiseIfZero
3940
3941 Wow64Process = BOOL(FALSE)
3942 _IsWow64Process(hProcess, ctypes.byref(Wow64Process))
3943 return bool(Wow64Process)
3944
3953
3958 _Wow64DisableWow64FsRedirection = windll.kernel32.Wow64DisableWow64FsRedirection
3959 _Wow64DisableWow64FsRedirection.argtypes = [PPVOID]
3960 _Wow64DisableWow64FsRedirection.restype = BOOL
3961 _Wow64DisableWow64FsRedirection.errcheck = RaiseIfZero
3962
3963 OldValue = PVOID(None)
3964 _Wow64DisableWow64FsRedirection(ctypes.byref(OldValue))
3965 return OldValue
3966
3971 _Wow64RevertWow64FsRedirection = windll.kernel32.Wow64RevertWow64FsRedirection
3972 _Wow64RevertWow64FsRedirection.argtypes = [PVOID]
3973 _Wow64RevertWow64FsRedirection.restype = BOOL
3974 _Wow64RevertWow64FsRedirection.errcheck = RaiseIfZero
3975 _Wow64RevertWow64FsRedirection(OldValue)
3976
3977
3978
3979
3980
3981
3982 try:
3983 import psyco
3984 psyco.cannotcompile(WaitForDebugEvent)
3985 psyco.cannotcompile(WaitForSingleObject)
3986 psyco.cannotcompile(WaitForSingleObjectEx)
3987 psyco.cannotcompile(WaitForMultipleObjects)
3988 psyco.cannotcompile(WaitForMultipleObjectsEx)
3989 except ImportError:
3990 pass
3991