diff --git a/ctypes_generation/definitions/defines/gdt.txt b/ctypes_generation/definitions/defines/gdt.txt new file mode 100644 index 0000000..7770618 --- /dev/null +++ b/ctypes_generation/definitions/defines/gdt.txt @@ -0,0 +1,39 @@ +/* From ntdbg.h */ + +#define X86_KGDT_NULL 0 +#define X86_KGDT_R0_CODE 8 +#define X86_KGDT_R0_DATA 16 +#define X86_KGDT_R3_CODE 24 +#define X86_KGDT_R3_DATA 32 +#define X86_KGDT_TSS 40 +#define X86_KGDT_R0_PCR 48 +#define X86_KGDT_R3_TEB 56 +#define X86_KGDT_VDM_TILE 64 +#define X86_KGDT_LDT 72 +#define X86_KGDT_DF_TSS 80 +#define X86_KGDT_NMI_TSS 88 + +#define X86_FRAME_EDITED 0xfff8 +#define X86_MODE_MASK 1 +#define X86_EFLAGS_V86_MASK 0x00020000 + +#define AMD64_KGDT64_NULL (0 * 16) // NULL descriptor +#define AMD64_KGDT64_R0_CODE (1 * 16) // kernel mode 64-bit code +#define AMD64_KGDT64_R0_DATA (1 * 16) + 8 // kernel mode 64-bit data (stack) +#define AMD64_KGDT64_R3_CMCODE (2 * 16) // user mode 32-bit code +#define AMD64_KGDT64_R3_DATA (2 * 16) + 8 // user mode 32-bit data +#define AMD64_KGDT64_R3_CODE (3 * 16) // user mode 64-bit code +#define AMD64_KGDT64_SYS_TSS (4 * 16) // kernel mode system task state +#define AMD64_KGDT64_R3_CMTEB (5 * 16) // user mode 32-bit TEB +#define AMD64_KGDT64_LAST (6 * 16) + +/* From i386.h & amd64.h */ + +#define MODE_BIT 0 +#define MODE_MASK 1 // ntosp +#define RPL_MASK 3 + +/* Custom usefull define for CS userland values 0x23 * 0x33 */ + +#define CS_USER_32B (AMD64_KGDT64_R3_CMCODE | RPL_MASK) +#define CS_USER_64B (AMD64_KGDT64_R3_CODE | RPL_MASK) diff --git a/ctypes_generation/definitions/defines/specific_access_right.txt b/ctypes_generation/definitions/defines/specific_access_right.txt index 0f19755..7cf7c3f 100644 --- a/ctypes_generation/definitions/defines/specific_access_right.txt +++ b/ctypes_generation/definitions/defines/specific_access_right.txt @@ -334,4 +334,27 @@ SC_MANAGER_ENUMERATE_SERVICE | \ SC_MANAGER_LOCK | \ SC_MANAGER_QUERY_LOCK_STATUS | \ - SC_MANAGER_MODIFY_BOOT_CONFIG) \ No newline at end of file + SC_MANAGER_MODIFY_BOOT_CONFIG) + + +/// Active Directory + +#define ADS_RIGHT_DELETE 0x10000 +#define ADS_RIGHT_READ_CONTROL 0x20000 +#define ADS_RIGHT_WRITE_DAC 0x40000 +#define ADS_RIGHT_WRITE_OWNER 0x80000 +#define ADS_RIGHT_SYNCHRONIZE 0x100000 +#define ADS_RIGHT_ACCESS_SYSTEM_SECURITY 0x1000000 +#define ADS_RIGHT_GENERIC_READ 0x80000000 +#define ADS_RIGHT_GENERIC_WRITE 0x40000000 +#define ADS_RIGHT_GENERIC_EXECUTE 0x20000000 +#define ADS_RIGHT_GENERIC_ALL 0x10000000 +#define ADS_RIGHT_DS_CREATE_CHILD 0x1 +#define ADS_RIGHT_DS_DELETE_CHILD 0x2 +#define ADS_RIGHT_ACTRL_DS_LIST 0x4 +#define ADS_RIGHT_DS_SELF 0x8 +#define ADS_RIGHT_DS_READ_PROP 0x10 +#define ADS_RIGHT_DS_WRITE_PROP 0x20 +#define ADS_RIGHT_DS_DELETE_TREE 0x40 +#define ADS_RIGHT_DS_LIST_OBJECT 0x80 +#define ADS_RIGHT_DS_CONTROL_ACCESS 0x100 diff --git a/ctypes_generation/definitions/flag.py b/ctypes_generation/definitions/flag.py index 8982d11..18fb063 100644 --- a/ctypes_generation/definitions/flag.py +++ b/ctypes_generation/definitions/flag.py @@ -14,7 +14,12 @@ class Flag(long): def __repr__(self): return "{0}({1:#x})".format(self.name, self) - __str__ = __repr__ + # Custom __str__ removed for multiple reason + # Main one -> it breaks the json encoding of structure with flags :) + # Moving to a new politic -> if people want the name in a string use {x!r} + # The __str__ of security descriptor & guid will change soon as well :) + + # __str__ = __repr__ # Fix pickling with protocol 2 def __getnewargs__(self, *args): diff --git a/ctypes_generation/definitions/functions/crypto_wintrust.txt b/ctypes_generation/definitions/functions/crypto_wintrust.txt index 9e8a56b..f86cfe0 100644 --- a/ctypes_generation/definitions/functions/crypto_wintrust.txt +++ b/ctypes_generation/definitions/functions/crypto_wintrust.txt @@ -535,4 +535,13 @@ BOOL CryptGetOIDFunctionValue( DWORD *pdwValueType, BYTE *pbValueData, DWORD *pcbValueData +); + +BOOL CertCloseStore( + HCERTSTORE hCertStore, + DWORD dwFlags +); + +BOOL CryptMsgClose( + HCRYPTMSG hCryptMsg ); \ No newline at end of file diff --git a/ctypes_generation/definitions/functions/security.txt b/ctypes_generation/definitions/functions/security.txt index d690988..435bf3e 100644 --- a/ctypes_generation/definitions/functions/security.txt +++ b/ctypes_generation/definitions/functions/security.txt @@ -226,3 +226,12 @@ DWORD SetNamedSecurityInfoW( PACL pDacl, PACL pSacl ); + +/* Not documented but exported : guess from test*/ + +DWORD GetStringConditionFromBinary( + BYTE* BinaryAceCondition, + DWORD BinaryAceConditionSize, + DWORD Reserved1, + LPWSTR *StringAceCondition +); \ No newline at end of file diff --git a/ctypes_generation/definitions/functions/symbols.txt b/ctypes_generation/definitions/functions/symbols.txt index 6d6cf13..bf94cc1 100644 --- a/ctypes_generation/definitions/functions/symbols.txt +++ b/ctypes_generation/definitions/functions/symbols.txt @@ -36,6 +36,12 @@ BOOL WINAPI SymGetModuleInfo64( _Out_ PIMAGEHLP_MODULE64 ModuleInfo ); +BOOL WINAPI SymGetModuleInfoW64( + _In_ HANDLE hProcess, + _In_ DWORD64 qwAddr, + _Out_ PIMAGEHLP_MODULEW64 ModuleInfo +); + BOOL WINAPI SymInitialize( _In_ HANDLE hProcess, _In_opt_ LPCSTR UserSearchPath, @@ -48,7 +54,11 @@ BOOL WINAPI SymFromName( _Inout_ PSYMBOL_INFO Symbol ); - +BOOL WINAPI SymFromNameW( + _In_ HANDLE hProcess, + _In_ PCWSTR Name, + _Inout_ PSYMBOL_INFOW Symbol +); DWORD64 WINAPI SymLoadModuleEx( _In_ HANDLE hProcess, @@ -65,6 +75,8 @@ DWORD WINAPI SymSetOptions( _In_ DWORD SymOptions ); +DWORD SymGetOptions( +); BOOL WINAPI SymEnumSymbols( _In_ HANDLE hProcess, @@ -247,7 +259,6 @@ BOOL SymEnumSymbolsForAddrW( ); - BOOL WINAPI SymGetTypeFromName( _In_ HANDLE hProcess, _In_ ULONG64 BaseOfDll, @@ -295,11 +306,21 @@ PVOID SymFunctionTableAccess( DWORD AddrBase ); +PVOID SymFunctionTableAccess64( + HANDLE hProcess, + DWORD64 AddrBase +); + DWORD SymGetModuleBase( HANDLE hProcess, DWORD dwAddr ); +DWORD64 SymGetModuleBase64( + HANDLE hProcess, + DWORD64 qwAddr +); + BOOL SymRefreshModuleList( HANDLE hProcess ); @@ -361,4 +382,26 @@ BOOL StackWalk( PFUNCTION_TABLE_ACCESS_ROUTINE FunctionTableAccessRoutine, PGET_MODULE_BASE_ROUTINE GetModuleBaseRoutine, PTRANSLATE_ADDRESS_ROUTINE TranslateAddress +); + +BOOL SymGetSearchPath( + HANDLE hProcess, + PSTR SearchPath, + DWORD SearchPathLength +); + +BOOL SymGetSearchPathW( + HANDLE hProcess, + PWSTR SearchPath, + DWORD SearchPathLength +); + +BOOL SymSetSearchPath( + HANDLE hProcess, + PCSTR SearchPath +); + +BOOL SymSetSearchPathW( + HANDLE hProcess, + PCWSTR SearchPath ); \ No newline at end of file diff --git a/ctypes_generation/definitions/structures/debug.txt b/ctypes_generation/definitions/structures/debug.txt new file mode 100644 index 0000000..4dd95f7 --- /dev/null +++ b/ctypes_generation/definitions/structures/debug.txt @@ -0,0 +1,75 @@ +typedef struct _EXCEPTION_DEBUG_INFO { + EXCEPTION_RECORD ExceptionRecord; + DWORD dwFirstChance; +} EXCEPTION_DEBUG_INFO, *LPEXCEPTION_DEBUG_INFO; + +typedef struct _CREATE_THREAD_DEBUG_INFO { + HANDLE hThread; + LPVOID lpThreadLocalBase; + LPTHREAD_START_ROUTINE lpStartAddress; +} CREATE_THREAD_DEBUG_INFO, *LPCREATE_THREAD_DEBUG_INFO; + +typedef struct _CREATE_PROCESS_DEBUG_INFO { + HANDLE hFile; + HANDLE hProcess; + HANDLE hThread; + LPVOID lpBaseOfImage; + DWORD dwDebugInfoFileOffset; + DWORD nDebugInfoSize; + LPVOID lpThreadLocalBase; + LPTHREAD_START_ROUTINE lpStartAddress; + LPVOID lpImageName; + WORD fUnicode; +} CREATE_PROCESS_DEBUG_INFO, *LPCREATE_PROCESS_DEBUG_INFO; + + +typedef struct _EXIT_THREAD_DEBUG_INFO { + DWORD dwExitCode; +} EXIT_THREAD_DEBUG_INFO, *LPEXIT_THREAD_DEBUG_INFO; + +typedef struct _EXIT_PROCESS_DEBUG_INFO { + DWORD dwExitCode; +} EXIT_PROCESS_DEBUG_INFO, *LPEXIT_PROCESS_DEBUG_INFO; + +typedef struct _LOAD_DLL_DEBUG_INFO { + HANDLE hFile; + LPVOID lpBaseOfDll; + DWORD dwDebugInfoFileOffset; + DWORD nDebugInfoSize; + LPVOID lpImageName; + WORD fUnicode; +} LOAD_DLL_DEBUG_INFO, *LPLOAD_DLL_DEBUG_INFO; + +typedef struct _UNLOAD_DLL_DEBUG_INFO { + LPVOID lpBaseOfDll; +} UNLOAD_DLL_DEBUG_INFO, *LPUNLOAD_DLL_DEBUG_INFO; + +typedef struct _OUTPUT_DEBUG_STRING_INFO { + LPSTR lpDebugStringData; + WORD fUnicode; + WORD nDebugStringLength; +} OUTPUT_DEBUG_STRING_INFO, *LPOUTPUT_DEBUG_STRING_INFO; + +typedef struct _RIP_INFO { + DWORD dwError; + DWORD dwType; +} RIP_INFO, *LPRIP_INFO; + +typedef union _TMP_UNION_DEBUG_INFO { + EXCEPTION_DEBUG_INFO Exception; + CREATE_THREAD_DEBUG_INFO CreateThread; + CREATE_PROCESS_DEBUG_INFO CreateProcessInfo; + EXIT_THREAD_DEBUG_INFO ExitThread; + EXIT_PROCESS_DEBUG_INFO ExitProcess; + LOAD_DLL_DEBUG_INFO LoadDll; + UNLOAD_DLL_DEBUG_INFO UnloadDll; + OUTPUT_DEBUG_STRING_INFO DebugString; + RIP_INFO RipInfo; +} TMP_UNION_DEBUG_INFO; + +typedef struct _DEBUG_EVENT { + DWORD dwDebugEventCode; + DWORD dwProcessId; + DWORD dwThreadId; + _TMP_UNION_DEBUG_INFO u; +} DEBUG_EVENT, *LPDEBUG_EVENT; \ No newline at end of file diff --git a/ctypes_generation/definitions/structures/network.txt b/ctypes_generation/definitions/structures/network.txt index 4a6e41f..f746276 100644 --- a/ctypes_generation/definitions/structures/network.txt +++ b/ctypes_generation/definitions/structures/network.txt @@ -616,7 +616,6 @@ typedef struct _DnsRecordFlags DWORD Delete : 1; DWORD CharSet : 2; DWORD Unused : 3; - DWORD Reserved : 24; } DNS_RECORD_FLAGS; diff --git a/ctypes_generation/definitions/structures/security.txt b/ctypes_generation/definitions/structures/security.txt index 9118e95..e53acb8 100644 --- a/ctypes_generation/definitions/structures/security.txt +++ b/ctypes_generation/definitions/structures/security.txt @@ -5,6 +5,7 @@ typedef enum _ACL_INFORMATION_CLASS { AclSizeInformation = 2, } ACL_INFORMATION_CLASS; + /* ACL Stuff */ typedef struct _ACL { diff --git a/ctypes_generation/definitions/structures/symbols.txt b/ctypes_generation/definitions/structures/symbols.txt index 7c9cb81..9a21f97 100644 --- a/ctypes_generation/definitions/structures/symbols.txt +++ b/ctypes_generation/definitions/structures/symbols.txt @@ -104,7 +104,7 @@ typedef struct _IMAGEHLP_MODULE64 { CHAR LoadedImageName[256]; CHAR LoadedPdbName[256]; DWORD CVSig; - CHAR CVData[780]; // MAX_PATH * 3 + CHAR CVData[MAX_PATH * 3]; DWORD PdbSig; GUID PdbSig70; DWORD PdbAge; @@ -117,6 +117,34 @@ typedef struct _IMAGEHLP_MODULE64 { BOOL Publics; } IMAGEHLP_MODULE64, *PIMAGEHLP_MODULE64; +typedef struct _IMAGEHLP_MODULEW64 { + DWORD SizeOfStruct; + DWORD64 BaseOfImage; + DWORD ImageSize; + DWORD TimeDateStamp; + DWORD CheckSum; + DWORD NumSyms; + SYM_TYPE SymType; + WCHAR ModuleName[32]; + WCHAR ImageName[256]; + WCHAR LoadedImageName[256]; + WCHAR LoadedPdbName[256]; + DWORD CVSig; + WCHAR *CVData[MAX_PATH * 3]; + DWORD PdbSig; + GUID PdbSig70; + DWORD PdbAge; + BOOL PdbUnmatched; + BOOL DbgUnmatched; + BOOL LineNumbers; + BOOL GlobalSymbols; + BOOL TypeInfo; + BOOL SourceIndexed; + BOOL Publics; + DWORD MachineType; + DWORD Reserved; +} IMAGEHLP_MODULEW64, *PIMAGEHLP_MODULEW64; + typedef enum _IMAGEHLP_SYMBOL_TYPE_INFO { TI_GET_SYMTAG, diff --git a/ctypes_generation/definitions/structures/winstruct.txt b/ctypes_generation/definitions/structures/winstruct.txt index ad8dd6e..4f03676 100644 --- a/ctypes_generation/definitions/structures/winstruct.txt +++ b/ctypes_generation/definitions/structures/winstruct.txt @@ -1714,82 +1714,6 @@ typedef struct _SID_IDENTIFIER_AUTHORITY { BYTE Value[6]; } SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY; -typedef struct _EXCEPTION_DEBUG_INFO { - EXCEPTION_RECORD ExceptionRecord; - DWORD dwFirstChance; -} EXCEPTION_DEBUG_INFO, *LPEXCEPTION_DEBUG_INFO; - -typedef struct _CREATE_THREAD_DEBUG_INFO { - HANDLE hThread; - LPVOID lpThreadLocalBase; - LPTHREAD_START_ROUTINE lpStartAddress; -} CREATE_THREAD_DEBUG_INFO, *LPCREATE_THREAD_DEBUG_INFO; - -typedef struct _CREATE_PROCESS_DEBUG_INFO { - HANDLE hFile; - HANDLE hProcess; - HANDLE hThread; - LPVOID lpBaseOfImage; - DWORD dwDebugInfoFileOffset; - DWORD nDebugInfoSize; - LPVOID lpThreadLocalBase; - LPTHREAD_START_ROUTINE lpStartAddress; - LPVOID lpImageName; - WORD fUnicode; -} CREATE_PROCESS_DEBUG_INFO, *LPCREATE_PROCESS_DEBUG_INFO; - - -typedef struct _EXIT_THREAD_DEBUG_INFO { - DWORD dwExitCode; -} EXIT_THREAD_DEBUG_INFO, *LPEXIT_THREAD_DEBUG_INFO; - -typedef struct _EXIT_PROCESS_DEBUG_INFO { - DWORD dwExitCode; -} EXIT_PROCESS_DEBUG_INFO, *LPEXIT_PROCESS_DEBUG_INFO; - -typedef struct _LOAD_DLL_DEBUG_INFO { - HANDLE hFile; - LPVOID lpBaseOfDll; - DWORD dwDebugInfoFileOffset; - DWORD nDebugInfoSize; - LPVOID lpImageName; - WORD fUnicode; -} LOAD_DLL_DEBUG_INFO, *LPLOAD_DLL_DEBUG_INFO; - -typedef struct _UNLOAD_DLL_DEBUG_INFO { - LPVOID lpBaseOfDll; -} UNLOAD_DLL_DEBUG_INFO, *LPUNLOAD_DLL_DEBUG_INFO; - -typedef struct _OUTPUT_DEBUG_STRING_INFO { - LPSTR lpDebugStringData; - WORD fUnicode; - WORD nDebugStringLength; -} OUTPUT_DEBUG_STRING_INFO, *LPOUTPUT_DEBUG_STRING_INFO; - -typedef struct _RIP_INFO { - DWORD dwError; - DWORD dwType; -} RIP_INFO, *LPRIP_INFO; - -typedef union _TMP_UNION_DEBUG_INFO { - EXCEPTION_DEBUG_INFO Exception; - CREATE_THREAD_DEBUG_INFO CreateThread; - CREATE_PROCESS_DEBUG_INFO CreateProcessInfo; - EXIT_THREAD_DEBUG_INFO ExitThread; - EXIT_PROCESS_DEBUG_INFO ExitProcess; - LOAD_DLL_DEBUG_INFO LoadDll; - UNLOAD_DLL_DEBUG_INFO UnloadDll; - OUTPUT_DEBUG_STRING_INFO DebugString; - RIP_INFO RipInfo; -} TMP_UNION_DEBUG_INFO; - -typedef struct _DEBUG_EVENT { - DWORD dwDebugEventCode; - DWORD dwProcessId; - DWORD dwThreadId; - _TMP_UNION_DEBUG_INFO u; -} DEBUG_EVENT, *LPDEBUG_EVENT; - typedef struct _STRING { USHORT Length; diff --git a/ctypes_generation/extended_structs/PSID.py b/ctypes_generation/extended_structs/PSID.py index 7747e1d..8ac8f9a 100644 --- a/ctypes_generation/extended_structs/PSID.py +++ b/ctypes_generation/extended_structs/PSID.py @@ -1,18 +1,11 @@ _INITIAL_PSID = PSID class PSID(_INITIAL_PSID): # _INITIAL_PSID -> PVOID - # def __init__(self, strsid=None): - # if strsid is not None: - # windows.winproxy.ConvertStringSidToSidA(strsid, self) - - def __str__(self): - sid_str = LPCSTR() - windows.winproxy.ConvertSidToStringSidA(self, sid_str) - result = sid_str.value - windows.winproxy.LocalFree(sid_str) - return result def __eq__(self, other): - return windows.winproxy.EqualSid(self, other) + return bool(windows.winproxy.EqualSid(self, other)) + + def __ne__(self, other): + return not windows.winproxy.EqualSid(self, other) @property def size(self): @@ -37,6 +30,8 @@ class PSID(_INITIAL_PSID): # _INITIAL_PSID -> PVOID windows.winproxy.LocalFree(sid_str) return result + __str__ = to_string + def __repr__(self): try: return """<{0} "{1}">""".format(type(self).__name__, self.to_string()) diff --git a/ctypes_generation/extended_structs/_GUID.py b/ctypes_generation/extended_structs/_GUID.py index b6865ec..b299d58 100644 --- a/ctypes_generation/extended_structs/_GUID.py +++ b/ctypes_generation/extended_structs/_GUID.py @@ -26,11 +26,14 @@ class _GUID(INITIAL_GUID): __sprint__ = __repr__ + def to_string(self): data4_format = "{0:02X}{1:02X}-" + "".join("{{{i}:02X}}".format(i=i + 2) for i in range(6)) data4_str = data4_format.format(*self.Data4) return "{0:08X}-{1:04X}-{2:04X}-".format(self.Data1, self.Data2, self.Data3) + data4_str + __str__ = to_string + def update_strid(self): new_strid = self.to_string() self.strid = new_strid diff --git a/ctypes_generation/extended_structs/_LOAD_DLL_DEBUG_INFO.py b/ctypes_generation/extended_structs/_LOAD_DLL_DEBUG_INFO.py new file mode 100644 index 0000000..5a08dfd --- /dev/null +++ b/ctypes_generation/extended_structs/_LOAD_DLL_DEBUG_INFO.py @@ -0,0 +1,12 @@ +# typedef struct _LOAD_DLL_DEBUG_INFO { +# HANDLE hFile; +# LPVOID lpBaseOfDll; +# DWORD dwDebugInfoFileOffset; +# DWORD nDebugInfoSize; +# LPVOID lpImageName; +# WORD fUnicode; +# } LOAD_DLL_DEBUG_INFO, *LPLOAD_DLL_DEBUG_INFO; + +class _LOAD_DLL_DEBUG_INFO(_LOAD_DLL_DEBUG_INFO): + def hello(self): + return "hello" \ No newline at end of file diff --git a/ctypes_generation/extended_structs/_SERVICE_STATUS_PROCESS.py b/ctypes_generation/extended_structs/_SERVICE_STATUS_PROCESS.py new file mode 100644 index 0000000..9f92972 --- /dev/null +++ b/ctypes_generation/extended_structs/_SERVICE_STATUS_PROCESS.py @@ -0,0 +1,42 @@ +class _SERVICE_STATUS_PROCESS(_SERVICE_STATUS_PROCESS): + + SERVICE_STATE = FlagMapper(SERVICE_STOPPED, + SERVICE_START_PENDING, + SERVICE_STOP_PENDING, + SERVICE_RUNNING, + SERVICE_CONTINUE_PENDING, + SERVICE_PAUSE_PENDING, + SERVICE_PAUSED) + + SERVICE_TYPE = FlagMapper(SERVICE_KERNEL_DRIVER, + SERVICE_FILE_SYSTEM_DRIVER, + SERVICE_WIN32_OWN_PROCESS, + SERVICE_WIN32_SHARE_PROCESS, + SERVICE_INTERACTIVE_PROCESS) + + SERVICE_CONTROLE_ACCEPTED = FlagMapper() + + SERVICE_FLAGS = FlagMapper(SERVICE_RUNS_IN_SYSTEM_PROCESS) + + + @property + def dwCurrentState(self): + return self.SERVICE_STATE[super(_SERVICE_STATUS_PROCESS, self).dwCurrentState] + + @property + def dwServiceType(self): + return self.SERVICE_TYPE[super(_SERVICE_STATUS_PROCESS, self).dwServiceType] + + @property + def dwControlsAccepted(self): + return self.SERVICE_CONTROLE_ACCEPTED[super(_SERVICE_STATUS_PROCESS, self).dwControlsAccepted] + + @property + def dwServiceFlags(self): + return self.SERVICE_FLAGS[super(_SERVICE_STATUS_PROCESS, self).dwServiceFlags] + + # Python friendly names + state = dwCurrentState + type = dwServiceType + control_accepted = dwControlsAccepted + flags = dwServiceFlags \ No newline at end of file diff --git a/ctypes_generation/extended_structs/_SYMBOL_INFOW.py b/ctypes_generation/extended_structs/_SYMBOL_INFOW.py new file mode 100644 index 0000000..70a992a --- /dev/null +++ b/ctypes_generation/extended_structs/_SYMBOL_INFOW.py @@ -0,0 +1,5 @@ +old_SYMBOL_INFOW = _SYMBOL_INFOW +class _SYMBOL_INFOW(old_SYMBOL_INFOW): + @property + def tag(self): + return SymTagEnum.mapper[self.Tag] \ No newline at end of file diff --git a/ctypes_generation/extended_structs/_tagADDRESS64.py b/ctypes_generation/extended_structs/_tagADDRESS64.py new file mode 100644 index 0000000..07adadd --- /dev/null +++ b/ctypes_generation/extended_structs/_tagADDRESS64.py @@ -0,0 +1,5 @@ +class _tagADDRESS64(_tagADDRESS64): + def __repr__(self): + if not self.Segment: + return "<{0} {offset:#x}>".format(type(self).__name__, offset=self.Offset) + return "<{0} {seg:#x}:{offset:#x}>".format(type(self).__name__, seg=self.Segment, offset=self.Offset) \ No newline at end of file