| Home | Trees | Indices | Help |
|
|---|
|
|
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 # Copyright (c) 2009-2014, Mario Vilas
5 # All rights reserved.
6 #
7 # Redistribution and use in source and binary forms, with or without
8 # modification, are permitted provided that the following conditions are met:
9 #
10 # * Redistributions of source code must retain the above copyright notice,
11 # this list of conditions and the following disclaimer.
12 # * Redistributions in binary form must reproduce the above copyright
13 # notice,this list of conditions and the following disclaimer in the
14 # documentation and/or other materials provided with the distribution.
15 # * Neither the name of the copyright holder nor the names of its
16 # contributors may be used to endorse or promote products derived from
17 # this software without specific prior written permission.
18 #
19 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 # POSSIBILITY OF SUCH DAMAGE.
30
31 """
32 Wrapper for ntdll.dll in ctypes.
33 """
34
35 __revision__ = "$Id: ntdll.py 1299 2013-12-20 09:30:55Z qvasimodo $"
36
37 from defines import *
38
39 #==============================================================================
40 # This is used later on to calculate the list of exported symbols.
41 _all = None
42 _all = set(vars().keys())
43 _all.add('peb_teb')
44 #==============================================================================
45
46 from peb_teb import *
47
48 #--- Types --------------------------------------------------------------------
49
50 SYSDBG_COMMAND = DWORD
51 PROCESSINFOCLASS = DWORD
52 THREADINFOCLASS = DWORD
53 FILE_INFORMATION_CLASS = DWORD
54
55 #--- Constants ----------------------------------------------------------------
56
57 # DEP flags for ProcessExecuteFlags
58 MEM_EXECUTE_OPTION_ENABLE = 1
59 MEM_EXECUTE_OPTION_DISABLE = 2
60 MEM_EXECUTE_OPTION_ATL7_THUNK_EMULATION = 4
61 MEM_EXECUTE_OPTION_PERMANENT = 8
62
63 # SYSTEM_INFORMATION_CLASS
64 # http://www.informit.com/articles/article.aspx?p=22442&seqNum=4
65 SystemBasicInformation = 1 # 0x002C
66 SystemProcessorInformation = 2 # 0x000C
67 SystemPerformanceInformation = 3 # 0x0138
68 SystemTimeInformation = 4 # 0x0020
69 SystemPathInformation = 5 # not implemented
70 SystemProcessInformation = 6 # 0x00F8 + per process
71 SystemCallInformation = 7 # 0x0018 + (n * 0x0004)
72 SystemConfigurationInformation = 8 # 0x0018
73 SystemProcessorCounters = 9 # 0x0030 per cpu
74 SystemGlobalFlag = 10 # 0x0004
75 SystemInfo10 = 11 # not implemented
76 SystemModuleInformation = 12 # 0x0004 + (n * 0x011C)
77 SystemLockInformation = 13 # 0x0004 + (n * 0x0024)
78 SystemInfo13 = 14 # not implemented
79 SystemPagedPoolInformation = 15 # checked build only
80 SystemNonPagedPoolInformation = 16 # checked build only
81 SystemHandleInformation = 17 # 0x0004 + (n * 0x0010)
82 SystemObjectInformation = 18 # 0x0038+ + (n * 0x0030+)
83 SystemPagefileInformation = 19 # 0x0018+ per page file
84 SystemInstemulInformation = 20 # 0x0088
85 SystemInfo20 = 21 # invalid info class
86 SystemCacheInformation = 22 # 0x0024
87 SystemPoolTagInformation = 23 # 0x0004 + (n * 0x001C)
88 SystemProcessorStatistics = 24 # 0x0000, or 0x0018 per cpu
89 SystemDpcInformation = 25 # 0x0014
90 SystemMemoryUsageInformation1 = 26 # checked build only
91 SystemLoadImage = 27 # 0x0018, set mode only
92 SystemUnloadImage = 28 # 0x0004, set mode only
93 SystemTimeAdjustmentInformation = 29 # 0x000C, 0x0008 writeable
94 SystemMemoryUsageInformation2 = 30 # checked build only
95 SystemInfo30 = 31 # checked build only
96 SystemInfo31 = 32 # checked build only
97 SystemCrashDumpInformation = 33 # 0x0004
98 SystemExceptionInformation = 34 # 0x0010
99 SystemCrashDumpStateInformation = 35 # 0x0008
100 SystemDebuggerInformation = 36 # 0x0002
101 SystemThreadSwitchInformation = 37 # 0x0030
102 SystemRegistryQuotaInformation = 38 # 0x000C
103 SystemLoadDriver = 39 # 0x0008, set mode only
104 SystemPrioritySeparationInformation = 40 # 0x0004, set mode only
105 SystemInfo40 = 41 # not implemented
106 SystemInfo41 = 42 # not implemented
107 SystemInfo42 = 43 # invalid info class
108 SystemInfo43 = 44 # invalid info class
109 SystemTimeZoneInformation = 45 # 0x00AC
110 SystemLookasideInformation = 46 # n * 0x0020
111 # info classes specific to Windows 2000
112 # WTS = Windows Terminal Server
113 SystemSetTimeSlipEvent = 47 # set mode only
114 SystemCreateSession = 48 # WTS, set mode only
115 SystemDeleteSession = 49 # WTS, set mode only
116 SystemInfo49 = 50 # invalid info class
117 SystemRangeStartInformation = 51 # 0x0004
118 SystemVerifierInformation = 52 # 0x0068
119 SystemAddVerifier = 53 # set mode only
120 SystemSessionProcessesInformation = 54 # WTS
121
122 # NtQueryInformationProcess constants (from MSDN)
123 ##ProcessBasicInformation = 0
124 ##ProcessDebugPort = 7
125 ##ProcessWow64Information = 26
126 ##ProcessImageFileName = 27
127
128 # PROCESS_INFORMATION_CLASS
129 # http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Process/PROCESS_INFORMATION_CLASS.html
130 ProcessBasicInformation = 0
131 ProcessQuotaLimits = 1
132 ProcessIoCounters = 2
133 ProcessVmCounters = 3
134 ProcessTimes = 4
135 ProcessBasePriority = 5
136 ProcessRaisePriority = 6
137 ProcessDebugPort = 7
138 ProcessExceptionPort = 8
139 ProcessAccessToken = 9
140 ProcessLdtInformation = 10
141 ProcessLdtSize = 11
142 ProcessDefaultHardErrorMode = 12
143 ProcessIoPortHandlers = 13
144 ProcessPooledUsageAndLimits = 14
145 ProcessWorkingSetWatch = 15
146 ProcessUserModeIOPL = 16
147 ProcessEnableAlignmentFaultFixup = 17
148 ProcessPriorityClass = 18
149 ProcessWx86Information = 19
150 ProcessHandleCount = 20
151 ProcessAffinityMask = 21
152 ProcessPriorityBoost = 22
153
154 ProcessWow64Information = 26
155 ProcessImageFileName = 27
156
157 # http://www.codeproject.com/KB/security/AntiReverseEngineering.aspx
158 ProcessDebugObjectHandle = 30
159
160 ProcessExecuteFlags = 34
161
162 # THREAD_INFORMATION_CLASS
163 ThreadBasicInformation = 0
164 ThreadTimes = 1
165 ThreadPriority = 2
166 ThreadBasePriority = 3
167 ThreadAffinityMask = 4
168 ThreadImpersonationToken = 5
169 ThreadDescriptorTableEntry = 6
170 ThreadEnableAlignmentFaultFixup = 7
171 ThreadEventPair = 8
172 ThreadQuerySetWin32StartAddress = 9
173 ThreadZeroTlsCell = 10
174 ThreadPerformanceCount = 11
175 ThreadAmILastThread = 12
176 ThreadIdealProcessor = 13
177 ThreadPriorityBoost = 14
178 ThreadSetTlsArrayAddress = 15
179 ThreadIsIoPending = 16
180 ThreadHideFromDebugger = 17
181
182 # OBJECT_INFORMATION_CLASS
183 ObjectBasicInformation = 0
184 ObjectNameInformation = 1
185 ObjectTypeInformation = 2
186 ObjectAllTypesInformation = 3
187 ObjectHandleInformation = 4
188
189 # FILE_INFORMATION_CLASS
190 FileDirectoryInformation = 1
191 FileFullDirectoryInformation = 2
192 FileBothDirectoryInformation = 3
193 FileBasicInformation = 4
194 FileStandardInformation = 5
195 FileInternalInformation = 6
196 FileEaInformation = 7
197 FileAccessInformation = 8
198 FileNameInformation = 9
199 FileRenameInformation = 10
200 FileLinkInformation = 11
201 FileNamesInformation = 12
202 FileDispositionInformation = 13
203 FilePositionInformation = 14
204 FileFullEaInformation = 15
205 FileModeInformation = 16
206 FileAlignmentInformation = 17
207 FileAllInformation = 18
208 FileAllocationInformation = 19
209 FileEndOfFileInformation = 20
210 FileAlternateNameInformation = 21
211 FileStreamInformation = 22
212 FilePipeInformation = 23
213 FilePipeLocalInformation = 24
214 FilePipeRemoteInformation = 25
215 FileMailslotQueryInformation = 26
216 FileMailslotSetInformation = 27
217 FileCompressionInformation = 28
218 FileCopyOnWriteInformation = 29
219 FileCompletionInformation = 30
220 FileMoveClusterInformation = 31
221 FileQuotaInformation = 32
222 FileReparsePointInformation = 33
223 FileNetworkOpenInformation = 34
224 FileObjectIdInformation = 35
225 FileTrackingInformation = 36
226 FileOleDirectoryInformation = 37
227 FileContentIndexInformation = 38
228 FileInheritContentIndexInformation = 37
229 FileOleInformation = 39
230 FileMaximumInformation = 40
231
232 # From http://www.nirsoft.net/kernel_struct/vista/EXCEPTION_DISPOSITION.html
233 # typedef enum _EXCEPTION_DISPOSITION
234 # {
235 # ExceptionContinueExecution = 0,
236 # ExceptionContinueSearch = 1,
237 # ExceptionNestedException = 2,
238 # ExceptionCollidedUnwind = 3
239 # } EXCEPTION_DISPOSITION;
240 ExceptionContinueExecution = 0
241 ExceptionContinueSearch = 1
242 ExceptionNestedException = 2
243 ExceptionCollidedUnwind = 3
244
245 #--- PROCESS_BASIC_INFORMATION structure --------------------------------------
246
247 # From MSDN:
248 #
249 # typedef struct _PROCESS_BASIC_INFORMATION {
250 # PVOID Reserved1;
251 # PPEB PebBaseAddress;
252 # PVOID Reserved2[2];
253 # ULONG_PTR UniqueProcessId;
254 # PVOID Reserved3;
255 # } PROCESS_BASIC_INFORMATION;
256 ##class PROCESS_BASIC_INFORMATION(Structure):
257 ## _fields_ = [
258 ## ("Reserved1", PVOID),
259 ## ("PebBaseAddress", PPEB),
260 ## ("Reserved2", PVOID * 2),
261 ## ("UniqueProcessId", ULONG_PTR),
262 ## ("Reserved3", PVOID),
263 ##]
264
265 # From http://catch22.net/tuts/tips2
266 # (Only valid for 32 bits)
267 #
268 # typedef struct
269 # {
270 # ULONG ExitStatus;
271 # PVOID PebBaseAddress;
272 # ULONG AffinityMask;
273 # ULONG BasePriority;
274 # ULONG_PTR UniqueProcessId;
275 # ULONG_PTR InheritedFromUniqueProcessId;
276 # } PROCESS_BASIC_INFORMATION;
277
278 # My own definition follows:
280 _fields_ = [
281 ("ExitStatus", SIZE_T),
282 ("PebBaseAddress", PVOID), # PPEB
283 ("AffinityMask", KAFFINITY),
284 ("BasePriority", SDWORD),
285 ("UniqueProcessId", ULONG_PTR),
286 ("InheritedFromUniqueProcessId", ULONG_PTR),
287 ]
288
289 #--- THREAD_BASIC_INFORMATION structure ---------------------------------------
290
291 # From http://undocumented.ntinternals.net/UserMode/Structures/THREAD_BASIC_INFORMATION.html
292 #
293 # typedef struct _THREAD_BASIC_INFORMATION {
294 # NTSTATUS ExitStatus;
295 # PVOID TebBaseAddress;
296 # CLIENT_ID ClientId;
297 # KAFFINITY AffinityMask;
298 # KPRIORITY Priority;
299 # KPRIORITY BasePriority;
300 # } THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;
302 _fields_ = [
303 ("ExitStatus", NTSTATUS),
304 ("TebBaseAddress", PVOID), # PTEB
305 ("ClientId", CLIENT_ID),
306 ("AffinityMask", KAFFINITY),
307 ("Priority", SDWORD),
308 ("BasePriority", SDWORD),
309 ]
310
311 #--- FILE_NAME_INFORMATION structure ------------------------------------------
312
313 # typedef struct _FILE_NAME_INFORMATION {
314 # ULONG FileNameLength;
315 # WCHAR FileName[1];
316 # } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
322
323 #--- SYSDBG_MSR structure and constants ---------------------------------------
324
325 SysDbgReadMsr = 16
326 SysDbgWriteMsr = 17
327
333
334 #--- IO_STATUS_BLOCK structure ------------------------------------------------
335
336 # typedef struct _IO_STATUS_BLOCK {
337 # union {
338 # NTSTATUS Status;
339 # PVOID Pointer;
340 # };
341 # ULONG_PTR Information;
342 # } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
344 _fields_ = [
345 ("Status", NTSTATUS),
346 ("Information", ULONG_PTR),
347 ]
349 return PVOID(self.Status)
352 Pointer = property(__get_Pointer, __set_Pointer)
353
354 PIO_STATUS_BLOCK = POINTER(IO_STATUS_BLOCK)
355
356 #--- ntdll.dll ----------------------------------------------------------------
357
358 # ULONG WINAPI RtlNtStatusToDosError(
359 # __in NTSTATUS Status
360 # );
362 _RtlNtStatusToDosError = windll.ntdll.RtlNtStatusToDosError
363 _RtlNtStatusToDosError.argtypes = [NTSTATUS]
364 _RtlNtStatusToDosError.restype = ULONG
365 return _RtlNtStatusToDosError(Status)
366
367 # NTSYSAPI NTSTATUS NTAPI NtSystemDebugControl(
368 # IN SYSDBG_COMMAND Command,
369 # IN PVOID InputBuffer OPTIONAL,
370 # IN ULONG InputBufferLength,
371 # OUT PVOID OutputBuffer OPTIONAL,
372 # IN ULONG OutputBufferLength,
373 # OUT PULONG ReturnLength OPTIONAL
374 # );
375 -def NtSystemDebugControl(Command, InputBuffer = None, InputBufferLength = None, OutputBuffer = None, OutputBufferLength = None):
376 _NtSystemDebugControl = windll.ntdll.NtSystemDebugControl
377 _NtSystemDebugControl.argtypes = [SYSDBG_COMMAND, PVOID, ULONG, PVOID, ULONG, PULONG]
378 _NtSystemDebugControl.restype = NTSTATUS
379
380 # Validate the input buffer
381 if InputBuffer is None:
382 if InputBufferLength is None:
383 InputBufferLength = 0
384 else:
385 raise ValueError(
386 "Invalid call to NtSystemDebugControl: "
387 "input buffer length given but no input buffer!")
388 else:
389 if InputBufferLength is None:
390 InputBufferLength = sizeof(InputBuffer)
391 InputBuffer = byref(InputBuffer)
392
393 # Validate the output buffer
394 if OutputBuffer is None:
395 if OutputBufferLength is None:
396 OutputBufferLength = 0
397 else:
398 OutputBuffer = ctypes.create_string_buffer("", OutputBufferLength)
399 elif OutputBufferLength is None:
400 OutputBufferLength = sizeof(OutputBuffer)
401
402 # Make the call (with an output buffer)
403 if OutputBuffer is not None:
404 ReturnLength = ULONG(0)
405 ntstatus = _NtSystemDebugControl(Command, InputBuffer, InputBufferLength, byref(OutputBuffer), OutputBufferLength, byref(ReturnLength))
406 if ntstatus != 0:
407 raise ctypes.WinError( RtlNtStatusToDosError(ntstatus) )
408 ReturnLength = ReturnLength.value
409 if ReturnLength != OutputBufferLength:
410 raise ctypes.WinError(ERROR_BAD_LENGTH)
411 return OutputBuffer, ReturnLength
412
413 # Make the call (without an output buffer)
414 ntstatus = _NtSystemDebugControl(Command, InputBuffer, InputBufferLength, OutputBuffer, OutputBufferLength, None)
415 if ntstatus != 0:
416 raise ctypes.WinError( RtlNtStatusToDosError(ntstatus) )
417
418 ZwSystemDebugControl = NtSystemDebugControl
419
420 # NTSTATUS WINAPI NtQueryInformationProcess(
421 # __in HANDLE ProcessHandle,
422 # __in PROCESSINFOCLASS ProcessInformationClass,
423 # __out PVOID ProcessInformation,
424 # __in ULONG ProcessInformationLength,
425 # __out_opt PULONG ReturnLength
426 # );
427 -def NtQueryInformationProcess(ProcessHandle, ProcessInformationClass, ProcessInformationLength = None):
428 _NtQueryInformationProcess = windll.ntdll.NtQueryInformationProcess
429 _NtQueryInformationProcess.argtypes = [HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG]
430 _NtQueryInformationProcess.restype = NTSTATUS
431 if ProcessInformationLength is not None:
432 ProcessInformation = ctypes.create_string_buffer("", ProcessInformationLength)
433 else:
434 if ProcessInformationClass == ProcessBasicInformation:
435 ProcessInformation = PROCESS_BASIC_INFORMATION()
436 ProcessInformationLength = sizeof(PROCESS_BASIC_INFORMATION)
437 elif ProcessInformationClass == ProcessImageFileName:
438 unicode_buffer = ctypes.create_unicode_buffer(u"", 0x1000)
439 ProcessInformation = UNICODE_STRING(0, 0x1000, addressof(unicode_buffer))
440 ProcessInformationLength = sizeof(UNICODE_STRING)
441 elif ProcessInformationClass in (ProcessDebugPort, ProcessWow64Information, ProcessWx86Information, ProcessHandleCount, ProcessPriorityBoost):
442 ProcessInformation = DWORD()
443 ProcessInformationLength = sizeof(DWORD)
444 else:
445 raise Exception("Unknown ProcessInformationClass, use an explicit ProcessInformationLength value instead")
446 ReturnLength = ULONG(0)
447 ntstatus = _NtQueryInformationProcess(ProcessHandle, ProcessInformationClass, byref(ProcessInformation), ProcessInformationLength, byref(ReturnLength))
448 if ntstatus != 0:
449 raise ctypes.WinError( RtlNtStatusToDosError(ntstatus) )
450 if ProcessInformationClass == ProcessBasicInformation:
451 retval = ProcessInformation
452 elif ProcessInformationClass in (ProcessDebugPort, ProcessWow64Information, ProcessWx86Information, ProcessHandleCount, ProcessPriorityBoost):
453 retval = ProcessInformation.value
454 elif ProcessInformationClass == ProcessImageFileName:
455 vptr = ctypes.c_void_p(ProcessInformation.Buffer)
456 cptr = ctypes.cast( vptr, ctypes.c_wchar * ProcessInformation.Length )
457 retval = cptr.contents.raw
458 else:
459 retval = ProcessInformation.raw[:ReturnLength.value]
460 return retval
461
462 ZwQueryInformationProcess = NtQueryInformationProcess
463
464 # NTSTATUS WINAPI NtQueryInformationThread(
465 # __in HANDLE ThreadHandle,
466 # __in THREADINFOCLASS ThreadInformationClass,
467 # __out PVOID ThreadInformation,
468 # __in ULONG ThreadInformationLength,
469 # __out_opt PULONG ReturnLength
470 # );
471 -def NtQueryInformationThread(ThreadHandle, ThreadInformationClass, ThreadInformationLength = None):
472 _NtQueryInformationThread = windll.ntdll.NtQueryInformationThread
473 _NtQueryInformationThread.argtypes = [HANDLE, THREADINFOCLASS, PVOID, ULONG, PULONG]
474 _NtQueryInformationThread.restype = NTSTATUS
475 if ThreadInformationLength is not None:
476 ThreadInformation = ctypes.create_string_buffer("", ThreadInformationLength)
477 else:
478 if ThreadInformationClass == ThreadBasicInformation:
479 ThreadInformation = THREAD_BASIC_INFORMATION()
480 elif ThreadInformationClass == ThreadHideFromDebugger:
481 ThreadInformation = BOOLEAN()
482 elif ThreadInformationClass == ThreadQuerySetWin32StartAddress:
483 ThreadInformation = PVOID()
484 elif ThreadInformationClass in (ThreadAmILastThread, ThreadPriorityBoost):
485 ThreadInformation = DWORD()
486 elif ThreadInformationClass == ThreadPerformanceCount:
487 ThreadInformation = LONGLONG() # LARGE_INTEGER
488 else:
489 raise Exception("Unknown ThreadInformationClass, use an explicit ThreadInformationLength value instead")
490 ThreadInformationLength = sizeof(ThreadInformation)
491 ReturnLength = ULONG(0)
492 ntstatus = _NtQueryInformationThread(ThreadHandle, ThreadInformationClass, byref(ThreadInformation), ThreadInformationLength, byref(ReturnLength))
493 if ntstatus != 0:
494 raise ctypes.WinError( RtlNtStatusToDosError(ntstatus) )
495 if ThreadInformationClass == ThreadBasicInformation:
496 retval = ThreadInformation
497 elif ThreadInformationClass == ThreadHideFromDebugger:
498 retval = bool(ThreadInformation.value)
499 elif ThreadInformationClass in (ThreadQuerySetWin32StartAddress, ThreadAmILastThread, ThreadPriorityBoost, ThreadPerformanceCount):
500 retval = ThreadInformation.value
501 else:
502 retval = ThreadInformation.raw[:ReturnLength.value]
503 return retval
504
505 ZwQueryInformationThread = NtQueryInformationThread
506
507 # NTSTATUS
508 # NtQueryInformationFile(
509 # IN HANDLE FileHandle,
510 # OUT PIO_STATUS_BLOCK IoStatusBlock,
511 # OUT PVOID FileInformation,
512 # IN ULONG Length,
513 # IN FILE_INFORMATION_CLASS FileInformationClass
514 # );
516 _NtQueryInformationFile = windll.ntdll.NtQueryInformationFile
517 _NtQueryInformationFile.argtypes = [HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG, DWORD]
518 _NtQueryInformationFile.restype = NTSTATUS
519 IoStatusBlock = IO_STATUS_BLOCK()
520 ntstatus = _NtQueryInformationFile(FileHandle, byref(IoStatusBlock), byref(FileInformation), Length, FileInformationClass)
521 if ntstatus != 0:
522 raise ctypes.WinError( RtlNtStatusToDosError(ntstatus) )
523 return IoStatusBlock
524
525 ZwQueryInformationFile = NtQueryInformationFile
526
527 # DWORD STDCALL CsrGetProcessId (VOID);
529 _CsrGetProcessId = windll.ntdll.CsrGetProcessId
530 _CsrGetProcessId.argtypes = []
531 _CsrGetProcessId.restype = DWORD
532 return _CsrGetProcessId()
533
534 #==============================================================================
535 # This calculates the list of exported symbols.
536 _all = set(vars().keys()).difference(_all)
537 __all__ = [_x for _x in _all if not _x.startswith('_')]
538 __all__.sort()
539 #==============================================================================
540
| Home | Trees | Indices | Help |
|
|---|
| Generated by Epydoc 3.0.1 on Fri Dec 20 17:55:20 2013 | http://epydoc.sourceforge.net |