mirror of
https://github.com/hakril/PythonForWindows
synced 2026-06-08 14:31:45 +00:00
Compare commits
76 Commits
teb_definition
...
arm64
| Author | SHA1 | Date | |
|---|---|---|---|
| 520fa864b8 | |||
| 6c588cf723 | |||
| 8eb3384fcf | |||
| b4c0223377 | |||
| 11665c4608 | |||
| 45b781b96c | |||
| 83af73a872 | |||
| be935b0f68 | |||
| 8a14cc5b3a | |||
| 1ad456049a | |||
| 16e10af8d8 | |||
| ebded59c43 | |||
| a418035e1e | |||
| e3c6deeee7 | |||
| d4952e21ba | |||
| fc0c81eb70 | |||
| bd52b1a5a3 | |||
| 064b22f99e | |||
| 909669321b | |||
| 405616290f | |||
| a93c9b7f11 | |||
| 06b96e65d0 | |||
| b51a6e1808 | |||
| 26b42a0587 | |||
| 13f2993cf1 | |||
| 4113d8ad3f | |||
| 75f1121182 | |||
| 5c25e333e6 | |||
| 54b518ca5f | |||
| d094fb8209 | |||
| 017867d79d | |||
| e58d80c3c5 | |||
| d7ff43a829 | |||
| 013c35bf40 | |||
| 6a54bca39a | |||
| 2a1217e7b8 | |||
| 6ade13d6bb | |||
| b1d2d5719b | |||
| 5352013a8f | |||
| bce15d0d3c | |||
| 1889899535 | |||
| 1bc7818552 | |||
| 7c96da8c75 | |||
| 458a0d0558 | |||
| 493fe75be8 | |||
| a7b6ddedd6 | |||
| e7679ecfcf | |||
| 4e5325c8ea | |||
| 9b5be5ffd5 | |||
| 720385d15a | |||
| 2cef60377f | |||
| ce13bf08e3 | |||
| 8151292042 | |||
| 646e55c740 | |||
| 00a2f1a7d6 | |||
| 2c9a159a81 | |||
| ea6b7b932d | |||
| 314cd2b862 | |||
| 3a3e6bc931 | |||
| 234844cf12 | |||
| 1297996725 | |||
| 1a9b680fba | |||
| e37f87c35c | |||
| 6eb31e9205 | |||
| b22c5d6055 | |||
| 458774f1ac | |||
| fd00e97d80 | |||
| 533cddae97 | |||
| 57076b84dd | |||
| 1c498aa0e9 | |||
| 7abda41a9d | |||
| 3489a560fb | |||
| 6fd32762da | |||
| aab4fdc02d | |||
| ff4161602c | |||
| 8932682ba2 |
@@ -94,3 +94,35 @@ jobs:
|
|||||||
secondary_rate_limit_wait_seconds: 90
|
secondary_rate_limit_wait_seconds: 90
|
||||||
seconds_between_github_writes: 10
|
seconds_between_github_writes: 10
|
||||||
seconds_between_github_reads: 1
|
seconds_between_github_reads: 1
|
||||||
|
|
||||||
|
# tests_arm64:
|
||||||
|
# needs: generate_ctypes
|
||||||
|
# timeout-minutes: 15
|
||||||
|
# runs-on: windows-ARM64
|
||||||
|
# continue-on-error: true
|
||||||
|
#
|
||||||
|
# strategy:
|
||||||
|
# fail-fast: false
|
||||||
|
# matrix:
|
||||||
|
# python-version: [3.11]
|
||||||
|
# python-architecture: [x86, x64, arm64]
|
||||||
|
# include:
|
||||||
|
# # Translate architecture to bitness for py.exe commandline
|
||||||
|
# - python-bitness-to-test: 32
|
||||||
|
# python-architecture: x86
|
||||||
|
# - python-bitness-to-test: 64
|
||||||
|
# python-architecture: x64
|
||||||
|
# - python-bitness-to-test: arm64
|
||||||
|
# python-architecture: arm64
|
||||||
|
#
|
||||||
|
# steps:
|
||||||
|
# - uses: actions/checkout@v4
|
||||||
|
#
|
||||||
|
# - name: Listing python versions availables
|
||||||
|
# run: py -0
|
||||||
|
#
|
||||||
|
# - name: Testing PFW execute
|
||||||
|
# run: py -${{ matrix.python-version}}-${{ matrix.python-bitness-to-test}} -c "import windows; print(windows)"
|
||||||
|
#
|
||||||
|
# - name: Arm64 pytests
|
||||||
|
# run: py -${{ matrix.python-version}}-${{ matrix.python-bitness-to-test}} -m pytest tests -k "not test_debugger" -v -s -r fEsx
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
// We have a rare case of defines that depends on an enum
|
||||||
|
// Which is PROC_THREAD_ATTRIBUTE_NUM
|
||||||
|
// So i Will just define a copy of those as define here
|
||||||
|
// Define version copied from: https://github.com/winsiderss/systeminformer/blob/master/phnt/include/ntpsapi.h#L2666
|
||||||
|
// Thx to them, as always :)
|
||||||
|
|
||||||
|
#define ProcThreadAttributeParentProcess 0 // in HANDLE
|
||||||
|
#define ProcThreadAttributeExtendedFlags 1 // in ULONG (EXTENDED_PROCESS_CREATION_FLAG_*)
|
||||||
|
#define ProcThreadAttributeHandleList 2 // in HANDLE[]
|
||||||
|
#define ProcThreadAttributeGroupAffinity 3 // in GROUP_AFFINITY // since WIN7
|
||||||
|
#define ProcThreadAttributePreferredNode 4 // in USHORT
|
||||||
|
#define ProcThreadAttributeIdealProcessor 5 // in PROCESSOR_NUMBER
|
||||||
|
#define ProcThreadAttributeUmsThread 6 // in UMS_CREATE_THREAD_ATTRIBUTES
|
||||||
|
#define ProcThreadAttributeMitigationPolicy 7 // in ULONG, ULONG64, or ULONG64[2]
|
||||||
|
#define ProcThreadAttributePackageFullName 8 // in WCHAR[] // since WIN8
|
||||||
|
#define ProcThreadAttributeSecurityCapabilities 9 // in SECURITY_CAPABILITIES
|
||||||
|
#define ProcThreadAttributeConsoleReference 10 // BaseGetConsoleReference (kernelbase.dll)
|
||||||
|
#define ProcThreadAttributeProtectionLevel 11 // in ULONG (PROTECTION_LEVEL_*) // since WINBLUE
|
||||||
|
#define ProcThreadAttributeOsMaxVersionTested 12 // in MAXVERSIONTESTED_INFO // since THRESHOLD // (from exe.manifest)
|
||||||
|
#define ProcThreadAttributeJobList 13 // in HANDLE[]
|
||||||
|
#define ProcThreadAttributeChildProcessPolicy 14 // in ULONG (PROCESS_CREATION_CHILD_PROCESS_*) // since THRESHOLD2
|
||||||
|
#define ProcThreadAttributeAllApplicationPackagesPolicy 15 // in ULONG (PROCESS_CREATION_ALL_APPLICATION_PACKAGES_*) // since REDSTONE
|
||||||
|
#define ProcThreadAttributeWin32kFilter 16 // in WIN32K_SYSCALL_FILTER
|
||||||
|
#define ProcThreadAttributeSafeOpenPromptOriginClaim 17 // in SE_SAFE_OPEN_PROMPT_RESULTS
|
||||||
|
#define ProcThreadAttributeDesktopAppPolicy 18 // in ULONG (PROCESS_CREATION_DESKTOP_APP_*) // since RS2
|
||||||
|
#define ProcThreadAttributeBnoIsolation 19 // in PROC_THREAD_BNOISOLATION_ATTRIBUTE
|
||||||
|
#define ProcThreadAttributePseudoConsole 22 // in HANDLE (HPCON) // since RS5
|
||||||
|
#define ProcThreadAttributeIsolationManifest 23 // in ISOLATION_MANIFEST_PROPERTIES // rev (diversenok) // since 19H2+
|
||||||
|
#define ProcThreadAttributeMitigationAuditPolicy 24 // in ULONG, ULONG64, or ULONG64[2] // since 21H1
|
||||||
|
#define ProcThreadAttributeMachineType 25 // in USHORT // since 21H2
|
||||||
|
#define ProcThreadAttributeComponentFilter 26 // in ULONG
|
||||||
|
#define ProcThreadAttributeEnableOptionalXStateFeatures 27 // in ULONG64 // since WIN11
|
||||||
|
#define ProcThreadAttributeCreateStore 28 // ULONG // rev (diversenok)
|
||||||
|
#define ProcThreadAttributeTrustedApp 29
|
||||||
|
#define ProcThreadAttributeSveVectorLength 30
|
||||||
|
|
||||||
|
// Real definition of value usef by API
|
||||||
|
// From: https://github.com/microsoft/win32metadata/blob/6af96d8470751e13a4e3f579f84b7b8b3ca398e1/generation/WinSDK/RecompiledIdlHeaders/um/WinBase.h#L3568
|
||||||
|
// macro ProcThreadAttributeValue is recoded in python in template.py
|
||||||
|
// I replace TRUE by True && FALSE by False for native python compat :)
|
||||||
|
|
||||||
|
#define PROC_THREAD_ATTRIBUTE_NUMBER 0x0000FFFF
|
||||||
|
#define PROC_THREAD_ATTRIBUTE_THREAD 0x00010000 // Attribute may be used with thread creation
|
||||||
|
#define PROC_THREAD_ATTRIBUTE_INPUT 0x00020000 // Attribute is input only
|
||||||
|
#define PROC_THREAD_ATTRIBUTE_ADDITIVE 0x00040000 // Attribute may be "accumulated," e.g. bitmasks,
|
||||||
|
|
||||||
|
#define PROC_THREAD_ATTRIBUTE_PARENT_PROCESS \
|
||||||
|
ProcThreadAttributeValue (ProcThreadAttributeParentProcess, False, True, False)
|
||||||
|
#define PROC_THREAD_ATTRIBUTE_HANDLE_LIST \
|
||||||
|
ProcThreadAttributeValue (ProcThreadAttributeHandleList, False, True, False)
|
||||||
|
|
||||||
|
#define PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY \
|
||||||
|
ProcThreadAttributeValue (ProcThreadAttributeGroupAffinity, True, True, False)
|
||||||
|
#define PROC_THREAD_ATTRIBUTE_PREFERRED_NODE \
|
||||||
|
ProcThreadAttributeValue (ProcThreadAttributePreferredNode, False, True, False)
|
||||||
|
#define PROC_THREAD_ATTRIBUTE_IDEAL_PROCESSOR \
|
||||||
|
ProcThreadAttributeValue (ProcThreadAttributeIdealProcessor, True, True, False)
|
||||||
|
#define PROC_THREAD_ATTRIBUTE_UMS_THREAD \
|
||||||
|
ProcThreadAttributeValue (ProcThreadAttributeUmsThread, True, True, False)
|
||||||
|
#define PROC_THREAD_ATTRIBUTE_MITIGATION_POLICY \
|
||||||
|
ProcThreadAttributeValue (ProcThreadAttributeMitigationPolicy, False, True, False)
|
||||||
|
|
||||||
|
#define PROC_THREAD_ATTRIBUTE_SECURITY_CAPABILITIES \
|
||||||
|
ProcThreadAttributeValue (ProcThreadAttributeSecurityCapabilities, False, True, False)
|
||||||
|
|
||||||
|
#define PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL \
|
||||||
|
ProcThreadAttributeValue (ProcThreadAttributeProtectionLevel, False, True, False)
|
||||||
|
|
||||||
|
#define PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE \
|
||||||
|
ProcThreadAttributeValue (ProcThreadAttributePseudoConsole, False, True, False)
|
||||||
|
|
||||||
|
#define PROC_THREAD_ATTRIBUTE_MACHINE_TYPE \
|
||||||
|
ProcThreadAttributeValue (ProcThreadAttributeMachineType, False, True, False)
|
||||||
|
|
||||||
|
#define PROC_THREAD_ATTRIBUTE_ENABLE_OPTIONAL_XSTATE_FEATURES \
|
||||||
|
ProcThreadAttributeValue (ProcThreadAttributeEnableOptionalXStateFeatures, True, True, False)
|
||||||
|
|
||||||
|
#define PROC_THREAD_ATTRIBUTE_SVE_VECTOR_LENGTH \
|
||||||
|
ProcThreadAttributeValue (ProcThreadAttributeSveVectorLength, False, True, False)
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
#define PROCESSOR_INTEL_386 386
|
||||||
|
#define PROCESSOR_INTEL_486 486
|
||||||
|
#define PROCESSOR_INTEL_PENTIUM 586
|
||||||
|
#define PROCESSOR_INTEL_IA64 2200
|
||||||
|
#define PROCESSOR_MIPS_R4000 4000 // incl R4101 & R3910 for Windows CE
|
||||||
|
#define PROCESSOR_ALPHA_21064 21064
|
||||||
|
#define PROCESSOR_PPC_601 601
|
||||||
|
#define PROCESSOR_PPC_603 603
|
||||||
|
#define PROCESSOR_PPC_604 604
|
||||||
|
#define PROCESSOR_PPC_620 620
|
||||||
|
#define PROCESSOR_HITACHI_SH3 10003 // Windows CE
|
||||||
|
#define PROCESSOR_HITACHI_SH3E 10004 // Windows CE
|
||||||
|
#define PROCESSOR_HITACHI_SH4 10005 // Windows CE
|
||||||
|
#define PROCESSOR_MOTOROLA_821 821 // Windows CE
|
||||||
|
#define PROCESSOR_SHx_SH3 103 // Windows CE
|
||||||
|
#define PROCESSOR_SHx_SH4 104 // Windows CE
|
||||||
|
#define PROCESSOR_STRONGARM 2577 // Windows CE - 0xA11
|
||||||
|
#define PROCESSOR_ARM720 1824 // Windows CE - 0x720
|
||||||
|
#define PROCESSOR_ARM820 2080 // Windows CE - 0x820
|
||||||
|
#define PROCESSOR_ARM920 2336 // Windows CE - 0x920
|
||||||
|
#define PROCESSOR_ARM_7TDMI 70001 // Windows CE
|
||||||
|
#define PROCESSOR_OPTIL 0x494f // MSIL
|
||||||
|
|
||||||
|
#define PROCESSOR_ARCHITECTURE_INTEL 0
|
||||||
|
#define PROCESSOR_ARCHITECTURE_MIPS 1
|
||||||
|
#define PROCESSOR_ARCHITECTURE_ALPHA 2
|
||||||
|
#define PROCESSOR_ARCHITECTURE_PPC 3
|
||||||
|
#define PROCESSOR_ARCHITECTURE_SHX 4
|
||||||
|
#define PROCESSOR_ARCHITECTURE_ARM 5
|
||||||
|
#define PROCESSOR_ARCHITECTURE_IA64 6
|
||||||
|
#define PROCESSOR_ARCHITECTURE_ALPHA64 7
|
||||||
|
#define PROCESSOR_ARCHITECTURE_MSIL 8
|
||||||
|
#define PROCESSOR_ARCHITECTURE_AMD64 9
|
||||||
|
#define PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 10
|
||||||
|
#define PROCESSOR_ARCHITECTURE_NEUTRAL 11
|
||||||
|
#define PROCESSOR_ARCHITECTURE_ARM64 12
|
||||||
|
#define PROCESSOR_ARCHITECTURE_ARM32_ON_WIN64 13
|
||||||
|
#define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF
|
||||||
@@ -24,3 +24,19 @@ def CTL_CODE(DeviceType, Function, Method, Access):
|
|||||||
|
|
||||||
def HRESULT_FACILITY(hr):
|
def HRESULT_FACILITY(hr):
|
||||||
return (((hr) >> 16) & 0x1fff)
|
return (((hr) >> 16) & 0x1fff)
|
||||||
|
|
||||||
|
# https://github.com/microsoft/win32metadata/blob/6af96d8470751e13a4e3f579f84b7b8b3ca398e1/generation/WinSDK/RecompiledIdlHeaders/um/WinBase.h#L3562
|
||||||
|
# Original MACRO:
|
||||||
|
|
||||||
|
#define ProcThreadAttributeValue(Number, Thread, Input, Additive) \
|
||||||
|
# (((Number) & PROC_THREAD_ATTRIBUTE_NUMBER) | \
|
||||||
|
# ((Thread != FALSE) ? PROC_THREAD_ATTRIBUTE_THREAD : 0) | \
|
||||||
|
# ((Input != FALSE) ? PROC_THREAD_ATTRIBUTE_INPUT : 0) | \
|
||||||
|
# ((Additive != FALSE) ? PROC_THREAD_ATTRIBUTE_ADDITIVE : 0))
|
||||||
|
|
||||||
|
def ProcThreadAttributeValue(Number, Thread, Input, Additive):
|
||||||
|
return ((Number & PROC_THREAD_ATTRIBUTE_NUMBER) |
|
||||||
|
(Thread and PROC_THREAD_ATTRIBUTE_THREAD) |
|
||||||
|
(Input and PROC_THREAD_ATTRIBUTE_INPUT) |
|
||||||
|
(Additive and PROC_THREAD_ATTRIBUTE_ADDITIVE))
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,61 @@
|
|||||||
|
// Atrget architecture description
|
||||||
|
|
||||||
|
#define CONTEXT_I386 0x00010000 // An old PFW error in case ?
|
||||||
|
#define CONTEXT_AMD64 0x00100000
|
||||||
|
#define CONTEXT_ARM 0x00200000
|
||||||
|
#define CONTEXT_ARM64 0x00400000
|
||||||
|
#define CONTEXT_i386 0x00010000L // this assumes that i386 and
|
||||||
|
#define CONTEXT_i486 0x00010000L // i486 have identical context records
|
||||||
|
#define WOW64_CONTEXT_i386 0x00010000 // this assumes that i386 and
|
||||||
|
#define WOW64_CONTEXT_i486 0x00010000 // i486 have identical context records
|
||||||
|
|
||||||
|
// Not perfect, should be explicitly for an architecture
|
||||||
|
|
||||||
|
#define CONTEXT_CONTROL 0x00000001L
|
||||||
|
#define CONTEXT_INTEGER 0x00000002L
|
||||||
|
#define CONTEXT_SEGMENTS 0x00000004L
|
||||||
|
#define CONTEXT_FLOATING_POINT 0x00000008L
|
||||||
|
#define CONTEXT_DEBUG_REGISTERS 0x00000010L
|
||||||
|
#define CONTEXT_EXTENDED_REGISTERS 0x00000020L
|
||||||
|
#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS)
|
||||||
|
#define CONTEXT_ALL (CONTEXT_FULL | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | CONTEXT_EXTENDED_REGISTERS)
|
||||||
|
|
||||||
|
#define CONTEXT_XSTATE (CONTEXT_I386 | 0x00000040L)
|
||||||
|
|
||||||
|
// WOW64
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define WOW64_CONTEXT_CONTROL (WOW64_CONTEXT_i386 | 0x00000001L) // SS:SP, CS:IP, FLAGS, BP
|
||||||
|
#define WOW64_CONTEXT_INTEGER (WOW64_CONTEXT_i386 | 0x00000002L) // AX, BX, CX, DX, SI, DI
|
||||||
|
#define WOW64_CONTEXT_SEGMENTS (WOW64_CONTEXT_i386 | 0x00000004L) // DS, ES, FS, GS
|
||||||
|
#define WOW64_CONTEXT_FLOATING_POINT (WOW64_CONTEXT_i386 | 0x00000008L) // 387 state
|
||||||
|
#define WOW64_CONTEXT_DEBUG_REGISTERS (WOW64_CONTEXT_i386 | 0x00000010L) // DB 0-3,6,7
|
||||||
|
#define WOW64_CONTEXT_EXTENDED_REGISTERS (WOW64_CONTEXT_i386 | 0x00000020L) // cpu specific extensions
|
||||||
|
|
||||||
|
#define WOW64_CONTEXT_FULL (WOW64_CONTEXT_CONTROL | WOW64_CONTEXT_INTEGER | WOW64_CONTEXT_SEGMENTS)
|
||||||
|
|
||||||
|
#define WOW64_CONTEXT_ALL (WOW64_CONTEXT_CONTROL | WOW64_CONTEXT_INTEGER | WOW64_CONTEXT_SEGMENTS | \
|
||||||
|
WOW64_CONTEXT_FLOATING_POINT | WOW64_CONTEXT_DEBUG_REGISTERS | \
|
||||||
|
WOW64_CONTEXT_EXTENDED_REGISTERS)
|
||||||
|
|
||||||
|
#define WOW64_CONTEXT_XSTATE (WOW64_CONTEXT_i386 | 0x00000040L)
|
||||||
|
|
||||||
|
#define WOW64_CONTEXT_EXCEPTION_ACTIVE 0x08000000
|
||||||
|
#define WOW64_CONTEXT_SERVICE_ACTIVE 0x10000000
|
||||||
|
#define WOW64_CONTEXT_EXCEPTION_REQUEST 0x40000000
|
||||||
|
#define WOW64_CONTEXT_EXCEPTION_REPORTING 0x80000000
|
||||||
|
|
||||||
|
// ARM64
|
||||||
|
|
||||||
|
#define CONTEXT_ARM64_CONTROL (CONTEXT_ARM64 | 0x1L)
|
||||||
|
#define CONTEXT_ARM64_INTEGER (CONTEXT_ARM64 | 0x2L)
|
||||||
|
#define CONTEXT_ARM64_FLOATING_POINT (CONTEXT_ARM64 | 0x4L)
|
||||||
|
#define CONTEXT_ARM64_DEBUG_REGISTERS (CONTEXT_ARM64 | 0x8L)
|
||||||
|
#define CONTEXT_ARM64_X18 (CONTEXT_ARM64 | 0x10L)
|
||||||
|
|
||||||
|
#define CONTEXT_UNWOUND_TO_CALL 0x20000000
|
||||||
|
#define CONTEXT_RET_TO_GUEST 0x04000000
|
||||||
|
|
||||||
|
#define ARM64_MAX_BREAKPOINTS 8
|
||||||
|
#define ARM64_MAX_WATCHPOINTS 2
|
||||||
@@ -130,22 +130,6 @@
|
|||||||
#define TH32CS_SNAPALL (TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE)
|
#define TH32CS_SNAPALL (TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE)
|
||||||
#define TH32CS_INHERIT 0x80000000
|
#define TH32CS_INHERIT 0x80000000
|
||||||
|
|
||||||
#define CONTEXT_I386 0x00010000
|
|
||||||
#define CONTEXT_AMD64 0x00100000
|
|
||||||
#define CONTEXT_ARM 0x00200000
|
|
||||||
#define CONTEXT_ARM64 0x00400000
|
|
||||||
|
|
||||||
#define CONTEXT_CONTROL 0x00000001L
|
|
||||||
#define CONTEXT_INTEGER 0x00000002L
|
|
||||||
#define CONTEXT_SEGMENTS 0x00000004L
|
|
||||||
#define CONTEXT_FLOATING_POINT 0x00000008L
|
|
||||||
#define CONTEXT_DEBUG_REGISTERS 0x00000010L
|
|
||||||
#define CONTEXT_EXTENDED_REGISTERS 0x00000020L
|
|
||||||
#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS)
|
|
||||||
#define CONTEXT_ALL (CONTEXT_FULL | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | CONTEXT_EXTENDED_REGISTERS)
|
|
||||||
|
|
||||||
#define CONTEXT_XSTATE (CONTEXT_I386 | 0x00000040L)
|
|
||||||
|
|
||||||
|
|
||||||
#define PAGE_NOACCESS 0x01
|
#define PAGE_NOACCESS 0x01
|
||||||
#define PAGE_READONLY 0x02
|
#define PAGE_READONLY 0x02
|
||||||
|
|||||||
@@ -100,4 +100,6 @@
|
|||||||
#define IMAGE_FILE_MACHINE_AMD64 0x8664
|
#define IMAGE_FILE_MACHINE_AMD64 0x8664
|
||||||
#define IMAGE_FILE_MACHINE_M32R 0x9041
|
#define IMAGE_FILE_MACHINE_M32R 0x9041
|
||||||
#define IMAGE_FILE_MACHINE_CEE 0xC0EE
|
#define IMAGE_FILE_MACHINE_CEE 0xC0EE
|
||||||
#define IMAGE_FILE_MACHINE_ARM64 0xAA64
|
#define IMAGE_FILE_MACHINE_ARM64 0xAA64
|
||||||
|
|
||||||
|
#define IMAGE_FILE_MACHINE_TARGET_HOST 0x0001 // Useful for indicating we want to interact with the host and not a WoW guest.
|
||||||
@@ -65,6 +65,19 @@ BOOL FreeLibrary(
|
|||||||
HMODULE hLibModule
|
HMODULE hLibModule
|
||||||
);
|
);
|
||||||
|
|
||||||
|
BOOL GetProcessInformation(
|
||||||
|
[in] HANDLE hProcess,
|
||||||
|
[in] PROCESS_INFORMATION_CLASS ProcessInformationClass,
|
||||||
|
LPVOID ProcessInformation,
|
||||||
|
[in] DWORD ProcessInformationSize
|
||||||
|
);
|
||||||
|
|
||||||
|
BOOL SetProcessInformation(
|
||||||
|
[in] HANDLE hProcess,
|
||||||
|
[in] PROCESS_INFORMATION_CLASS ProcessInformationClass,
|
||||||
|
LPVOID ProcessInformation,
|
||||||
|
[in] DWORD ProcessInformationSize
|
||||||
|
);
|
||||||
|
|
||||||
/* Not documented by seems present since dawn of time (WRK)
|
/* Not documented by seems present since dawn of time (WRK)
|
||||||
I Prefere PVOID as a return value to allow simple cast to PEB subclass in process.py*/
|
I Prefere PVOID as a return value to allow simple cast to PEB subclass in process.py*/
|
||||||
|
|||||||
@@ -59,4 +59,12 @@ BOOL LookupAccountNameW(
|
|||||||
LPWSTR ReferencedDomainName,
|
LPWSTR ReferencedDomainName,
|
||||||
LPDWORD cchReferencedDomainName,
|
LPDWORD cchReferencedDomainName,
|
||||||
PSID_NAME_USE peUse
|
PSID_NAME_USE peUse
|
||||||
|
);
|
||||||
|
|
||||||
|
PVOID GetNativeSystemInfo(
|
||||||
|
[out] LPSYSTEM_INFO lpSystemInfo
|
||||||
|
);
|
||||||
|
|
||||||
|
PVOID GetSystemInfo(
|
||||||
|
[out] LPSYSTEM_INFO lpSystemInfo
|
||||||
);
|
);
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
BOOL IsWow64Process(
|
||||||
|
[in] HANDLE hProcess,
|
||||||
|
[out] PBOOL Wow64Process
|
||||||
|
);
|
||||||
|
|
||||||
|
BOOL IsWow64Process2(
|
||||||
|
[in] HANDLE hProcess,
|
||||||
|
[out] USHORT *pProcessMachine,
|
||||||
|
[out, optional] USHORT *pNativeMachine
|
||||||
|
);
|
||||||
|
|
||||||
|
HRESULT IsWow64GuestMachineSupported(
|
||||||
|
[in] USHORT WowGuestMachine,
|
||||||
|
[out] BOOL *MachineIsSupported
|
||||||
|
);
|
||||||
|
|
||||||
|
UINT GetSystemWow64DirectoryA(
|
||||||
|
[out] LPSTR lpBuffer,
|
||||||
|
[in] UINT uSize
|
||||||
|
);
|
||||||
|
|
||||||
|
UINT GetSystemWow64DirectoryW(
|
||||||
|
[out] LPWSTR lpBuffer,
|
||||||
|
[in] UINT uSize
|
||||||
|
);
|
||||||
|
|
||||||
|
UINT GetSystemWow64Directory2A(
|
||||||
|
[out] LPSTR lpBuffer,
|
||||||
|
[in] UINT uSize,
|
||||||
|
[in] WORD ImageFileMachineType
|
||||||
|
);
|
||||||
|
|
||||||
|
UINT GetSystemWow64Directory2W(
|
||||||
|
[out] LPWSTR lpBuffer,
|
||||||
|
[in] UINT uSize,
|
||||||
|
[in] WORD ImageFileMachineType
|
||||||
|
);
|
||||||
|
|
||||||
|
BOOL Wow64DisableWow64FsRedirection(
|
||||||
|
[out] PVOID *OldValue
|
||||||
|
);
|
||||||
|
|
||||||
|
BOOLEAN Wow64EnableWow64FsRedirection(
|
||||||
|
BOOLEAN Wow64FsEnableRedirection
|
||||||
|
);
|
||||||
|
|
||||||
|
BOOL Wow64RevertWow64FsRedirection(
|
||||||
|
[in] PVOID OlValue
|
||||||
|
);
|
||||||
|
|
||||||
|
BOOL Wow64GetThreadContext(
|
||||||
|
HANDLE hThread,
|
||||||
|
PWOW64_CONTEXT lpContext
|
||||||
|
);
|
||||||
|
|
||||||
|
BOOL Wow64SetThreadContext(
|
||||||
|
HANDLE hThread,
|
||||||
|
WOW64_CONTEXT *lpContext
|
||||||
|
);
|
||||||
|
|
||||||
|
USHORT Wow64SetThreadDefaultGuestMachine(
|
||||||
|
USHORT Machine
|
||||||
|
);
|
||||||
|
|
||||||
|
DWORD Wow64SuspendThread(
|
||||||
|
HANDLE hThread
|
||||||
|
);
|
||||||
|
|
||||||
|
NTSTATUS WINAPI NtWow64ReadVirtualMemory64(
|
||||||
|
_In_ HANDLE hProcess,
|
||||||
|
_In_ ULONG64 lpBaseAddress,
|
||||||
|
_Out_ LPVOID lpBuffer,
|
||||||
|
_In_ ULONG64 nSize,
|
||||||
|
_Out_ PULONG64 lpNumberOfBytesRead
|
||||||
|
);
|
||||||
|
|
||||||
|
NTSTATUS WINAPI NtWow64WriteVirtualMemory64(
|
||||||
|
_In_ HANDLE hProcess,
|
||||||
|
_In_ ULONG64 lpBaseAddress,
|
||||||
|
_Out_ LPVOID lpBuffer,
|
||||||
|
_In_ ULONG64 nSize,
|
||||||
|
_Out_ PULONG64 lpNumberOfBytesWritten
|
||||||
|
);
|
||||||
@@ -150,6 +150,17 @@ HANDLE WINAPI CreateRemoteThread(
|
|||||||
_Out_ LPDWORD lpThreadId
|
_Out_ LPDWORD lpThreadId
|
||||||
);
|
);
|
||||||
|
|
||||||
|
HANDLE CreateRemoteThreadEx(
|
||||||
|
[in] HANDLE hProcess,
|
||||||
|
[in, optional] LPSECURITY_ATTRIBUTES lpThreadAttributes,
|
||||||
|
[in] SIZE_T dwStackSize,
|
||||||
|
[in] LPTHREAD_START_ROUTINE lpStartAddress,
|
||||||
|
[in, optional] LPVOID lpParameter,
|
||||||
|
[in] DWORD dwCreationFlags,
|
||||||
|
[in, optional] LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList,
|
||||||
|
[out, optional] LPDWORD lpThreadId
|
||||||
|
);
|
||||||
|
|
||||||
BOOL WINAPI CreateProcessA(
|
BOOL WINAPI CreateProcessA(
|
||||||
__in_opt LPCSTR lpApplicationName,
|
__in_opt LPCSTR lpApplicationName,
|
||||||
__inout_opt LPSTR lpCommandLine,
|
__inout_opt LPSTR lpCommandLine,
|
||||||
@@ -242,13 +253,6 @@ BOOL WINAPI ReadProcessMemory(
|
|||||||
_Out_ SIZE_T *lpNumberOfBytesRead
|
_Out_ SIZE_T *lpNumberOfBytesRead
|
||||||
);
|
);
|
||||||
|
|
||||||
NTSTATUS WINAPI NtWow64ReadVirtualMemory64(
|
|
||||||
_In_ HANDLE hProcess,
|
|
||||||
_In_ ULONG64 lpBaseAddress,
|
|
||||||
_Out_ LPVOID lpBuffer,
|
|
||||||
_In_ ULONG64 nSize,
|
|
||||||
_Out_ PULONG64 lpNumberOfBytesRead
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
BOOL WINAPI WriteProcessMemory(
|
BOOL WINAPI WriteProcessMemory(
|
||||||
@@ -260,13 +264,7 @@ BOOL WINAPI WriteProcessMemory(
|
|||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS WINAPI NtWow64WriteVirtualMemory64(
|
|
||||||
_In_ HANDLE hProcess,
|
|
||||||
_In_ ULONG64 lpBaseAddress,
|
|
||||||
_Out_ LPVOID lpBuffer,
|
|
||||||
_In_ ULONG64 nSize,
|
|
||||||
_Out_ PULONG64 lpNumberOfBytesWritten
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -518,23 +516,6 @@ BOOL WINAPI DeviceIoControl(
|
|||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
BOOL WINAPI Wow64DisableWow64FsRedirection(
|
|
||||||
_Out_ PVOID *OldValue
|
|
||||||
);
|
|
||||||
|
|
||||||
BOOL WINAPI Wow64RevertWow64FsRedirection(
|
|
||||||
_In_ PVOID OldValue
|
|
||||||
);
|
|
||||||
|
|
||||||
BOOLEAN WINAPI Wow64EnableWow64FsRedirection(
|
|
||||||
_In_ BOOLEAN Wow64FsEnableRedirection
|
|
||||||
);
|
|
||||||
|
|
||||||
BOOL WINAPI Wow64GetThreadContext(
|
|
||||||
_In_ HANDLE hThread,
|
|
||||||
_Inout_ PWOW64_CONTEXT lpContext
|
|
||||||
);
|
|
||||||
|
|
||||||
BOOL WINAPI SetConsoleCtrlHandler(
|
BOOL WINAPI SetConsoleCtrlHandler(
|
||||||
_In_opt_ PHANDLER_ROUTINE HandlerRoutine,
|
_In_opt_ PHANDLER_ROUTINE HandlerRoutine,
|
||||||
_In_ BOOL Add
|
_In_ BOOL Add
|
||||||
@@ -669,10 +650,6 @@ DWORD WINAPI GetProcessId(
|
|||||||
_In_ HANDLE Process
|
_In_ HANDLE Process
|
||||||
);
|
);
|
||||||
|
|
||||||
BOOL WINAPI Wow64SetThreadContext(
|
|
||||||
__in HANDLE hThread,
|
|
||||||
__in CONST WOW64_CONTEXT *lpContext
|
|
||||||
);
|
|
||||||
|
|
||||||
DWORD WINAPI GetMappedFileNameW (
|
DWORD WINAPI GetMappedFileNameW (
|
||||||
__in HANDLE hProcess,
|
__in HANDLE hProcess,
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
typedef enum _PROC_THREAD_ATTRIBUTE_NUM {
|
||||||
|
ProcThreadAttributeParentProcess = 0,
|
||||||
|
ProcThreadAttributeHandleList = 2,
|
||||||
|
ProcThreadAttributeGroupAffinity = 3,
|
||||||
|
ProcThreadAttributePreferredNode = 4,
|
||||||
|
ProcThreadAttributeIdealProcessor = 5,
|
||||||
|
ProcThreadAttributeUmsThread = 6,
|
||||||
|
ProcThreadAttributeMitigationPolicy = 7,
|
||||||
|
ProcThreadAttributeSecurityCapabilities = 9,
|
||||||
|
ProcThreadAttributeProtectionLevel = 11,
|
||||||
|
ProcThreadAttributeJobList = 13,
|
||||||
|
ProcThreadAttributeChildProcessPolicy = 14,
|
||||||
|
ProcThreadAttributeAllApplicationPackagesPolicy = 15,
|
||||||
|
ProcThreadAttributeWin32kFilter = 16,
|
||||||
|
ProcThreadAttributeSafeOpenPromptOriginClaim = 17,
|
||||||
|
ProcThreadAttributeDesktopAppPolicy = 18,
|
||||||
|
ProcThreadAttributePseudoConsole = 22,
|
||||||
|
ProcThreadAttributeMitigationAuditPolicy = 24,
|
||||||
|
ProcThreadAttributeMachineType = 25,
|
||||||
|
ProcThreadAttributeComponentFilter = 26,
|
||||||
|
ProcThreadAttributeEnableOptionalXStateFeatures = 27,
|
||||||
|
ProcThreadAttributeTrustedApp = 29,
|
||||||
|
ProcThreadAttributeSveVectorLength = 30,
|
||||||
|
} PROC_THREAD_ATTRIBUTE_NUM;
|
||||||
@@ -0,0 +1,124 @@
|
|||||||
|
typedef enum _MEMORY_INFORMATION_CLASS {
|
||||||
|
MemoryBasicInformation,
|
||||||
|
MemoryWorkingSetList,
|
||||||
|
MemorySectionName,
|
||||||
|
MemoryBasicVlmInformation,
|
||||||
|
MemoryWorkingSetListEx
|
||||||
|
} MEMORY_INFORMATION_CLASS;
|
||||||
|
|
||||||
|
typedef enum _THREAD_INFORMATION_CLASS {
|
||||||
|
ThreadBasicInformation,
|
||||||
|
ThreadTimes,
|
||||||
|
ThreadPriority,
|
||||||
|
ThreadBasePriority,
|
||||||
|
ThreadAffinityMask,
|
||||||
|
ThreadImpersonationToken,
|
||||||
|
ThreadDescriptorTableEntry,
|
||||||
|
ThreadEnableAlignmentFaultFixup,
|
||||||
|
ThreadEventPair,
|
||||||
|
ThreadQuerySetWin32StartAddress,
|
||||||
|
ThreadZeroTlsCell,
|
||||||
|
ThreadPerformanceCount,
|
||||||
|
ThreadAmILastThread,
|
||||||
|
ThreadIdealProcessor,
|
||||||
|
ThreadPriorityBoost,
|
||||||
|
ThreadSetTlsArrayAddress,
|
||||||
|
ThreadIsIoPending,
|
||||||
|
ThreadHideFromDebugger
|
||||||
|
} THREAD_INFORMATION_CLASS, *PTHREAD_INFORMATION_CLASS;
|
||||||
|
|
||||||
|
// For NtQueryInformationProcess
|
||||||
|
typedef enum _PROCESSINFOCLASS {
|
||||||
|
ProcessBasicInformation = 0,
|
||||||
|
ProcessQuotaLimits = 1,
|
||||||
|
ProcessIoCounters = 2,
|
||||||
|
ProcessVmCounters = 3,
|
||||||
|
ProcessTimes = 4,
|
||||||
|
ProcessBasePriority = 5,
|
||||||
|
ProcessRaisePriority = 6,
|
||||||
|
ProcessDebugPort = 7,
|
||||||
|
ProcessExceptionPort = 8,
|
||||||
|
ProcessAccessToken = 9,
|
||||||
|
ProcessLdtInformation = 10,
|
||||||
|
ProcessLdtSize = 11,
|
||||||
|
ProcessDefaultHardErrorMode = 12,
|
||||||
|
ProcessIoPortHandlers = 13, // Note: this is kernel mode only
|
||||||
|
ProcessPooledUsageAndLimits = 14,
|
||||||
|
ProcessWorkingSetWatch = 15,
|
||||||
|
ProcessUserModeIOPL = 16,
|
||||||
|
ProcessEnableAlignmentFaultFixup = 17,
|
||||||
|
ProcessPriorityClass = 18,
|
||||||
|
ProcessWx86Information = 19,
|
||||||
|
ProcessHandleCount = 20,
|
||||||
|
ProcessAffinityMask = 21,
|
||||||
|
ProcessPriorityBoost = 22,
|
||||||
|
ProcessDeviceMap = 23,
|
||||||
|
ProcessSessionInformation = 24,
|
||||||
|
ProcessForegroundInformation = 25,
|
||||||
|
ProcessWow64Information = 26,
|
||||||
|
ProcessImageFileName = 27,
|
||||||
|
ProcessLUIDDeviceMapsEnabled = 28,
|
||||||
|
ProcessBreakOnTermination = 29,
|
||||||
|
ProcessDebugObjectHandle = 30,
|
||||||
|
ProcessDebugFlags = 31,
|
||||||
|
ProcessHandleTracing = 32,
|
||||||
|
ProcessIoPriority = 33,
|
||||||
|
ProcessExecuteFlags = 34,
|
||||||
|
ProcessTlsInformation = 35,
|
||||||
|
ProcessCookie = 36,
|
||||||
|
ProcessImageInformation = 37,
|
||||||
|
ProcessCycleTime = 38,
|
||||||
|
ProcessPagePriority = 39,
|
||||||
|
ProcessInstrumentationCallback = 40,
|
||||||
|
ProcessThreadStackAllocation = 41,
|
||||||
|
ProcessWorkingSetWatchEx = 42,
|
||||||
|
ProcessImageFileNameWin32 = 43,
|
||||||
|
ProcessImageFileMapping = 44,
|
||||||
|
ProcessAffinityUpdateMode = 45,
|
||||||
|
ProcessMemoryAllocationMode = 46,
|
||||||
|
ProcessGroupInformation = 47,
|
||||||
|
ProcessTokenVirtualizationEnabled = 48,
|
||||||
|
ProcessOwnerInformation = 49,
|
||||||
|
ProcessWindowInformation = 50,
|
||||||
|
ProcessHandleInformation = 51,
|
||||||
|
ProcessMitigationPolicy = 52,
|
||||||
|
ProcessDynamicFunctionTableInformation = 53,
|
||||||
|
ProcessHandleCheckingMode = 54,
|
||||||
|
ProcessKeepAliveCount = 55,
|
||||||
|
ProcessRevokeFileHandles = 56,
|
||||||
|
ProcessWorkingSetControl = 57,
|
||||||
|
ProcessHandleTable = 58,
|
||||||
|
ProcessCheckStackExtentsMode = 59,
|
||||||
|
ProcessCommandLineInformation = 60,
|
||||||
|
ProcessProtectionInformation = 61,
|
||||||
|
ProcessMemoryExhaustion = 62,
|
||||||
|
ProcessFaultInformation = 63,
|
||||||
|
ProcessTelemetryIdInformation = 64,
|
||||||
|
ProcessCommitReleaseInformation = 65,
|
||||||
|
ProcessReserved1Information = 66,
|
||||||
|
ProcessReserved2Information = 67,
|
||||||
|
ProcessSubsystemProcess = 68,
|
||||||
|
ProcessInPrivate = 70,
|
||||||
|
ProcessRaiseUMExceptionOnInvalidHandleClose = 71,
|
||||||
|
ProcessSubsystemInformation = 75,
|
||||||
|
ProcessWin32kSyscallFilterInformation = 79,
|
||||||
|
ProcessEnergyTrackingState = 82,
|
||||||
|
MaxProcessInfoClass // MaxProcessInfoClass should always be the last enum
|
||||||
|
} PROCESSINFOCLASS;
|
||||||
|
|
||||||
|
// GetProcessInfo
|
||||||
|
typedef enum _PROCESS_INFORMATION_CLASS {
|
||||||
|
ProcessMemoryPriority,
|
||||||
|
ProcessMemoryExhaustionInfo,
|
||||||
|
ProcessAppMemoryInfo,
|
||||||
|
ProcessInPrivateInfo,
|
||||||
|
ProcessPowerThrottling,
|
||||||
|
ProcessReservedValue1,
|
||||||
|
ProcessTelemetryCoverageInfo,
|
||||||
|
ProcessProtectionLevelInfo,
|
||||||
|
ProcessLeapSecondInfo,
|
||||||
|
ProcessMachineTypeInfo, // Map to 0xe6(230) for the syscall NtQueryInformationProcess
|
||||||
|
ProcessOverrideSubsequentPrefetchParameter,
|
||||||
|
ProcessMaxOverridePrefetchParameter,
|
||||||
|
ProcessInformationClassMax
|
||||||
|
} PROCESS_INFORMATION_CLASS;
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
typedef enum _MACHINE_ATTRIBUTES {
|
||||||
|
UserEnabled = 0x00000001,
|
||||||
|
KernelEnabled = 0x00000002,
|
||||||
|
Wow64Container = 0x00000004
|
||||||
|
} MACHINE_ATTRIBUTES;
|
||||||
|
|
||||||
|
typedef struct _PROCESS_MACHINE_INFORMATION {
|
||||||
|
USHORT ProcessMachine;
|
||||||
|
USHORT Res0;
|
||||||
|
MACHINE_ATTRIBUTES MachineAttributes;
|
||||||
|
} PROCESS_MACHINE_INFORMATION;
|
||||||
@@ -67,3 +67,22 @@ typedef enum _COMPUTER_NAME_FORMAT {
|
|||||||
ComputerNamePhysicalDnsFullyQualified,
|
ComputerNamePhysicalDnsFullyQualified,
|
||||||
ComputerNameMax
|
ComputerNameMax
|
||||||
} COMPUTER_NAME_FORMAT;
|
} COMPUTER_NAME_FORMAT;
|
||||||
|
|
||||||
|
typedef struct _SYSTEM_INFO {
|
||||||
|
union {
|
||||||
|
DWORD dwOemId;
|
||||||
|
struct {
|
||||||
|
WORD wProcessorArchitecture;
|
||||||
|
WORD wReserved;
|
||||||
|
} DUMMYSTRUCTNAME;
|
||||||
|
} DUMMYUNIONNAME;
|
||||||
|
DWORD dwPageSize;
|
||||||
|
LPVOID lpMinimumApplicationAddress;
|
||||||
|
LPVOID lpMaximumApplicationAddress;
|
||||||
|
DWORD_PTR dwActiveProcessorMask;
|
||||||
|
DWORD dwNumberOfProcessors;
|
||||||
|
DWORD dwProcessorType;
|
||||||
|
DWORD dwAllocationGranularity;
|
||||||
|
WORD wProcessorLevel;
|
||||||
|
WORD wProcessorRevision;
|
||||||
|
} SYSTEM_INFO, *LPSYSTEM_INFO;
|
||||||
@@ -0,0 +1,347 @@
|
|||||||
|
typedef union _ARM64_NT_NEON128 {
|
||||||
|
struct {
|
||||||
|
ULONGLONG Low;
|
||||||
|
LONGLONG High;
|
||||||
|
} DUMMYSTRUCTNAME;
|
||||||
|
DOUBLE D[2];
|
||||||
|
FLOAT S[4];
|
||||||
|
WORD H[8];
|
||||||
|
BYTE B[16];
|
||||||
|
} ARM64_NT_NEON128, *PARM64_NT_NEON128;
|
||||||
|
|
||||||
|
typedef struct _ARM64_NT_CONTEXT {
|
||||||
|
|
||||||
|
//
|
||||||
|
// Control flags.
|
||||||
|
//
|
||||||
|
|
||||||
|
/* +0x000 */ DWORD ContextFlags;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Integer registers
|
||||||
|
//
|
||||||
|
|
||||||
|
/* +0x004 */ DWORD Cpsr; // NZVF + DAIF + CurrentEL + SPSel
|
||||||
|
/* +0x008 */ union {
|
||||||
|
struct {
|
||||||
|
DWORD64 X0;
|
||||||
|
DWORD64 X1;
|
||||||
|
DWORD64 X2;
|
||||||
|
DWORD64 X3;
|
||||||
|
DWORD64 X4;
|
||||||
|
DWORD64 X5;
|
||||||
|
DWORD64 X6;
|
||||||
|
DWORD64 X7;
|
||||||
|
DWORD64 X8;
|
||||||
|
DWORD64 X9;
|
||||||
|
DWORD64 X10;
|
||||||
|
DWORD64 X11;
|
||||||
|
DWORD64 X12;
|
||||||
|
DWORD64 X13;
|
||||||
|
DWORD64 X14;
|
||||||
|
DWORD64 X15;
|
||||||
|
DWORD64 X16;
|
||||||
|
DWORD64 X17;
|
||||||
|
DWORD64 X18;
|
||||||
|
DWORD64 X19;
|
||||||
|
DWORD64 X20;
|
||||||
|
DWORD64 X21;
|
||||||
|
DWORD64 X22;
|
||||||
|
DWORD64 X23;
|
||||||
|
DWORD64 X24;
|
||||||
|
DWORD64 X25;
|
||||||
|
DWORD64 X26;
|
||||||
|
DWORD64 X27;
|
||||||
|
DWORD64 X28;
|
||||||
|
/* +0x0f0 */ DWORD64 Fp;
|
||||||
|
/* +0x0f8 */ DWORD64 Lr;
|
||||||
|
} DUMMYSTRUCTNAME;
|
||||||
|
DWORD64 X[31];
|
||||||
|
} DUMMYUNIONNAME;
|
||||||
|
/* +0x100 */ DWORD64 Sp;
|
||||||
|
/* +0x108 */ DWORD64 Pc;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Floating Point/NEON Registers
|
||||||
|
//
|
||||||
|
|
||||||
|
/* +0x110 */ ARM64_NT_NEON128 V[32];
|
||||||
|
/* +0x310 */ DWORD Fpcr;
|
||||||
|
/* +0x314 */ DWORD Fpsr;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Debug registers
|
||||||
|
//
|
||||||
|
|
||||||
|
/* +0x318 */ DWORD Bcr[ARM64_MAX_BREAKPOINTS];
|
||||||
|
/* +0x338 */ DWORD64 Bvr[ARM64_MAX_BREAKPOINTS];
|
||||||
|
/* +0x378 */ DWORD Wcr[ARM64_MAX_WATCHPOINTS];
|
||||||
|
/* +0x380 */ DWORD64 Wvr[ARM64_MAX_WATCHPOINTS];
|
||||||
|
/* +0x390 */
|
||||||
|
|
||||||
|
} ARM64_NT_CONTEXT, *PARM64_NT_CONTEXT;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _FLOATING_SAVE_AREA {
|
||||||
|
DWORD ControlWord;
|
||||||
|
DWORD StatusWord;
|
||||||
|
DWORD TagWord;
|
||||||
|
DWORD ErrorOffset;
|
||||||
|
DWORD ErrorSelector;
|
||||||
|
DWORD DataOffset;
|
||||||
|
DWORD DataSelector;
|
||||||
|
BYTE RegisterArea[80];
|
||||||
|
DWORD Cr0NpxState;
|
||||||
|
} FLOATING_SAVE_AREA;
|
||||||
|
|
||||||
|
typedef struct _CONTEXT32 {
|
||||||
|
|
||||||
|
DWORD ContextFlags;
|
||||||
|
|
||||||
|
DWORD Dr0;
|
||||||
|
DWORD Dr1;
|
||||||
|
DWORD Dr2;
|
||||||
|
DWORD Dr3;
|
||||||
|
DWORD Dr6;
|
||||||
|
DWORD Dr7;
|
||||||
|
|
||||||
|
FLOATING_SAVE_AREA FloatSave;
|
||||||
|
|
||||||
|
DWORD SegGs;
|
||||||
|
DWORD SegFs;
|
||||||
|
DWORD SegEs;
|
||||||
|
DWORD SegDs;
|
||||||
|
|
||||||
|
DWORD Edi;
|
||||||
|
DWORD Esi;
|
||||||
|
DWORD Ebx;
|
||||||
|
DWORD Edx;
|
||||||
|
DWORD Ecx;
|
||||||
|
DWORD Eax;
|
||||||
|
|
||||||
|
DWORD Ebp;
|
||||||
|
DWORD Eip;
|
||||||
|
DWORD SegCs;
|
||||||
|
DWORD EFlags;
|
||||||
|
DWORD Esp;
|
||||||
|
DWORD SegSs;
|
||||||
|
|
||||||
|
BYTE ExtendedRegisters[512];
|
||||||
|
|
||||||
|
} CONTEXT32, *PCONTEXT32, *LPCONTEXT32;
|
||||||
|
|
||||||
|
typedef struct _WOW64_FLOATING_SAVE_AREA {
|
||||||
|
DWORD ControlWord;
|
||||||
|
DWORD StatusWord;
|
||||||
|
DWORD TagWord;
|
||||||
|
DWORD ErrorOffset;
|
||||||
|
DWORD ErrorSelector;
|
||||||
|
DWORD DataOffset;
|
||||||
|
DWORD DataSelector;
|
||||||
|
BYTE RegisterArea[WOW64_SIZE_OF_80387_REGISTERS];
|
||||||
|
DWORD Cr0NpxState;
|
||||||
|
} WOW64_FLOATING_SAVE_AREA;
|
||||||
|
|
||||||
|
typedef struct _WOW64_CONTEXT {
|
||||||
|
|
||||||
|
DWORD ContextFlags;
|
||||||
|
|
||||||
|
DWORD Dr0;
|
||||||
|
DWORD Dr1;
|
||||||
|
DWORD Dr2;
|
||||||
|
DWORD Dr3;
|
||||||
|
DWORD Dr6;
|
||||||
|
DWORD Dr7;
|
||||||
|
|
||||||
|
WOW64_FLOATING_SAVE_AREA FloatSave;
|
||||||
|
|
||||||
|
DWORD SegGs;
|
||||||
|
DWORD SegFs;
|
||||||
|
DWORD SegEs;
|
||||||
|
DWORD SegDs;
|
||||||
|
|
||||||
|
DWORD Edi;
|
||||||
|
DWORD Esi;
|
||||||
|
DWORD Ebx;
|
||||||
|
DWORD Edx;
|
||||||
|
DWORD Ecx;
|
||||||
|
DWORD Eax;
|
||||||
|
DWORD Ebp;
|
||||||
|
DWORD Eip;
|
||||||
|
DWORD SegCs;
|
||||||
|
DWORD EFlags;
|
||||||
|
DWORD Esp;
|
||||||
|
DWORD SegSs;
|
||||||
|
|
||||||
|
BYTE ExtendedRegisters[WOW64_MAXIMUM_SUPPORTED_EXTENSION];
|
||||||
|
|
||||||
|
} WOW64_CONTEXT, *PWOW64_CONTEXT;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _M128A {
|
||||||
|
ULONGLONG Low;
|
||||||
|
LONGLONG High;
|
||||||
|
} M128A, *PM128A;
|
||||||
|
|
||||||
|
typedef struct _XSAVE_FORMAT_64 {
|
||||||
|
WORD ControlWord;
|
||||||
|
WORD StatusWord;
|
||||||
|
BYTE TagWord;
|
||||||
|
BYTE Reserved1;
|
||||||
|
WORD ErrorOpcode;
|
||||||
|
DWORD ErrorOffset;
|
||||||
|
WORD ErrorSelector;
|
||||||
|
WORD Reserved2;
|
||||||
|
DWORD DataOffset;
|
||||||
|
WORD DataSelector;
|
||||||
|
WORD Reserved3;
|
||||||
|
DWORD MxCsr;
|
||||||
|
DWORD MxCsr_Mask;
|
||||||
|
M128A FloatRegisters[8];
|
||||||
|
M128A XmmRegisters[16];
|
||||||
|
BYTE Reserved4[96];
|
||||||
|
} XSAVE_FORMAT_64, *PXSAVE_FORMAT_64;
|
||||||
|
|
||||||
|
typedef struct _XSAVE_FORMAT_32 {
|
||||||
|
WORD ControlWord;
|
||||||
|
WORD StatusWord;
|
||||||
|
BYTE TagWord;
|
||||||
|
BYTE Reserved1;
|
||||||
|
WORD ErrorOpcode;
|
||||||
|
DWORD ErrorOffset;
|
||||||
|
WORD ErrorSelector;
|
||||||
|
WORD Reserved2;
|
||||||
|
DWORD DataOffset;
|
||||||
|
WORD DataSelector;
|
||||||
|
WORD Reserved3;
|
||||||
|
DWORD MxCsr;
|
||||||
|
DWORD MxCsr_Mask;
|
||||||
|
M128A FloatRegisters[8];
|
||||||
|
M128A XmmRegisters[8];
|
||||||
|
BYTE Reserved4[192];
|
||||||
|
DWORD StackControl[7];
|
||||||
|
DWORD Cr0NpxState;
|
||||||
|
} XSAVE_FORMAT_32, *PXSAVE_FORMAT_32;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _CONTEXT64 {
|
||||||
|
|
||||||
|
//
|
||||||
|
// Register parameter home addresses.
|
||||||
|
//
|
||||||
|
// N.B. These fields are for convience - they could be used to extend the
|
||||||
|
// context record in the future.
|
||||||
|
//
|
||||||
|
|
||||||
|
DWORD64 P1Home;
|
||||||
|
DWORD64 P2Home;
|
||||||
|
DWORD64 P3Home;
|
||||||
|
DWORD64 P4Home;
|
||||||
|
DWORD64 P5Home;
|
||||||
|
DWORD64 P6Home;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Control flags.
|
||||||
|
//
|
||||||
|
|
||||||
|
DWORD ContextFlags;
|
||||||
|
DWORD MxCsr;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Segment Registers and processor flags.
|
||||||
|
//
|
||||||
|
|
||||||
|
WORD SegCs;
|
||||||
|
WORD SegDs;
|
||||||
|
WORD SegEs;
|
||||||
|
WORD SegFs;
|
||||||
|
WORD SegGs;
|
||||||
|
WORD SegSs;
|
||||||
|
DWORD EFlags;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Debug registers
|
||||||
|
//
|
||||||
|
|
||||||
|
DWORD64 Dr0;
|
||||||
|
DWORD64 Dr1;
|
||||||
|
DWORD64 Dr2;
|
||||||
|
DWORD64 Dr3;
|
||||||
|
DWORD64 Dr6;
|
||||||
|
DWORD64 Dr7;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Integer registers.
|
||||||
|
//
|
||||||
|
|
||||||
|
DWORD64 Rax;
|
||||||
|
DWORD64 Rcx;
|
||||||
|
DWORD64 Rdx;
|
||||||
|
DWORD64 Rbx;
|
||||||
|
DWORD64 Rsp;
|
||||||
|
DWORD64 Rbp;
|
||||||
|
DWORD64 Rsi;
|
||||||
|
DWORD64 Rdi;
|
||||||
|
DWORD64 R8;
|
||||||
|
DWORD64 R9;
|
||||||
|
DWORD64 R10;
|
||||||
|
DWORD64 R11;
|
||||||
|
DWORD64 R12;
|
||||||
|
DWORD64 R13;
|
||||||
|
DWORD64 R14;
|
||||||
|
DWORD64 R15;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Program counter.
|
||||||
|
//
|
||||||
|
|
||||||
|
DWORD64 Rip;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Floating point state.
|
||||||
|
//
|
||||||
|
|
||||||
|
union {
|
||||||
|
XSAVE_FORMAT_64 FltSave;
|
||||||
|
struct {
|
||||||
|
M128A Header[2];
|
||||||
|
M128A Legacy[8];
|
||||||
|
M128A Xmm0;
|
||||||
|
M128A Xmm1;
|
||||||
|
M128A Xmm2;
|
||||||
|
M128A Xmm3;
|
||||||
|
M128A Xmm4;
|
||||||
|
M128A Xmm5;
|
||||||
|
M128A Xmm6;
|
||||||
|
M128A Xmm7;
|
||||||
|
M128A Xmm8;
|
||||||
|
M128A Xmm9;
|
||||||
|
M128A Xmm10;
|
||||||
|
M128A Xmm11;
|
||||||
|
M128A Xmm12;
|
||||||
|
M128A Xmm13;
|
||||||
|
M128A Xmm14;
|
||||||
|
M128A Xmm15;
|
||||||
|
} DUMMYSTRUCTNAME;
|
||||||
|
} DUMMYUNIONNAME;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Vector registers.
|
||||||
|
//
|
||||||
|
|
||||||
|
M128A VectorRegister[26];
|
||||||
|
DWORD64 VectorControl;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Special debug control registers.
|
||||||
|
//
|
||||||
|
|
||||||
|
DWORD64 DebugControl;
|
||||||
|
DWORD64 LastBranchToRip;
|
||||||
|
DWORD64 LastBranchFromRip;
|
||||||
|
DWORD64 LastExceptionToRip;
|
||||||
|
DWORD64 LastExceptionFromRip;
|
||||||
|
|
||||||
|
} CONTEXT64, *PCONTEXT64, *LPCONTEXT64;
|
||||||
@@ -380,112 +380,7 @@ typedef enum _SECTION_INHERIT {
|
|||||||
ViewUnmap = 2
|
ViewUnmap = 2
|
||||||
} SECTION_INHERIT;
|
} SECTION_INHERIT;
|
||||||
|
|
||||||
typedef enum _PROCESSINFOCLASS {
|
|
||||||
ProcessBasicInformation = 0,
|
|
||||||
ProcessQuotaLimits = 1,
|
|
||||||
ProcessIoCounters = 2,
|
|
||||||
ProcessVmCounters = 3,
|
|
||||||
ProcessTimes = 4,
|
|
||||||
ProcessBasePriority = 5,
|
|
||||||
ProcessRaisePriority = 6,
|
|
||||||
ProcessDebugPort = 7,
|
|
||||||
ProcessExceptionPort = 8,
|
|
||||||
ProcessAccessToken = 9,
|
|
||||||
ProcessLdtInformation = 10,
|
|
||||||
ProcessLdtSize = 11,
|
|
||||||
ProcessDefaultHardErrorMode = 12,
|
|
||||||
ProcessIoPortHandlers = 13, // Note: this is kernel mode only
|
|
||||||
ProcessPooledUsageAndLimits = 14,
|
|
||||||
ProcessWorkingSetWatch = 15,
|
|
||||||
ProcessUserModeIOPL = 16,
|
|
||||||
ProcessEnableAlignmentFaultFixup = 17,
|
|
||||||
ProcessPriorityClass = 18,
|
|
||||||
ProcessWx86Information = 19,
|
|
||||||
ProcessHandleCount = 20,
|
|
||||||
ProcessAffinityMask = 21,
|
|
||||||
ProcessPriorityBoost = 22,
|
|
||||||
ProcessDeviceMap = 23,
|
|
||||||
ProcessSessionInformation = 24,
|
|
||||||
ProcessForegroundInformation = 25,
|
|
||||||
ProcessWow64Information = 26,
|
|
||||||
ProcessImageFileName = 27,
|
|
||||||
ProcessLUIDDeviceMapsEnabled = 28,
|
|
||||||
ProcessBreakOnTermination = 29,
|
|
||||||
ProcessDebugObjectHandle = 30,
|
|
||||||
ProcessDebugFlags = 31,
|
|
||||||
ProcessHandleTracing = 32,
|
|
||||||
ProcessIoPriority = 33,
|
|
||||||
ProcessExecuteFlags = 34,
|
|
||||||
ProcessTlsInformation = 35,
|
|
||||||
ProcessCookie = 36,
|
|
||||||
ProcessImageInformation = 37,
|
|
||||||
ProcessCycleTime = 38,
|
|
||||||
ProcessPagePriority = 39,
|
|
||||||
ProcessInstrumentationCallback = 40,
|
|
||||||
ProcessThreadStackAllocation = 41,
|
|
||||||
ProcessWorkingSetWatchEx = 42,
|
|
||||||
ProcessImageFileNameWin32 = 43,
|
|
||||||
ProcessImageFileMapping = 44,
|
|
||||||
ProcessAffinityUpdateMode = 45,
|
|
||||||
ProcessMemoryAllocationMode = 46,
|
|
||||||
ProcessGroupInformation = 47,
|
|
||||||
ProcessTokenVirtualizationEnabled = 48,
|
|
||||||
ProcessOwnerInformation = 49,
|
|
||||||
ProcessWindowInformation = 50,
|
|
||||||
ProcessHandleInformation = 51,
|
|
||||||
ProcessMitigationPolicy = 52,
|
|
||||||
ProcessDynamicFunctionTableInformation = 53,
|
|
||||||
ProcessHandleCheckingMode = 54,
|
|
||||||
ProcessKeepAliveCount = 55,
|
|
||||||
ProcessRevokeFileHandles = 56,
|
|
||||||
ProcessWorkingSetControl = 57,
|
|
||||||
ProcessHandleTable = 58,
|
|
||||||
ProcessCheckStackExtentsMode = 59,
|
|
||||||
ProcessCommandLineInformation = 60,
|
|
||||||
ProcessProtectionInformation = 61,
|
|
||||||
ProcessMemoryExhaustion = 62,
|
|
||||||
ProcessFaultInformation = 63,
|
|
||||||
ProcessTelemetryIdInformation = 64,
|
|
||||||
ProcessCommitReleaseInformation = 65,
|
|
||||||
ProcessReserved1Information = 66,
|
|
||||||
ProcessReserved2Information = 67,
|
|
||||||
ProcessSubsystemProcess = 68,
|
|
||||||
ProcessInPrivate = 70,
|
|
||||||
ProcessRaiseUMExceptionOnInvalidHandleClose = 71,
|
|
||||||
ProcessSubsystemInformation = 75,
|
|
||||||
ProcessWin32kSyscallFilterInformation = 79,
|
|
||||||
ProcessEnergyTrackingState = 82,
|
|
||||||
MaxProcessInfoClass // MaxProcessInfoClass should always be the last enum
|
|
||||||
} PROCESSINFOCLASS;
|
|
||||||
|
|
||||||
typedef enum _MEMORY_INFORMATION_CLASS {
|
|
||||||
MemoryBasicInformation,
|
|
||||||
MemoryWorkingSetList,
|
|
||||||
MemorySectionName,
|
|
||||||
MemoryBasicVlmInformation,
|
|
||||||
MemoryWorkingSetListEx
|
|
||||||
} MEMORY_INFORMATION_CLASS;
|
|
||||||
|
|
||||||
typedef enum _THREAD_INFORMATION_CLASS {
|
|
||||||
ThreadBasicInformation,
|
|
||||||
ThreadTimes,
|
|
||||||
ThreadPriority,
|
|
||||||
ThreadBasePriority,
|
|
||||||
ThreadAffinityMask,
|
|
||||||
ThreadImpersonationToken,
|
|
||||||
ThreadDescriptorTableEntry,
|
|
||||||
ThreadEnableAlignmentFaultFixup,
|
|
||||||
ThreadEventPair,
|
|
||||||
ThreadQuerySetWin32StartAddress,
|
|
||||||
ThreadZeroTlsCell,
|
|
||||||
ThreadPerformanceCount,
|
|
||||||
ThreadAmILastThread,
|
|
||||||
ThreadIdealProcessor,
|
|
||||||
ThreadPriorityBoost,
|
|
||||||
ThreadSetTlsArrayAddress,
|
|
||||||
ThreadIsIoPending,
|
|
||||||
ThreadHideFromDebugger
|
|
||||||
} THREAD_INFORMATION_CLASS, *PTHREAD_INFORMATION_CLASS;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -842,232 +737,7 @@ typedef struct _PROCESS_INFORMATION {
|
|||||||
} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
|
} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
|
||||||
|
|
||||||
|
|
||||||
typedef struct _FLOATING_SAVE_AREA {
|
|
||||||
DWORD ControlWord;
|
|
||||||
DWORD StatusWord;
|
|
||||||
DWORD TagWord;
|
|
||||||
DWORD ErrorOffset;
|
|
||||||
DWORD ErrorSelector;
|
|
||||||
DWORD DataOffset;
|
|
||||||
DWORD DataSelector;
|
|
||||||
BYTE RegisterArea[80];
|
|
||||||
DWORD Cr0NpxState;
|
|
||||||
} FLOATING_SAVE_AREA;
|
|
||||||
|
|
||||||
typedef struct _CONTEXT32 {
|
|
||||||
|
|
||||||
DWORD ContextFlags;
|
|
||||||
|
|
||||||
DWORD Dr0;
|
|
||||||
DWORD Dr1;
|
|
||||||
DWORD Dr2;
|
|
||||||
DWORD Dr3;
|
|
||||||
DWORD Dr6;
|
|
||||||
DWORD Dr7;
|
|
||||||
|
|
||||||
FLOATING_SAVE_AREA FloatSave;
|
|
||||||
|
|
||||||
DWORD SegGs;
|
|
||||||
DWORD SegFs;
|
|
||||||
DWORD SegEs;
|
|
||||||
DWORD SegDs;
|
|
||||||
|
|
||||||
DWORD Edi;
|
|
||||||
DWORD Esi;
|
|
||||||
DWORD Ebx;
|
|
||||||
DWORD Edx;
|
|
||||||
DWORD Ecx;
|
|
||||||
DWORD Eax;
|
|
||||||
|
|
||||||
DWORD Ebp;
|
|
||||||
DWORD Eip;
|
|
||||||
DWORD SegCs;
|
|
||||||
DWORD EFlags;
|
|
||||||
DWORD Esp;
|
|
||||||
DWORD SegSs;
|
|
||||||
|
|
||||||
BYTE ExtendedRegisters[512];
|
|
||||||
|
|
||||||
} CONTEXT32, *PCONTEXT32, *LPCONTEXT32;
|
|
||||||
|
|
||||||
typedef struct _WOW64_FLOATING_SAVE_AREA {
|
|
||||||
DWORD ControlWord;
|
|
||||||
DWORD StatusWord;
|
|
||||||
DWORD TagWord;
|
|
||||||
DWORD ErrorOffset;
|
|
||||||
DWORD ErrorSelector;
|
|
||||||
DWORD DataOffset;
|
|
||||||
DWORD DataSelector;
|
|
||||||
BYTE RegisterArea[WOW64_SIZE_OF_80387_REGISTERS];
|
|
||||||
DWORD Cr0NpxState;
|
|
||||||
} WOW64_FLOATING_SAVE_AREA;
|
|
||||||
|
|
||||||
typedef struct _WOW64_CONTEXT {
|
|
||||||
|
|
||||||
DWORD ContextFlags;
|
|
||||||
|
|
||||||
DWORD Dr0;
|
|
||||||
DWORD Dr1;
|
|
||||||
DWORD Dr2;
|
|
||||||
DWORD Dr3;
|
|
||||||
DWORD Dr6;
|
|
||||||
DWORD Dr7;
|
|
||||||
|
|
||||||
WOW64_FLOATING_SAVE_AREA FloatSave;
|
|
||||||
|
|
||||||
DWORD SegGs;
|
|
||||||
DWORD SegFs;
|
|
||||||
DWORD SegEs;
|
|
||||||
DWORD SegDs;
|
|
||||||
|
|
||||||
DWORD Edi;
|
|
||||||
DWORD Esi;
|
|
||||||
DWORD Ebx;
|
|
||||||
DWORD Edx;
|
|
||||||
DWORD Ecx;
|
|
||||||
DWORD Eax;
|
|
||||||
DWORD Ebp;
|
|
||||||
DWORD Eip;
|
|
||||||
DWORD SegCs;
|
|
||||||
DWORD EFlags;
|
|
||||||
DWORD Esp;
|
|
||||||
DWORD SegSs;
|
|
||||||
|
|
||||||
BYTE ExtendedRegisters[WOW64_MAXIMUM_SUPPORTED_EXTENSION];
|
|
||||||
|
|
||||||
} WOW64_CONTEXT, *PWOW64_CONTEXT;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct _M128A {
|
|
||||||
ULONGLONG Low;
|
|
||||||
LONGLONG High;
|
|
||||||
} M128A, *PM128A;
|
|
||||||
|
|
||||||
typedef struct _XSAVE_FORMAT_64 {
|
|
||||||
WORD ControlWord;
|
|
||||||
WORD StatusWord;
|
|
||||||
BYTE TagWord;
|
|
||||||
BYTE Reserved1;
|
|
||||||
WORD ErrorOpcode;
|
|
||||||
DWORD ErrorOffset;
|
|
||||||
WORD ErrorSelector;
|
|
||||||
WORD Reserved2;
|
|
||||||
DWORD DataOffset;
|
|
||||||
WORD DataSelector;
|
|
||||||
WORD Reserved3;
|
|
||||||
DWORD MxCsr;
|
|
||||||
DWORD MxCsr_Mask;
|
|
||||||
M128A FloatRegisters[8];
|
|
||||||
M128A XmmRegisters[16];
|
|
||||||
BYTE Reserved4[96];
|
|
||||||
} XSAVE_FORMAT_64, *PXSAVE_FORMAT_64;
|
|
||||||
|
|
||||||
typedef struct _XSAVE_FORMAT_32 {
|
|
||||||
WORD ControlWord;
|
|
||||||
WORD StatusWord;
|
|
||||||
BYTE TagWord;
|
|
||||||
BYTE Reserved1;
|
|
||||||
WORD ErrorOpcode;
|
|
||||||
DWORD ErrorOffset;
|
|
||||||
WORD ErrorSelector;
|
|
||||||
WORD Reserved2;
|
|
||||||
DWORD DataOffset;
|
|
||||||
WORD DataSelector;
|
|
||||||
WORD Reserved3;
|
|
||||||
DWORD MxCsr;
|
|
||||||
DWORD MxCsr_Mask;
|
|
||||||
M128A FloatRegisters[8];
|
|
||||||
M128A XmmRegisters[8];
|
|
||||||
BYTE Reserved4[192];
|
|
||||||
DWORD StackControl[7];
|
|
||||||
DWORD Cr0NpxState;
|
|
||||||
} XSAVE_FORMAT_32, *PXSAVE_FORMAT_32;
|
|
||||||
|
|
||||||
typedef struct _TMP_DUMMYSTRUCTNAME {
|
|
||||||
M128A Header[2];
|
|
||||||
M128A Legacy[8];
|
|
||||||
M128A Xmm0;
|
|
||||||
M128A Xmm1;
|
|
||||||
M128A Xmm2;
|
|
||||||
M128A Xmm3;
|
|
||||||
M128A Xmm4;
|
|
||||||
M128A Xmm5;
|
|
||||||
M128A Xmm6;
|
|
||||||
M128A Xmm7;
|
|
||||||
M128A Xmm8;
|
|
||||||
M128A Xmm9;
|
|
||||||
M128A Xmm10;
|
|
||||||
M128A Xmm11;
|
|
||||||
M128A Xmm12;
|
|
||||||
M128A Xmm13;
|
|
||||||
M128A Xmm14;
|
|
||||||
M128A Xmm15;
|
|
||||||
} TMP_DUMMYSTRUCTNAME;
|
|
||||||
|
|
||||||
|
|
||||||
typedef union _TMP_CONTEXT64_SUBUNION {
|
|
||||||
XSAVE_FORMAT_64 FltSave;
|
|
||||||
TMP_DUMMYSTRUCTNAME DUMMYSTRUCTNAME;
|
|
||||||
} TMP_CONTEXT64_SUBUNION;
|
|
||||||
|
|
||||||
typedef struct _CONTEXT64 {
|
|
||||||
|
|
||||||
DWORD64 P1Home;
|
|
||||||
DWORD64 P2Home;
|
|
||||||
DWORD64 P3Home;
|
|
||||||
DWORD64 P4Home;
|
|
||||||
DWORD64 P5Home;
|
|
||||||
DWORD64 P6Home;
|
|
||||||
|
|
||||||
DWORD ContextFlags;
|
|
||||||
DWORD MxCsr;
|
|
||||||
|
|
||||||
WORD SegCs;
|
|
||||||
WORD SegDs;
|
|
||||||
WORD SegEs;
|
|
||||||
WORD SegFs;
|
|
||||||
WORD SegGs;
|
|
||||||
WORD SegSs;
|
|
||||||
DWORD EFlags;
|
|
||||||
|
|
||||||
DWORD64 Dr0;
|
|
||||||
DWORD64 Dr1;
|
|
||||||
DWORD64 Dr2;
|
|
||||||
DWORD64 Dr3;
|
|
||||||
DWORD64 Dr6;
|
|
||||||
DWORD64 Dr7;
|
|
||||||
|
|
||||||
|
|
||||||
DWORD64 Rax;
|
|
||||||
DWORD64 Rcx;
|
|
||||||
DWORD64 Rdx;
|
|
||||||
DWORD64 Rbx;
|
|
||||||
DWORD64 Rsp;
|
|
||||||
DWORD64 Rbp;
|
|
||||||
DWORD64 Rsi;
|
|
||||||
DWORD64 Rdi;
|
|
||||||
DWORD64 R8;
|
|
||||||
DWORD64 R9;
|
|
||||||
DWORD64 R10;
|
|
||||||
DWORD64 R11;
|
|
||||||
DWORD64 R12;
|
|
||||||
DWORD64 R13;
|
|
||||||
DWORD64 R14;
|
|
||||||
DWORD64 R15;
|
|
||||||
|
|
||||||
DWORD64 Rip;
|
|
||||||
|
|
||||||
TMP_CONTEXT64_SUBUNION DUMMYUNIONNAME;
|
|
||||||
|
|
||||||
M128A VectorRegister[26];
|
|
||||||
DWORD64 VectorControl;
|
|
||||||
|
|
||||||
DWORD64 DebugControl;
|
|
||||||
DWORD64 LastBranchToRip;
|
|
||||||
DWORD64 LastBranchFromRip;
|
|
||||||
DWORD64 LastExceptionToRip;
|
|
||||||
DWORD64 LastExceptionFromRip;
|
|
||||||
} CONTEXT64, *PCONTEXT64, *LPCONTEXT64;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct tagPROCESSENTRY32W
|
typedef struct tagPROCESSENTRY32W
|
||||||
|
|||||||
@@ -1145,6 +1145,89 @@ WinDef
|
|||||||
.. autodata:: NMPWAIT_WAIT_FOREVER
|
.. autodata:: NMPWAIT_WAIT_FOREVER
|
||||||
.. autodata:: NMPWAIT_NOWAIT
|
.. autodata:: NMPWAIT_NOWAIT
|
||||||
.. autodata:: NMPWAIT_USE_DEFAULT_WAIT
|
.. autodata:: NMPWAIT_USE_DEFAULT_WAIT
|
||||||
|
.. autodata:: ProcThreadAttributeParentProcess
|
||||||
|
.. autodata:: ProcThreadAttributeExtendedFlags
|
||||||
|
.. autodata:: ProcThreadAttributeHandleList
|
||||||
|
.. autodata:: ProcThreadAttributeGroupAffinity
|
||||||
|
.. autodata:: ProcThreadAttributePreferredNode
|
||||||
|
.. autodata:: ProcThreadAttributeIdealProcessor
|
||||||
|
.. autodata:: ProcThreadAttributeUmsThread
|
||||||
|
.. autodata:: ProcThreadAttributeMitigationPolicy
|
||||||
|
.. autodata:: ProcThreadAttributePackageFullName
|
||||||
|
.. autodata:: ProcThreadAttributeSecurityCapabilities
|
||||||
|
.. autodata:: ProcThreadAttributeConsoleReference
|
||||||
|
.. autodata:: ProcThreadAttributeProtectionLevel
|
||||||
|
.. autodata:: ProcThreadAttributeOsMaxVersionTested
|
||||||
|
.. autodata:: ProcThreadAttributeJobList
|
||||||
|
.. autodata:: ProcThreadAttributeChildProcessPolicy
|
||||||
|
.. autodata:: ProcThreadAttributeAllApplicationPackagesPolicy
|
||||||
|
.. autodata:: ProcThreadAttributeWin32kFilter
|
||||||
|
.. autodata:: ProcThreadAttributeSafeOpenPromptOriginClaim
|
||||||
|
.. autodata:: ProcThreadAttributeDesktopAppPolicy
|
||||||
|
.. autodata:: ProcThreadAttributeBnoIsolation
|
||||||
|
.. autodata:: ProcThreadAttributePseudoConsole
|
||||||
|
.. autodata:: ProcThreadAttributeIsolationManifest
|
||||||
|
.. autodata:: ProcThreadAttributeMitigationAuditPolicy
|
||||||
|
.. autodata:: ProcThreadAttributeMachineType
|
||||||
|
.. autodata:: ProcThreadAttributeComponentFilter
|
||||||
|
.. autodata:: ProcThreadAttributeEnableOptionalXStateFeatures
|
||||||
|
.. autodata:: ProcThreadAttributeCreateStore
|
||||||
|
.. autodata:: ProcThreadAttributeTrustedApp
|
||||||
|
.. autodata:: ProcThreadAttributeSveVectorLength
|
||||||
|
.. autodata:: PROC_THREAD_ATTRIBUTE_NUMBER
|
||||||
|
.. autodata:: PROC_THREAD_ATTRIBUTE_THREAD
|
||||||
|
.. autodata:: PROC_THREAD_ATTRIBUTE_INPUT
|
||||||
|
.. autodata:: PROC_THREAD_ATTRIBUTE_ADDITIVE
|
||||||
|
.. autodata:: PROC_THREAD_ATTRIBUTE_PARENT_PROCESS
|
||||||
|
.. autodata:: PROC_THREAD_ATTRIBUTE_HANDLE_LIST
|
||||||
|
.. autodata:: PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY
|
||||||
|
.. autodata:: PROC_THREAD_ATTRIBUTE_PREFERRED_NODE
|
||||||
|
.. autodata:: PROC_THREAD_ATTRIBUTE_IDEAL_PROCESSOR
|
||||||
|
.. autodata:: PROC_THREAD_ATTRIBUTE_UMS_THREAD
|
||||||
|
.. autodata:: PROC_THREAD_ATTRIBUTE_MITIGATION_POLICY
|
||||||
|
.. autodata:: PROC_THREAD_ATTRIBUTE_SECURITY_CAPABILITIES
|
||||||
|
.. autodata:: PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL
|
||||||
|
.. autodata:: PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE
|
||||||
|
.. autodata:: PROC_THREAD_ATTRIBUTE_MACHINE_TYPE
|
||||||
|
.. autodata:: PROC_THREAD_ATTRIBUTE_ENABLE_OPTIONAL_XSTATE_FEATURES
|
||||||
|
.. autodata:: PROC_THREAD_ATTRIBUTE_SVE_VECTOR_LENGTH
|
||||||
|
.. autodata:: PROCESSOR_INTEL_386
|
||||||
|
.. autodata:: PROCESSOR_INTEL_486
|
||||||
|
.. autodata:: PROCESSOR_INTEL_PENTIUM
|
||||||
|
.. autodata:: PROCESSOR_INTEL_IA64
|
||||||
|
.. autodata:: PROCESSOR_MIPS_R4000
|
||||||
|
.. autodata:: PROCESSOR_ALPHA_21064
|
||||||
|
.. autodata:: PROCESSOR_PPC_601
|
||||||
|
.. autodata:: PROCESSOR_PPC_603
|
||||||
|
.. autodata:: PROCESSOR_PPC_604
|
||||||
|
.. autodata:: PROCESSOR_PPC_620
|
||||||
|
.. autodata:: PROCESSOR_HITACHI_SH3
|
||||||
|
.. autodata:: PROCESSOR_HITACHI_SH3E
|
||||||
|
.. autodata:: PROCESSOR_HITACHI_SH4
|
||||||
|
.. autodata:: PROCESSOR_MOTOROLA_821
|
||||||
|
.. autodata:: PROCESSOR_SHx_SH3
|
||||||
|
.. autodata:: PROCESSOR_SHx_SH4
|
||||||
|
.. autodata:: PROCESSOR_STRONGARM
|
||||||
|
.. autodata:: PROCESSOR_ARM720
|
||||||
|
.. autodata:: PROCESSOR_ARM820
|
||||||
|
.. autodata:: PROCESSOR_ARM920
|
||||||
|
.. autodata:: PROCESSOR_ARM_7TDMI
|
||||||
|
.. autodata:: PROCESSOR_OPTIL
|
||||||
|
.. autodata:: PROCESSOR_ARCHITECTURE_INTEL
|
||||||
|
.. autodata:: PROCESSOR_ARCHITECTURE_MIPS
|
||||||
|
.. autodata:: PROCESSOR_ARCHITECTURE_ALPHA
|
||||||
|
.. autodata:: PROCESSOR_ARCHITECTURE_PPC
|
||||||
|
.. autodata:: PROCESSOR_ARCHITECTURE_SHX
|
||||||
|
.. autodata:: PROCESSOR_ARCHITECTURE_ARM
|
||||||
|
.. autodata:: PROCESSOR_ARCHITECTURE_IA64
|
||||||
|
.. autodata:: PROCESSOR_ARCHITECTURE_ALPHA64
|
||||||
|
.. autodata:: PROCESSOR_ARCHITECTURE_MSIL
|
||||||
|
.. autodata:: PROCESSOR_ARCHITECTURE_AMD64
|
||||||
|
.. autodata:: PROCESSOR_ARCHITECTURE_IA32_ON_WIN64
|
||||||
|
.. autodata:: PROCESSOR_ARCHITECTURE_NEUTRAL
|
||||||
|
.. autodata:: PROCESSOR_ARCHITECTURE_ARM64
|
||||||
|
.. autodata:: PROCESSOR_ARCHITECTURE_ARM32_ON_WIN64
|
||||||
|
.. autodata:: PROCESSOR_ARCHITECTURE_UNKNOWN
|
||||||
.. autodata:: HKEY_CLASSES_ROOT
|
.. autodata:: HKEY_CLASSES_ROOT
|
||||||
.. autodata:: HKEY_CURRENT_USER
|
.. autodata:: HKEY_CURRENT_USER
|
||||||
.. autodata:: HKEY_LOCAL_MACHINE
|
.. autodata:: HKEY_LOCAL_MACHINE
|
||||||
@@ -1766,6 +1849,45 @@ WinDef
|
|||||||
.. autodata:: SPC_FINANCIAL_CRITERIA_OBJID
|
.. autodata:: SPC_FINANCIAL_CRITERIA_OBJID
|
||||||
.. autodata:: SPC_LINK_OBJID
|
.. autodata:: SPC_LINK_OBJID
|
||||||
.. autodata:: SPC_SIGINFO_OBJID
|
.. autodata:: SPC_SIGINFO_OBJID
|
||||||
|
.. autodata:: CONTEXT_I386
|
||||||
|
.. autodata:: CONTEXT_AMD64
|
||||||
|
.. autodata:: CONTEXT_ARM
|
||||||
|
.. autodata:: CONTEXT_ARM64
|
||||||
|
.. autodata:: CONTEXT_i386
|
||||||
|
.. autodata:: CONTEXT_i486
|
||||||
|
.. autodata:: WOW64_CONTEXT_i386
|
||||||
|
.. autodata:: WOW64_CONTEXT_i486
|
||||||
|
.. autodata:: CONTEXT_CONTROL
|
||||||
|
.. autodata:: CONTEXT_INTEGER
|
||||||
|
.. autodata:: CONTEXT_SEGMENTS
|
||||||
|
.. autodata:: CONTEXT_FLOATING_POINT
|
||||||
|
.. autodata:: CONTEXT_DEBUG_REGISTERS
|
||||||
|
.. autodata:: CONTEXT_EXTENDED_REGISTERS
|
||||||
|
.. autodata:: CONTEXT_FULL
|
||||||
|
.. autodata:: CONTEXT_ALL
|
||||||
|
.. autodata:: CONTEXT_XSTATE
|
||||||
|
.. autodata:: WOW64_CONTEXT_CONTROL
|
||||||
|
.. autodata:: WOW64_CONTEXT_INTEGER
|
||||||
|
.. autodata:: WOW64_CONTEXT_SEGMENTS
|
||||||
|
.. autodata:: WOW64_CONTEXT_FLOATING_POINT
|
||||||
|
.. autodata:: WOW64_CONTEXT_DEBUG_REGISTERS
|
||||||
|
.. autodata:: WOW64_CONTEXT_EXTENDED_REGISTERS
|
||||||
|
.. autodata:: WOW64_CONTEXT_FULL
|
||||||
|
.. autodata:: WOW64_CONTEXT_ALL
|
||||||
|
.. autodata:: WOW64_CONTEXT_XSTATE
|
||||||
|
.. autodata:: WOW64_CONTEXT_EXCEPTION_ACTIVE
|
||||||
|
.. autodata:: WOW64_CONTEXT_SERVICE_ACTIVE
|
||||||
|
.. autodata:: WOW64_CONTEXT_EXCEPTION_REQUEST
|
||||||
|
.. autodata:: WOW64_CONTEXT_EXCEPTION_REPORTING
|
||||||
|
.. autodata:: CONTEXT_ARM64_CONTROL
|
||||||
|
.. autodata:: CONTEXT_ARM64_INTEGER
|
||||||
|
.. autodata:: CONTEXT_ARM64_FLOATING_POINT
|
||||||
|
.. autodata:: CONTEXT_ARM64_DEBUG_REGISTERS
|
||||||
|
.. autodata:: CONTEXT_ARM64_X18
|
||||||
|
.. autodata:: CONTEXT_UNWOUND_TO_CALL
|
||||||
|
.. autodata:: CONTEXT_RET_TO_GUEST
|
||||||
|
.. autodata:: ARM64_MAX_BREAKPOINTS
|
||||||
|
.. autodata:: ARM64_MAX_WATCHPOINTS
|
||||||
.. autodata:: FILE_VER_GET_LOCALISED
|
.. autodata:: FILE_VER_GET_LOCALISED
|
||||||
.. autodata:: FILE_VER_GET_NEUTRAL
|
.. autodata:: FILE_VER_GET_NEUTRAL
|
||||||
.. autodata:: FILE_VER_GET_PREFETCHED
|
.. autodata:: FILE_VER_GET_PREFETCHED
|
||||||
@@ -1877,19 +1999,6 @@ WinDef
|
|||||||
.. autodata:: TH32CS_SNAPMODULE32
|
.. autodata:: TH32CS_SNAPMODULE32
|
||||||
.. autodata:: TH32CS_SNAPALL
|
.. autodata:: TH32CS_SNAPALL
|
||||||
.. autodata:: TH32CS_INHERIT
|
.. autodata:: TH32CS_INHERIT
|
||||||
.. autodata:: CONTEXT_I386
|
|
||||||
.. autodata:: CONTEXT_AMD64
|
|
||||||
.. autodata:: CONTEXT_ARM
|
|
||||||
.. autodata:: CONTEXT_ARM64
|
|
||||||
.. autodata:: CONTEXT_CONTROL
|
|
||||||
.. autodata:: CONTEXT_INTEGER
|
|
||||||
.. autodata:: CONTEXT_SEGMENTS
|
|
||||||
.. autodata:: CONTEXT_FLOATING_POINT
|
|
||||||
.. autodata:: CONTEXT_DEBUG_REGISTERS
|
|
||||||
.. autodata:: CONTEXT_EXTENDED_REGISTERS
|
|
||||||
.. autodata:: CONTEXT_FULL
|
|
||||||
.. autodata:: CONTEXT_ALL
|
|
||||||
.. autodata:: CONTEXT_XSTATE
|
|
||||||
.. autodata:: PAGE_NOACCESS
|
.. autodata:: PAGE_NOACCESS
|
||||||
.. autodata:: PAGE_READONLY
|
.. autodata:: PAGE_READONLY
|
||||||
.. autodata:: PAGE_READWRITE
|
.. autodata:: PAGE_READWRITE
|
||||||
@@ -2922,6 +3031,7 @@ WinDef
|
|||||||
.. autodata:: IMAGE_FILE_MACHINE_M32R
|
.. autodata:: IMAGE_FILE_MACHINE_M32R
|
||||||
.. autodata:: IMAGE_FILE_MACHINE_CEE
|
.. autodata:: IMAGE_FILE_MACHINE_CEE
|
||||||
.. autodata:: IMAGE_FILE_MACHINE_ARM64
|
.. autodata:: IMAGE_FILE_MACHINE_ARM64
|
||||||
|
.. autodata:: IMAGE_FILE_MACHINE_TARGET_HOST
|
||||||
.. autodata:: CERT_QUERY_OBJECT_FILE
|
.. autodata:: CERT_QUERY_OBJECT_FILE
|
||||||
.. autodata:: CERT_QUERY_OBJECT_BLOB
|
.. autodata:: CERT_QUERY_OBJECT_BLOB
|
||||||
.. autodata:: CERT_QUERY_CONTENT_CERT
|
.. autodata:: CERT_QUERY_CONTENT_CERT
|
||||||
|
|||||||
@@ -696,6 +696,10 @@ Functions
|
|||||||
|
|
||||||
.. function:: FreeLibrary(hLibModule)
|
.. function:: FreeLibrary(hLibModule)
|
||||||
|
|
||||||
|
.. function:: GetProcessInformation(hProcess, ProcessInformationClass, ProcessInformation, ProcessInformationSize)
|
||||||
|
|
||||||
|
.. function:: SetProcessInformation(hProcess, ProcessInformationClass, ProcessInformation, ProcessInformationSize)
|
||||||
|
|
||||||
.. function:: RtlGetCurrentPeb()
|
.. function:: RtlGetCurrentPeb()
|
||||||
|
|
||||||
.. function:: RegQueryValueExA(hKey, lpValueName, lpReserved, lpType, lpData, lpcbData)
|
.. function:: RegQueryValueExA(hKey, lpValueName, lpReserved, lpType, lpData, lpcbData)
|
||||||
@@ -1214,6 +1218,42 @@ Functions
|
|||||||
|
|
||||||
.. function:: LookupAccountNameW(lpSystemName, lpAccountName, Sid, cbSid, ReferencedDomainName, cchReferencedDomainName, peUse)
|
.. function:: LookupAccountNameW(lpSystemName, lpAccountName, Sid, cbSid, ReferencedDomainName, cchReferencedDomainName, peUse)
|
||||||
|
|
||||||
|
.. function:: GetNativeSystemInfo(lpSystemInfo)
|
||||||
|
|
||||||
|
.. function:: GetSystemInfo(lpSystemInfo)
|
||||||
|
|
||||||
|
.. function:: IsWow64Process(hProcess, Wow64Process)
|
||||||
|
|
||||||
|
.. function:: IsWow64Process2(hProcess, pProcessMachine, pNativeMachine)
|
||||||
|
|
||||||
|
.. function:: IsWow64GuestMachineSupported(WowGuestMachine, MachineIsSupported)
|
||||||
|
|
||||||
|
.. function:: GetSystemWow64DirectoryA(lpBuffer, uSize)
|
||||||
|
|
||||||
|
.. function:: GetSystemWow64DirectoryW(lpBuffer, uSize)
|
||||||
|
|
||||||
|
.. function:: GetSystemWow64Directory2A(lpBuffer, uSize, ImageFileMachineType)
|
||||||
|
|
||||||
|
.. function:: GetSystemWow64Directory2W(lpBuffer, uSize, ImageFileMachineType)
|
||||||
|
|
||||||
|
.. function:: Wow64DisableWow64FsRedirection(OldValue)
|
||||||
|
|
||||||
|
.. function:: Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection)
|
||||||
|
|
||||||
|
.. function:: Wow64RevertWow64FsRedirection(OlValue)
|
||||||
|
|
||||||
|
.. function:: Wow64GetThreadContext(hThread, lpContext)
|
||||||
|
|
||||||
|
.. function:: Wow64SetThreadContext(hThread, lpContext)
|
||||||
|
|
||||||
|
.. function:: Wow64SetThreadDefaultGuestMachine(Machine)
|
||||||
|
|
||||||
|
.. function:: Wow64SuspendThread(hThread)
|
||||||
|
|
||||||
|
.. function:: NtWow64ReadVirtualMemory64(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesRead)
|
||||||
|
|
||||||
|
.. function:: NtWow64WriteVirtualMemory64(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesWritten)
|
||||||
|
|
||||||
.. function:: FileTimeToSystemTime(lpFileTime, lpSystemTime)
|
.. function:: FileTimeToSystemTime(lpFileTime, lpSystemTime)
|
||||||
|
|
||||||
.. function:: SystemTimeToFileTime(lpSystemTime, lpFileTime)
|
.. function:: SystemTimeToFileTime(lpSystemTime, lpFileTime)
|
||||||
@@ -1350,6 +1390,8 @@ Functions
|
|||||||
|
|
||||||
.. function:: CreateRemoteThread(hProcess, lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpThreadId)
|
.. function:: CreateRemoteThread(hProcess, lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpThreadId)
|
||||||
|
|
||||||
|
.. function:: CreateRemoteThreadEx(hProcess, lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpAttributeList, lpThreadId)
|
||||||
|
|
||||||
.. function:: CreateProcessA(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation)
|
.. function:: CreateProcessA(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation)
|
||||||
|
|
||||||
.. function:: CreateProcessW(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation)
|
.. function:: CreateProcessW(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation)
|
||||||
@@ -1370,12 +1412,8 @@ Functions
|
|||||||
|
|
||||||
.. function:: ReadProcessMemory(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesRead)
|
.. function:: ReadProcessMemory(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesRead)
|
||||||
|
|
||||||
.. function:: NtWow64ReadVirtualMemory64(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesRead)
|
|
||||||
|
|
||||||
.. function:: WriteProcessMemory(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesWritten)
|
.. function:: WriteProcessMemory(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesWritten)
|
||||||
|
|
||||||
.. function:: NtWow64WriteVirtualMemory64(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesWritten)
|
|
||||||
|
|
||||||
.. function:: GetCurrentProcess()
|
.. function:: GetCurrentProcess()
|
||||||
|
|
||||||
.. function:: CreateFileA(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile)
|
.. function:: CreateFileA(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile)
|
||||||
@@ -1468,14 +1506,6 @@ Functions
|
|||||||
|
|
||||||
.. function:: DeviceIoControl(hDevice, dwIoControlCode, lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, lpBytesReturned, lpOverlapped)
|
.. function:: DeviceIoControl(hDevice, dwIoControlCode, lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, lpBytesReturned, lpOverlapped)
|
||||||
|
|
||||||
.. function:: Wow64DisableWow64FsRedirection(OldValue)
|
|
||||||
|
|
||||||
.. function:: Wow64RevertWow64FsRedirection(OldValue)
|
|
||||||
|
|
||||||
.. function:: Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection)
|
|
||||||
|
|
||||||
.. function:: Wow64GetThreadContext(hThread, lpContext)
|
|
||||||
|
|
||||||
.. function:: SetConsoleCtrlHandler(HandlerRoutine, Add)
|
.. function:: SetConsoleCtrlHandler(HandlerRoutine, Add)
|
||||||
|
|
||||||
.. function:: GlobalAlloc(uFlags, dwBytes)
|
.. function:: GlobalAlloc(uFlags, dwBytes)
|
||||||
@@ -1530,8 +1560,6 @@ Functions
|
|||||||
|
|
||||||
.. function:: GetProcessId(Process)
|
.. function:: GetProcessId(Process)
|
||||||
|
|
||||||
.. function:: Wow64SetThreadContext(hThread, lpContext)
|
|
||||||
|
|
||||||
.. function:: GetMappedFileNameW(hProcess, lpv, lpFilename, nSize)
|
.. function:: GetMappedFileNameW(hProcess, lpv, lpFilename, nSize)
|
||||||
|
|
||||||
.. function:: GetMappedFileNameA(hProcess, lpv, lpFilename, nSize)
|
.. function:: GetMappedFileNameA(hProcess, lpv, lpFilename, nSize)
|
||||||
|
|||||||
+1495
-1278
File diff suppressed because it is too large
Load Diff
@@ -18,6 +18,11 @@ def search_name_in_enum(target):
|
|||||||
for name, enum in meta.enums_walker():
|
for name, enum in meta.enums_walker():
|
||||||
if match(target, name):
|
if match(target, name):
|
||||||
print(name, enum)
|
print(name, enum)
|
||||||
|
if not issubclass(enum, gdef.EnumType):
|
||||||
|
continue
|
||||||
|
for enumvalue in enum.values:
|
||||||
|
if match(target, enumvalue.name):
|
||||||
|
print("Enum <{0!r}>".format(enumvalue))
|
||||||
|
|
||||||
def search_name_in_struct(target):
|
def search_name_in_struct(target):
|
||||||
for name, struct in meta.structs_walker():
|
for name, struct in meta.structs_walker():
|
||||||
@@ -78,6 +83,13 @@ def search_value(target):
|
|||||||
if target == windef:
|
if target == windef:
|
||||||
print(repr(windef))
|
print(repr(windef))
|
||||||
|
|
||||||
|
for name, enum in meta.enums_walker():
|
||||||
|
if not issubclass(enum, gdef.EnumType):
|
||||||
|
continue
|
||||||
|
for enumvalue in enum.values:
|
||||||
|
if target == enumvalue:
|
||||||
|
print("Enum <{0!r}>".format(enumvalue))
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(prog=__file__)
|
parser = argparse.ArgumentParser(prog=__file__)
|
||||||
parser.add_argument('target', help='The name or value to research in PythonForWindows generated definition')
|
parser.add_argument('target', help='The name or value to research in PythonForWindows generated definition')
|
||||||
res = parser.parse_args()
|
res = parser.parse_args()
|
||||||
|
|||||||
+8
-6
@@ -30,8 +30,11 @@ else:
|
|||||||
assert p.bitness == 64
|
assert p.bitness == 64
|
||||||
return p
|
return p
|
||||||
else:
|
else:
|
||||||
|
# Force creation of AMD64 process on arm system
|
||||||
|
# TODO: also pop an ARM64 process when code works better with it
|
||||||
|
machine = gdef.IMAGE_FILE_MACHINE_AMD64 if windows.system.architecture == gdef.PROCESSOR_ARCHITECTURE_ARM64 else None
|
||||||
def pop_proc_64(dwCreationFlags=DEFAULT_CREATION_FLAGS):
|
def pop_proc_64(dwCreationFlags=DEFAULT_CREATION_FLAGS):
|
||||||
p = windows.utils.create_process(r"C:\Windows\system32\{0}".format(test_binary_name).encode("ascii"), dwCreationFlags=dwCreationFlags, show_windows=True)
|
p = windows.utils.create_process(r"C:\Windows\system32\{0}".format(test_binary_name).encode("ascii"), dwCreationFlags=dwCreationFlags, show_windows=True, machine=machine)
|
||||||
assert p.bitness == 64
|
assert p.bitness == 64
|
||||||
return p
|
return p
|
||||||
|
|
||||||
@@ -44,6 +47,9 @@ def generate_pop_and_exit_fixtures(proc_popers, ids=[], dwCreationFlags=DEFAULT_
|
|||||||
def pop_and_exit_process(request):
|
def pop_and_exit_process(request):
|
||||||
proc_poper = request.param
|
proc_poper = request.param
|
||||||
proc = proc_poper(dwCreationFlags=dwCreationFlags)
|
proc = proc_poper(dwCreationFlags=dwCreationFlags)
|
||||||
|
# Apply manually the xfail marker for a test on x86_on_arm64 for pe64 target (cross-heaven gate)
|
||||||
|
if windows.current_process._is_x86_on_arm64 and proc.bitness == 64:
|
||||||
|
request.applymarker("xfail") # Cross Heaven gate
|
||||||
time.sleep(0.2) # Give time to the process to load :)
|
time.sleep(0.2) # Give time to the process to load :)
|
||||||
print("Created {0} ({1}bits) for test".format(proc, proc.bitness))
|
print("Created {0} ({1}bits) for test".format(proc, proc.bitness))
|
||||||
yield weakref.proxy(proc) # provide the fixture value
|
yield weakref.proxy(proc) # provide the fixture value
|
||||||
@@ -103,16 +109,14 @@ class HandleDebugger(object):
|
|||||||
print(self.handles_types(self.get_new_handle()))
|
print(self.handles_types(self.get_new_handle()))
|
||||||
|
|
||||||
|
|
||||||
current_process_hdebugger = HandleDebugger(windows.current_process.pid)
|
|
||||||
current_process_hdebugger.refresh_handles()
|
|
||||||
|
|
||||||
class NoLeakAssert(AssertionError):
|
class NoLeakAssert(AssertionError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture()
|
@pytest.fixture()
|
||||||
def check_for_handle_leak(request):
|
def check_for_handle_leak(request):
|
||||||
|
current_process_hdebugger = HandleDebugger(windows.current_process.pid)
|
||||||
x = current_process_hdebugger.refresh_handles()
|
x = current_process_hdebugger.refresh_handles()
|
||||||
yield None
|
yield None
|
||||||
leaked_handles = current_process_hdebugger.get_new_handle(x)
|
leaked_handles = current_process_hdebugger.get_new_handle(x)
|
||||||
@@ -161,11 +165,9 @@ def pytest_configure(config):
|
|||||||
@pytest.hookimpl(hookwrapper=True, trylast=True)
|
@pytest.hookimpl(hookwrapper=True, trylast=True)
|
||||||
def pytest_runtest_makereport(item, call):
|
def pytest_runtest_makereport(item, call):
|
||||||
outcome = yield
|
outcome = yield
|
||||||
# print("Make report {0} | {1}".format(item, call))
|
|
||||||
if call.when == "teardown" and call.excinfo and type(call.excinfo.value) == NoLeakAssert:
|
if call.when == "teardown" and call.excinfo and type(call.excinfo.value) == NoLeakAssert:
|
||||||
x = outcome.get_result()
|
x = outcome.get_result()
|
||||||
x.outcome = "failed"
|
x.outcome = "failed"
|
||||||
# import pdb;pdb.set_trace()
|
|
||||||
x.LEAK = call.excinfo.value.args[0]
|
x.LEAK = call.excinfo.value.args[0]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+39
-3
@@ -21,14 +21,36 @@ windows_64bit_only = pytest.mark.skipif(not is_windows_64_bits, reason="Test for
|
|||||||
|
|
||||||
process_32bit_only = pytest.mark.skipif(not is_process_32_bits, reason="Test for 32bits process only")
|
process_32bit_only = pytest.mark.skipif(not is_process_32_bits, reason="Test for 32bits process only")
|
||||||
process_64bit_only = pytest.mark.skipif(not is_process_64_bits, reason="Test for 64bits process only")
|
process_64bit_only = pytest.mark.skipif(not is_process_64_bits, reason="Test for 64bits process only")
|
||||||
process_syswow_only = pytest.mark.skipif(not is_process_syswow, reason="Test for syswow process only")
|
process_syswow_only = pytest.mark.skipif((not is_process_syswow) or windows.current_process._is_x86_on_arm64, reason="Test for syswow process only (ARM64 computer not supported)")
|
||||||
require_admin = pytest.mark.skipif(not is_admin, reason="Test must be launched as admin")
|
require_admin = pytest.mark.skipif(not is_admin, reason="Test must be launched as admin")
|
||||||
|
|
||||||
|
def process_architecture_only(target_archi):
|
||||||
|
return pytest.mark.skipif(windows.current_process.architecture != target_archi,
|
||||||
|
reason="Test for {0} architecture process only".format(target_archi))
|
||||||
|
|
||||||
|
def system_architecture_only(target_archi):
|
||||||
|
return pytest.mark.skipif(windows.system.architecture != target_archi,
|
||||||
|
reason="Test for {0} architecture system only".format(target_archi))
|
||||||
|
|
||||||
|
@pytest.fixture(scope="function")
|
||||||
|
def check_cross_heaven_gate_arm64_xfail(request):
|
||||||
|
"""Mark test crossing the heaven gate as xfail on x86 to arm64"""
|
||||||
|
if windows.current_process._is_x86_on_arm64:
|
||||||
|
request.applymarker("xfail")
|
||||||
|
|
||||||
|
def cross_heaven_gates(tstfunc):
|
||||||
|
tstfunc = pytest.mark.usefixtures("check_cross_heaven_gate_arm64_xfail")(tstfunc)
|
||||||
|
tstfunc = pytest.mark.cross_heaven_gate(tstfunc)
|
||||||
|
return tstfunc
|
||||||
|
|
||||||
check_for_gc_garbage = pytest.mark.usefixtures("check_for_gc_garbage")
|
check_for_gc_garbage = pytest.mark.usefixtures("check_for_gc_garbage")
|
||||||
check_for_handle_leak = pytest.mark.usefixtures("check_for_handle_leak")
|
check_for_handle_leak = pytest.mark.usefixtures("check_for_handle_leak")
|
||||||
|
|
||||||
test_binary_name = "winver.exe"
|
# msiexec.exe is new best choice:
|
||||||
|
# - a real process (looking at calc.exe)
|
||||||
|
# - GUI and wait for a click to close when no param
|
||||||
|
# - Is ARM64CE on arm -> can be exec as AMD64 or ARM64 with `machine`` param
|
||||||
|
test_binary_name = "msiexec.exe"
|
||||||
DEFAULT_CREATION_FLAGS = gdef.CREATE_NEW_CONSOLE
|
DEFAULT_CREATION_FLAGS = gdef.CREATE_NEW_CONSOLE
|
||||||
|
|
||||||
|
|
||||||
@@ -57,8 +79,22 @@ def check_injected_python_installed(request):
|
|||||||
pytest.skip("Python {0}b not installed -> skipping test with python injection into {0}b process".format(proc.bitness))
|
pytest.skip("Python {0}b not installed -> skipping test with python injection into {0}b process".format(proc.bitness))
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def check_dll_injection_target_architecture(request):
|
||||||
|
# Find the process parameter
|
||||||
|
procparams = [argname for argname in request.fixturenames if argname.startswith("proc")]
|
||||||
|
if len(procparams) != 1:
|
||||||
|
raise ValueError("Could not find the fixture name of the injected python")
|
||||||
|
procparam = procparams[0]
|
||||||
|
proc = request.getfixturevalue(procparam)
|
||||||
|
# xfail ARM64 injection as its not implemented
|
||||||
|
if proc.architecture == gdef.IMAGE_FILE_MACHINE_ARM64:
|
||||||
|
request.applymarker("xfail")
|
||||||
|
|
||||||
python_injection = pytest.mark.usefixtures("check_injected_python_installed")
|
|
||||||
|
|
||||||
|
dll_injection = pytest.mark.usefixtures("check_dll_injection_target_architecture", "check_cross_heaven_gate_arm64_xfail")
|
||||||
|
python_injection = pytest.mark.usefixtures("check_dll_injection_target_architecture", "check_injected_python_installed", "check_cross_heaven_gate_arm64_xfail")
|
||||||
|
|
||||||
|
|
||||||
## P2 VS PY3
|
## P2 VS PY3
|
||||||
|
|||||||
+1
-1
@@ -15,7 +15,7 @@ def generate_client_server_test(client_function, server_function):
|
|||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
client_function()
|
client_function()
|
||||||
th.join()
|
th.join()
|
||||||
return True
|
return
|
||||||
return generated_test
|
return generated_test
|
||||||
|
|
||||||
PORT_NAME = r"\RPC Control\PythonForWindowsTestPort"
|
PORT_NAME = r"\RPC Control\PythonForWindowsTestPort"
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
|
import pytest
|
||||||
|
|
||||||
import windows
|
import windows
|
||||||
|
import windows.generated_def as gdef
|
||||||
import windows.native_exec.cpuid
|
import windows.native_exec.cpuid
|
||||||
|
|
||||||
def test_native_exec_cpuid():
|
def test_native_exec_cpuid():
|
||||||
|
if windows.current_process.architecture == gdef.IMAGE_FILE_MACHINE_ARM64:
|
||||||
|
pytest.skip("CPUID not testable on ARM64")
|
||||||
assert windows.native_exec.cpuid.do_cpuid(0)
|
assert windows.native_exec.cpuid.do_cpuid(0)
|
||||||
assert windows.native_exec.cpuid.get_proc_family_model()
|
assert windows.native_exec.cpuid.get_proc_family_model()
|
||||||
@@ -227,7 +227,7 @@ def test_crypt_obj():
|
|||||||
# TODO: Need some better ideas
|
# TODO: Need some better ideas
|
||||||
|
|
||||||
def test_certificate_from_store():
|
def test_certificate_from_store():
|
||||||
return windows.crypto.CertificateStore.from_system_store("Root")
|
assert windows.crypto.CertificateStore.from_system_store("Root")
|
||||||
|
|
||||||
|
|
||||||
def test_sign_verify(rawcert, rawpfx):
|
def test_sign_verify(rawcert, rawpfx):
|
||||||
|
|||||||
@@ -156,6 +156,9 @@ def test_HRESULT_FACILITY_macro():
|
|||||||
# RPC_E_INVALID_HEADER(0x80010111)
|
# RPC_E_INVALID_HEADER(0x80010111)
|
||||||
assert gdef.HRESULT_FACILITY(gdef.RPC_E_INVALID_HEADER) == gdef.FACILITY_RPC == 1
|
assert gdef.HRESULT_FACILITY(gdef.RPC_E_INVALID_HEADER) == gdef.FACILITY_RPC == 1
|
||||||
|
|
||||||
|
def test_ProcThreadAttributeValue_results():
|
||||||
|
assert gdef.PROC_THREAD_ATTRIBUTE_PARENT_PROCESS == 0x20000
|
||||||
|
assert gdef.PROC_THREAD_ATTRIBUTE_MACHINE_TYPE == 0x20019
|
||||||
|
|
||||||
# typedef struct _DnsRecordFlags
|
# typedef struct _DnsRecordFlags
|
||||||
# {
|
# {
|
||||||
|
|||||||
@@ -1,13 +1,16 @@
|
|||||||
import windows
|
import windows
|
||||||
import windows.pipe
|
import windows.pipe
|
||||||
|
|
||||||
|
from .pfwtest import *
|
||||||
|
|
||||||
|
@cross_heaven_gates # windows.system.handles
|
||||||
def test_handle_process_id():
|
def test_handle_process_id():
|
||||||
handle_with_process = [h for h in windows.system.handles if h.dwProcessId]
|
handle_with_process = [h for h in windows.system.handles if h.dwProcessId]
|
||||||
handle = handle_with_process[-1]
|
handle = handle_with_process[-1]
|
||||||
proc = handle.process
|
proc = handle.process
|
||||||
assert proc.pid == handle.dwProcessId == handle.pid
|
assert proc.pid == handle.dwProcessId == handle.pid
|
||||||
|
|
||||||
|
@cross_heaven_gates # windows.current_process.handles
|
||||||
def test_local_handle_type():
|
def test_local_handle_type():
|
||||||
t = windows.current_process.threads[0]
|
t = windows.current_process.threads[0]
|
||||||
th = t.handle
|
th = t.handle
|
||||||
@@ -19,8 +22,8 @@ def test_local_handle_type():
|
|||||||
PIPE_NAME = "PFW_Test_handle_Pipe"
|
PIPE_NAME = "PFW_Test_handle_Pipe"
|
||||||
TEST_FILE_FOR_HANDLE = r"C:\Windows\explorer.exe"
|
TEST_FILE_FOR_HANDLE = r"C:\Windows\explorer.exe"
|
||||||
|
|
||||||
|
@python_injection
|
||||||
def test_remote_handle_type_and_name(proc32_64):
|
def test_remote_handle_type_and_name(proc32_64):
|
||||||
# tmpfile
|
|
||||||
proc32_64.execute_python("import windows; import windows.pipe")
|
proc32_64.execute_python("import windows; import windows.pipe")
|
||||||
# A filename that a normal process should not have a handle on (to be sur)
|
# A filename that a normal process should not have a handle on (to be sur)
|
||||||
proc32_64.execute_python(r"""f = open(r"{filename}")""".format(filename=TEST_FILE_FOR_HANDLE))
|
proc32_64.execute_python(r"""f = open(r"{filename}")""".format(filename=TEST_FILE_FOR_HANDLE))
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import windows
|
|||||||
import windows.generated_def as gdef
|
import windows.generated_def as gdef
|
||||||
|
|
||||||
from .conftest import pop_proc_32, pop_proc_64
|
from .conftest import pop_proc_32, pop_proc_64
|
||||||
from .pfwtest import DEFAULT_CREATION_FLAGS
|
from .pfwtest import *
|
||||||
|
|
||||||
@pytest.fixture(params=
|
@pytest.fixture(params=
|
||||||
[(pop_proc_32, DEFAULT_CREATION_FLAGS),
|
[(pop_proc_32, DEFAULT_CREATION_FLAGS),
|
||||||
@@ -34,17 +34,20 @@ def proc_3264_runsus(request):
|
|||||||
del proc
|
del proc
|
||||||
|
|
||||||
# Its really the same test as test_process.test_load_library but with suspended process as well
|
# Its really the same test as test_process.test_load_library but with suspended process as well
|
||||||
|
@dll_injection
|
||||||
def test_dll_injection(proc_3264_runsus):
|
def test_dll_injection(proc_3264_runsus):
|
||||||
assert (not proc_3264_runsus.peb.Ldr) or ("wintrust.dll" not in [mod.name for mod in proc_3264_runsus.peb.modules])
|
assert (not proc_3264_runsus.peb.Ldr) or ("wintrust.dll" not in [mod.name for mod in proc_3264_runsus.peb.modules])
|
||||||
modaddr = windows.injection.load_dll_in_remote_process(proc_3264_runsus, "wintrust.dll")
|
modaddr = windows.injection.load_dll_in_remote_process(proc_3264_runsus, "wintrust.dll")
|
||||||
wintrustmod = [mod for mod in proc_3264_runsus.peb.modules if mod.name == "wintrust.dll"][0]
|
wintrustmod = [mod for mod in proc_3264_runsus.peb.modules if mod.name == "wintrust.dll"][0]
|
||||||
assert wintrustmod.baseaddr == modaddr
|
assert wintrustmod.baseaddr == modaddr
|
||||||
|
|
||||||
|
@dll_injection
|
||||||
def test_dll_injection_error_reporting(proc_3264_runsus):
|
def test_dll_injection_error_reporting(proc_3264_runsus):
|
||||||
with pytest.raises(windows.injection.InjectionFailedError) as excinfo:
|
with pytest.raises(windows.injection.InjectionFailedError) as excinfo:
|
||||||
windows.injection.load_dll_in_remote_process(proc_3264_runsus, "NO_A_DLL.dll")
|
windows.injection.load_dll_in_remote_process(proc_3264_runsus, "NO_A_DLL.dll")
|
||||||
assert excinfo.value.__cause__.winerror == gdef.ERROR_MOD_NOT_FOUND
|
assert excinfo.value.__cause__.winerror == gdef.ERROR_MOD_NOT_FOUND
|
||||||
|
|
||||||
|
@dll_injection
|
||||||
def test_dll_injection_access_denied(proc_3264_runsus, tmpdir):
|
def test_dll_injection_access_denied(proc_3264_runsus, tmpdir):
|
||||||
"""Emulate injection of MsStore python, were its DLL are not executable by any other append
|
"""Emulate injection of MsStore python, were its DLL are not executable by any other append
|
||||||
See: https://github.com/hakril/PythonForWindows/issues/72
|
See: https://github.com/hakril/PythonForWindows/issues/72
|
||||||
|
|||||||
@@ -8,21 +8,23 @@ from windows.pycompat import basestring, int_types
|
|||||||
|
|
||||||
from .pfwtest import *
|
from .pfwtest import *
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@check_for_gc_garbage
|
@check_for_gc_garbage
|
||||||
class TestNativeUtils(object):
|
class TestNativeUtils(object):
|
||||||
@process_64bit_only
|
@process_architecture_only(gdef.IMAGE_FILE_MACHINE_AMD64)
|
||||||
def test_strlenw64(self):
|
def test_strlenw64(self):
|
||||||
strlenw64 = windows.native_exec.create_function(nativeutils.StrlenW64.get_code(), [gdef.UINT, gdef.LPCWSTR])
|
strlenw64 = windows.native_exec.create_function(nativeutils.StrlenW64.get_code(), [gdef.UINT, gdef.LPCWSTR])
|
||||||
assert strlenw64("YOLO") == 4
|
assert strlenw64("YOLO") == 4
|
||||||
assert strlenw64("") == 0
|
assert strlenw64("") == 0
|
||||||
|
|
||||||
@process_64bit_only
|
@process_architecture_only(gdef.IMAGE_FILE_MACHINE_AMD64)
|
||||||
def test_strlena64(self):
|
def test_strlena64(self):
|
||||||
strlena64 = windows.native_exec.create_function(nativeutils.StrlenA64.get_code(), [gdef.UINT, gdef.LPCSTR])
|
strlena64 = windows.native_exec.create_function(nativeutils.StrlenA64.get_code(), [gdef.UINT, gdef.LPCSTR])
|
||||||
assert strlena64(b"YOLO") == 4
|
assert strlena64(b"YOLO") == 4
|
||||||
assert strlena64(b"") == 0
|
assert strlena64(b"") == 0
|
||||||
|
|
||||||
@process_64bit_only
|
@process_architecture_only(gdef.IMAGE_FILE_MACHINE_AMD64)
|
||||||
def test_getprocaddr64(self):
|
def test_getprocaddr64(self):
|
||||||
getprocaddr64 = windows.native_exec.create_function(nativeutils.GetProcAddress64.get_code(), [gdef.ULONG64, gdef.LPCWSTR, gdef.LPCSTR])
|
getprocaddr64 = windows.native_exec.create_function(nativeutils.GetProcAddress64.get_code(), [gdef.ULONG64, gdef.LPCWSTR, gdef.LPCSTR])
|
||||||
k32 = [mod for mod in windows.current_process.peb.modules if mod.name == "kernel32.dll"][0]
|
k32 = [mod for mod in windows.current_process.peb.modules if mod.name == "kernel32.dll"][0]
|
||||||
@@ -37,19 +39,19 @@ class TestNativeUtils(object):
|
|||||||
assert getprocaddr64("YOLO.DLL", b"whatever") == 0xfffffffffffffffe
|
assert getprocaddr64("YOLO.DLL", b"whatever") == 0xfffffffffffffffe
|
||||||
assert getprocaddr64("KERNEL32.DLL", b"YOLOAPI") == 0xffffffffffffffff
|
assert getprocaddr64("KERNEL32.DLL", b"YOLOAPI") == 0xffffffffffffffff
|
||||||
|
|
||||||
@process_32bit_only
|
@process_architecture_only(gdef.IMAGE_FILE_MACHINE_I386)
|
||||||
def test_strlenw32(self):
|
def test_strlenw32(self):
|
||||||
strlenw32 = windows.native_exec.create_function(nativeutils.StrlenW32.get_code(), [gdef.UINT, gdef.LPCWSTR])
|
strlenw32 = windows.native_exec.create_function(nativeutils.StrlenW32.get_code(), [gdef.UINT, gdef.LPCWSTR])
|
||||||
assert strlenw32("YOLO") == 4
|
assert strlenw32("YOLO") == 4
|
||||||
assert strlenw32("") == 0
|
assert strlenw32("") == 0
|
||||||
|
|
||||||
@process_32bit_only
|
@process_architecture_only(gdef.IMAGE_FILE_MACHINE_I386)
|
||||||
def test_strlena32(self):
|
def test_strlena32(self):
|
||||||
strlena32 = windows.native_exec.create_function(nativeutils.StrlenA32.get_code(), [gdef.UINT, gdef.LPCSTR])
|
strlena32 = windows.native_exec.create_function(nativeutils.StrlenA32.get_code(), [gdef.UINT, gdef.LPCSTR])
|
||||||
assert strlena32(b"YOLO") == 4
|
assert strlena32(b"YOLO") == 4
|
||||||
assert strlena32(b"") == 0
|
assert strlena32(b"") == 0
|
||||||
|
|
||||||
@process_32bit_only
|
@process_architecture_only(gdef.IMAGE_FILE_MACHINE_I386)
|
||||||
def test_getprocaddr32(self):
|
def test_getprocaddr32(self):
|
||||||
getprocaddr32 = windows.native_exec.create_function(nativeutils.GetProcAddress32.get_code(), [gdef.UINT, gdef.LPCWSTR, gdef.LPCSTR])
|
getprocaddr32 = windows.native_exec.create_function(nativeutils.GetProcAddress32.get_code(), [gdef.UINT, gdef.LPCWSTR, gdef.LPCSTR])
|
||||||
k32 = [mod for mod in windows.current_process.peb.modules if mod.name == "kernel32.dll"][0]
|
k32 = [mod for mod in windows.current_process.peb.modules if mod.name == "kernel32.dll"][0]
|
||||||
|
|||||||
+38
-8
@@ -9,15 +9,26 @@ from .pfwtest import *
|
|||||||
|
|
||||||
@pytest.fixture(params=[None, pop_proc_32, pop_proc_64], ids=["local-pe", "remote-pe32", "remote-pe64"])
|
@pytest.fixture(params=[None, pop_proc_32, pop_proc_64], ids=["local-pe", "remote-pe32", "remote-pe64"])
|
||||||
def pe(request):
|
def pe(request):
|
||||||
# Pe will be kernelbase.dll
|
# Pe will be kernelbase.dll or kernel32.dll
|
||||||
|
# Cannot hardcode peb.modules[2] as it may be xtajitX.dll on arm64
|
||||||
if request.param is None:
|
if request.param is None:
|
||||||
yield windows.current_process.peb.modules[2].pe
|
yield [mod for mod in windows.current_process.peb.modules if mod.name.lower().startswith("kernel")][0].pe
|
||||||
return
|
return
|
||||||
|
|
||||||
pop_proc = request.param
|
pop_proc = request.param
|
||||||
proc = pop_proc()
|
proc = pop_proc()
|
||||||
time.sleep(0.01)
|
|
||||||
yield proc.peb.modules[2].pe
|
for i in range(10):
|
||||||
|
try:
|
||||||
|
time.sleep(0.1)
|
||||||
|
# Pe will be kernelbase.dll or kernel32.dll
|
||||||
|
yield [mod for mod in windows.current_process.peb.modules if mod.name.lower().startswith("kernel")][0].pe
|
||||||
|
break
|
||||||
|
except ValueError:
|
||||||
|
if i == 9:
|
||||||
|
# Last change failed
|
||||||
|
raise
|
||||||
|
continue # PEB.Ldr not ready yet
|
||||||
proc.exit(0)
|
proc.exit(0)
|
||||||
|
|
||||||
PE_DOTNET32_DLL_NAME = "test_pe_dotnet32.dll"
|
PE_DOTNET32_DLL_NAME = "test_pe_dotnet32.dll"
|
||||||
@@ -83,10 +94,7 @@ def test_pe_parsing_strange_optional_header_size(tmp_path, proc32):
|
|||||||
# Also check that section retrieval works (as its position is based on OptionalHeader Size)
|
# Also check that section retrieval works (as its position is based on OptionalHeader Size)
|
||||||
assert set(s.name for s in mod.pe.sections) == {".text", ".data", ".l1"}
|
assert set(s.name for s in mod.pe.sections) == {".text", ".data", ".l1"}
|
||||||
|
|
||||||
|
@dll_injection
|
||||||
|
|
||||||
|
|
||||||
# Make a test from current_process parsing ?
|
|
||||||
def test_pe_parsing_dotnet32_process_64(proc64, pe_dotnet32):
|
def test_pe_parsing_dotnet32_process_64(proc64, pe_dotnet32):
|
||||||
# .NET pe32 loadable in 64bit process -> rewrite of the OptionalHeader
|
# .NET pe32 loadable in 64bit process -> rewrite of the OptionalHeader
|
||||||
mod = proc64.load_library(pe_dotnet32)
|
mod = proc64.load_library(pe_dotnet32)
|
||||||
@@ -103,6 +111,7 @@ def test_pe_parsing_dotnet32_process_64(proc64, pe_dotnet32):
|
|||||||
assert mod.pe.sections
|
assert mod.pe.sections
|
||||||
assert ".text" in set(s.name for s in mod.pe.sections)
|
assert ".text" in set(s.name for s in mod.pe.sections)
|
||||||
|
|
||||||
|
@dll_injection
|
||||||
def test_pe_parsing_dotnet32_current_process_64(proc64, pe_dotnet32):
|
def test_pe_parsing_dotnet32_current_process_64(proc64, pe_dotnet32):
|
||||||
# .NET pe32 loadable in 64bit process -> rewrite of the OptionalHeader
|
# .NET pe32 loadable in 64bit process -> rewrite of the OptionalHeader
|
||||||
# So we injecte python code in a the remote proc64 to test the parsing from itself
|
# So we injecte python code in a the remote proc64 to test the parsing from itself
|
||||||
@@ -118,6 +127,27 @@ def test_pe_parsing_dotnet32_current_process_64(proc64, pe_dotnet32):
|
|||||||
assert imported_dlls == ['mscoree.dll']
|
assert imported_dlls == ['mscoree.dll']
|
||||||
assert ".text" in sections_names
|
assert ".text" in sections_names
|
||||||
|
|
||||||
|
# PE header of Syschpe32\ntdll.dll with a 8 chars sections .hexpthk that broke the parseur
|
||||||
|
# This PE as 8 bytes sections name + VirtualSize non aligned on 0x100 so there is a non-null non-ascii byte after the name
|
||||||
|
PE_SECTION_8CHARS = b"""
|
||||||
|
eJzzjZrAwMzAwMACxP//MzDsYIAABwbC4AMRagYbCHBlYPBhZEYRu8HAxMjNyMnAwMQAwSAgAMUK
|
||||||
|
II4DhA2UY4VKw2hwQLFAmBBTFSBqQYQAwig4MECyg4ogAGiuMRZxvQgIuMDIAPcDAxuqGgUGhgS9
|
||||||
|
SAjQhgqA1XGgqnNgYDigFwUBYHmYX7gwzHtAmW9GwSgYBfQAnU8b3zAAy4aMr/+BQNTGwIGht0aF
|
||||||
|
IwMkF54BKg0yGBQcGAL+izoApTrfHJ4wvMAAB/+AA4/UnJx8hfL8opwUhbSi/FyFRIWAypKM/Dy3
|
||||||
|
/KLwzLyU/PJihZLU4hIFUMU5CoYd0DBAsJuAbBsD7OpA7YsEIM4B4goD3GIMDO6pJcElKR6JeSk5
|
||||||
|
qSB+eFFmSapbJpgTlJqYAmUyAFOXa0VqMkN2alFeao6xkV5KTg6NPDkKcAIAM7/CEw=="""
|
||||||
|
|
||||||
|
def test_pe_parsing_section_8_chars(proc32, tmp_path):
|
||||||
|
pe_path = (tmp_path / "pe_parsing_8chars_section.exe")
|
||||||
|
pe_data = pe_data = zlib.decompress(b64decode(PE_SECTION_8CHARS))
|
||||||
|
|
||||||
|
with pe_path.open("wb") as f:
|
||||||
|
f.write(pe_data)
|
||||||
|
|
||||||
|
mod = proc32.load_library(str(pe_path))
|
||||||
|
# check that section retrieval works
|
||||||
|
assert set(s.name for s in mod.pe.sections) == {u".XXXXXXX", u".YYYYYYY", u".ZZZZZZZ"}
|
||||||
|
|
||||||
# A "Portable Executable 32 .NET Assembly" DLL
|
# A "Portable Executable 32 .NET Assembly" DLL
|
||||||
# Result of compiling a simple hello-world
|
# Result of compiling a simple hello-world
|
||||||
# Can be loaded into a 64b process to witness 32 -> 64b PE conversion at load time
|
# Can be loaded into a 64b process to witness 32 -> 64b PE conversion at load time
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ with windows.pipe.create("{pipe}") as np:
|
|||||||
|
|
||||||
@python_injection
|
@python_injection
|
||||||
def test_pipe_echo_server(proc32_64):
|
def test_pipe_echo_server(proc32_64):
|
||||||
|
# Verify that injection / load of Pfw in remote works with a first safe stub
|
||||||
|
proc32_64.execute_python("import windows")
|
||||||
t = proc32_64.execute_python_unsafe(rcode_test_echo_pipe.format(pipe=PIPE_NAME))
|
t = proc32_64.execute_python_unsafe(rcode_test_echo_pipe.format(pipe=PIPE_NAME))
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
assert not t.is_exit
|
assert not t.is_exit
|
||||||
@@ -45,6 +47,8 @@ def test_pipe_echo_server(proc32_64):
|
|||||||
|
|
||||||
@python_injection
|
@python_injection
|
||||||
def test_pipe_recv_object(proc32_64):
|
def test_pipe_recv_object(proc32_64):
|
||||||
|
# Verify that injection / load of Pfw in remote works with a first safe stub
|
||||||
|
proc32_64.execute_python("import windows")
|
||||||
# not the good way to do the exchange (race possible)
|
# not the good way to do the exchange (race possible)
|
||||||
# Just for the sake of the test
|
# Just for the sake of the test
|
||||||
proc32_64.execute_python_unsafe(rcode_test_ipc_pipe.format(pipe=PIPE_NAME))
|
proc32_64.execute_python_unsafe(rcode_test_ipc_pipe.format(pipe=PIPE_NAME))
|
||||||
|
|||||||
+12
-2
@@ -25,7 +25,7 @@ class TestCurrentProcessWithCheckGarbage(object):
|
|||||||
assert myself.ppid == windows.current_process.ppid
|
assert myself.ppid == windows.current_process.ppid
|
||||||
|
|
||||||
def test_get_current_process_peb(self):
|
def test_get_current_process_peb(self):
|
||||||
return windows.current_process.peb
|
assert windows.current_process.peb
|
||||||
|
|
||||||
def test_get_current_process_modules(self):
|
def test_get_current_process_modules(self):
|
||||||
# Use module filename because this executable can be:
|
# Use module filename because this executable can be:
|
||||||
@@ -195,6 +195,7 @@ class TestProcessWithCheckGarbage(object):
|
|||||||
|
|
||||||
@windows_64bit_only
|
@windows_64bit_only
|
||||||
def test_execute_to_64(self, proc64):
|
def test_execute_to_64(self, proc64):
|
||||||
|
assert proc64.architecture == gdef.IMAGE_FILE_MACHINE_AMD64, "TODO: better machine fixture for ARM64"
|
||||||
with proc64.allocated_memory(0x1000) as addr:
|
with proc64.allocated_memory(0x1000) as addr:
|
||||||
shellcode = x64.MultipleInstr()
|
shellcode = x64.MultipleInstr()
|
||||||
shellcode += x64.Mov('RAX', 0x4242424243434343)
|
shellcode += x64.Mov('RAX', 0x4242424243434343)
|
||||||
@@ -213,6 +214,7 @@ class TestProcessWithCheckGarbage(object):
|
|||||||
dword = proc32_64.read_dword(addr)
|
dword = proc32_64.read_dword(addr)
|
||||||
assert dword == 0x42424242
|
assert dword == 0x42424242
|
||||||
|
|
||||||
|
@python_injection
|
||||||
def test_execute_python_good_version(self, proc32_64):
|
def test_execute_python_good_version(self, proc32_64):
|
||||||
PIPE_NAME = "PFW_TEST_Pipe"
|
PIPE_NAME = "PFW_TEST_Pipe"
|
||||||
rcode = r"""import sys; import windows; import windows.pipe; windows.pipe.send_object("{pipe}", list(sys.version_info))"""
|
rcode = r"""import sys; import windows; import windows.pipe; windows.pipe.send_object("{pipe}", list(sys.version_info))"""
|
||||||
@@ -292,6 +294,7 @@ class TestProcessWithCheckGarbage(object):
|
|||||||
# Check the RemotePythonError contains the remote exception text
|
# Check the RemotePythonError contains the remote exception text
|
||||||
assert b"ValueError: EXCEPTION_MESSAGE" in ar.value.args[0]
|
assert b"ValueError: EXCEPTION_MESSAGE" in ar.value.args[0]
|
||||||
|
|
||||||
|
@python_injection
|
||||||
def test_execute_python_create_console(self, proc32_64):
|
def test_execute_python_create_console(self, proc32_64):
|
||||||
res = proc32_64.execute_python("import windows; windows.utils.create_console()")
|
res = proc32_64.execute_python("import windows; windows.utils.create_console()")
|
||||||
|
|
||||||
@@ -351,6 +354,7 @@ class TestProcessWithCheckGarbage(object):
|
|||||||
|
|
||||||
@windows_64bit_only
|
@windows_64bit_only
|
||||||
def test_set_thread_context_64(self, proc64):
|
def test_set_thread_context_64(self, proc64):
|
||||||
|
assert proc64.architecture == gdef.IMAGE_FILE_MACHINE_AMD64, "TODO: better machine fixture for ARM64"
|
||||||
code = x64.MultipleInstr()
|
code = x64.MultipleInstr()
|
||||||
code += x64.Label(":LOOP")
|
code += x64.Label(":LOOP")
|
||||||
code += x64.Jmp(":LOOP")
|
code += x64.Jmp(":LOOP")
|
||||||
@@ -368,17 +372,19 @@ class TestProcessWithCheckGarbage(object):
|
|||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
assert t.exit_code == 0x11223344
|
assert t.exit_code == 0x11223344
|
||||||
|
|
||||||
|
@dll_injection
|
||||||
def test_load_library(self, proc32_64):
|
def test_load_library(self, proc32_64):
|
||||||
DLL = "wintrust.dll"
|
DLL = "wintrust.dll"
|
||||||
proc32_64.load_library(DLL)
|
proc32_64.load_library(DLL)
|
||||||
assert DLL in [m.name for m in proc32_64.peb.modules]
|
assert DLL in [m.name for m in proc32_64.peb.modules]
|
||||||
|
|
||||||
|
@dll_injection
|
||||||
def test_load_library_suspended(self, proc32_64_suspended):
|
def test_load_library_suspended(self, proc32_64_suspended):
|
||||||
DLL = "wintrust.dll"
|
DLL = "wintrust.dll"
|
||||||
proc32_64_suspended.load_library(DLL)
|
proc32_64_suspended.load_library(DLL)
|
||||||
assert DLL in [m.name for m in proc32_64_suspended.peb.modules]
|
assert DLL in [m.name for m in proc32_64_suspended.peb.modules]
|
||||||
|
|
||||||
|
@dll_injection
|
||||||
def test_load_library_unicode_name(self, proc32_64, tmpdir):
|
def test_load_library_unicode_name(self, proc32_64, tmpdir):
|
||||||
mybitness = windows.current_process.bitness
|
mybitness = windows.current_process.bitness
|
||||||
UNICODE_FILENAME = u'\u4e2d\u56fd\u94f6\u884c\u7f51\u94f6\u52a9\u624b.dll'
|
UNICODE_FILENAME = u'\u4e2d\u56fd\u94f6\u884c\u7f51\u94f6\u52a9\u624b.dll'
|
||||||
@@ -481,10 +487,12 @@ class TestProcessWithCheckGarbage(object):
|
|||||||
# Check type of teb.peb is the correct subclass (with modules & co)
|
# Check type of teb.peb is the correct subclass (with modules & co)
|
||||||
assert teb.peb.modules
|
assert teb.peb.modules
|
||||||
|
|
||||||
|
@cross_heaven_gates
|
||||||
def test_thread_teb_base(self, proc32_64):
|
def test_thread_teb_base(self, proc32_64):
|
||||||
t = proc32_64.threads[0]
|
t = proc32_64.threads[0]
|
||||||
assert t.teb_base != 0
|
assert t.teb_base != 0
|
||||||
|
|
||||||
|
@cross_heaven_gates
|
||||||
def test_teb(self, proc32_64):
|
def test_teb(self, proc32_64):
|
||||||
teb = proc32_64.threads[0].teb
|
teb = proc32_64.threads[0].teb
|
||||||
if proc32_64.bitness == 32:
|
if proc32_64.bitness == 32:
|
||||||
@@ -497,6 +505,7 @@ class TestProcessWithCheckGarbage(object):
|
|||||||
assert teb.peb.modules
|
assert teb.peb.modules
|
||||||
|
|
||||||
@windows_64bit_only
|
@windows_64bit_only
|
||||||
|
@cross_heaven_gates
|
||||||
def test_thread_teb_syswow_base(self, proc32):
|
def test_thread_teb_syswow_base(self, proc32):
|
||||||
t = proc32.threads[0]
|
t = proc32.threads[0]
|
||||||
assert t.teb_base != 0
|
assert t.teb_base != 0
|
||||||
@@ -504,6 +513,7 @@ class TestProcessWithCheckGarbage(object):
|
|||||||
assert t.teb_base == t.teb_syswow_base + 0x2000
|
assert t.teb_base == t.teb_syswow_base + 0x2000
|
||||||
|
|
||||||
@windows_64bit_only
|
@windows_64bit_only
|
||||||
|
@cross_heaven_gates
|
||||||
def test_thread_teb_syswow(self, proc32):
|
def test_thread_teb_syswow(self, proc32):
|
||||||
teb_syswow = proc32.threads[0].teb_syswow
|
teb_syswow = proc32.threads[0].teb_syswow
|
||||||
assert type(teb_syswow) == windows.winobject.process.RemoteTEB64
|
assert type(teb_syswow) == windows.winobject.process.RemoteTEB64
|
||||||
|
|||||||
@@ -0,0 +1,211 @@
|
|||||||
|
try:
|
||||||
|
import capstone
|
||||||
|
except ImportError as e:
|
||||||
|
capstone = None
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
import windows.native_exec.simple_arm64 as arm64
|
||||||
|
from windows.native_exec.simple_arm64 import *
|
||||||
|
|
||||||
|
from windows.pycompat import int_types
|
||||||
|
|
||||||
|
if capstone:
|
||||||
|
disassembleur = capstone.Cs(capstone.CS_ARCH_ARM64, capstone.CS_MODE_ARM)
|
||||||
|
disassembleur.detail = True
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def need_capstone():
|
||||||
|
if capstone is None:
|
||||||
|
raise pytest.skip("Capstone is not installed")
|
||||||
|
return True
|
||||||
|
|
||||||
|
pytestmark = pytest.mark.usefixtures("need_capstone")
|
||||||
|
|
||||||
|
|
||||||
|
def disas(x):
|
||||||
|
return list(disassembleur.disasm(x, 0))
|
||||||
|
|
||||||
|
|
||||||
|
class CheckInstr(object):
|
||||||
|
def __init__(self, instr_to_test, expected_result=None, immediat_accepted=None, must_fail=None, debug=False):
|
||||||
|
self.instr_to_test = instr_to_test
|
||||||
|
self.immediat_accepted = immediat_accepted
|
||||||
|
self.expected_result = expected_result
|
||||||
|
self.must_fail = must_fail
|
||||||
|
self.debug = debug
|
||||||
|
self.callargs = None
|
||||||
|
|
||||||
|
|
||||||
|
def __call__(self, *args):
|
||||||
|
assert args is not None
|
||||||
|
self.callargs = args
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
if self.must_fail:
|
||||||
|
return "MustFail:{0}{1}".format(self.instr_to_test.__name__, self.callargs)
|
||||||
|
return "{0}{1}".format(self.instr_to_test.__name__, self.callargs)
|
||||||
|
|
||||||
|
def dotest(self):
|
||||||
|
assert self.callargs is not None
|
||||||
|
args = self.callargs
|
||||||
|
try:
|
||||||
|
if self.debug:
|
||||||
|
import pdb;pdb.set_trace()
|
||||||
|
pdb.DONE = True
|
||||||
|
arm64.DEBUG = self.debug
|
||||||
|
res = bytes(self.instr_to_test(*args).get_code())
|
||||||
|
if self.debug:
|
||||||
|
print(repr(res))
|
||||||
|
except ValueError as e:
|
||||||
|
if self.must_fail == True:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
raise
|
||||||
|
else:
|
||||||
|
if self.must_fail:
|
||||||
|
raise ValueError("Instruction did not failed as expected")
|
||||||
|
capres_list = disas(res)
|
||||||
|
if not capres_list:
|
||||||
|
raise AssertionError("Trying to disas an instruction resulted no disassembled instr")
|
||||||
|
if len(capres_list) != 1:
|
||||||
|
raise AssertionError("Trying to disas an instruction resulted in multiple disassembled instrs: {0}".format(capres_list))
|
||||||
|
capres = capres_list[0]
|
||||||
|
print("{0} {1}".format(capres.mnemonic, capres.op_str))
|
||||||
|
if self.expected_result is not None:
|
||||||
|
if "{0} {1}".format(capres.mnemonic, capres.op_str).strip() == self.expected_result:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
raise AssertionError("Expected result <{0}> got <{1}>".format(self.expected_result, "{0} {1}".format(capres.mnemonic, capres.op_str)))
|
||||||
|
if len(res) != len(capres.bytes):
|
||||||
|
print("<{0}> vs <{1}>".format(repr(res), repr(capres.bytes)))
|
||||||
|
raise AssertionError("Not all bytes have been used by the disassembler")
|
||||||
|
self.compare_mnemo(capres)
|
||||||
|
self.compare_args(args, capres)
|
||||||
|
return True
|
||||||
|
|
||||||
|
def compare_mnemo(self, capres):
|
||||||
|
expected = self.instr_to_test.__name__.lower()
|
||||||
|
if expected != capres.mnemonic:
|
||||||
|
raise AssertionError("Expected menmo {0} got {1}".format(expected, str(capres.mnemonic)))
|
||||||
|
return True
|
||||||
|
|
||||||
|
def compare_args(self, args, capres):
|
||||||
|
capres_op = list(capres.operands)
|
||||||
|
# We may have != number of operand as shift are:
|
||||||
|
# - arguments for simple_arm64
|
||||||
|
# - atribute of immediat for capstone
|
||||||
|
if not len(capres_op) <= len(args):
|
||||||
|
raise AssertionError("Expected at most {0} operands got {1}".format(len(args), len(capres_op)))
|
||||||
|
|
||||||
|
opargit = iter(args) # allow manually using next() to get next simple_arm64 arg for shift compare
|
||||||
|
# capres_op must be first in zip (as its smaller) or last next(opargit) will be consommed by zip
|
||||||
|
for cap_op, op_args in zip(capres_op, opargit):
|
||||||
|
if isinstance(op_args, str): # Register
|
||||||
|
if cap_op.type != capstone.arm64.ARM64_OP_REG:
|
||||||
|
raise AssertionError("Expected args {0} operands got {1}".format(op_args, capres_op))
|
||||||
|
if op_args.lower() != capres.reg_name(cap_op.reg).lower():
|
||||||
|
raise AssertionError("Expected register <{0}> got {1}".format(op_args.lower(), capres.reg_name(cap_op.reg).lower()))
|
||||||
|
elif isinstance(op_args, int_types):
|
||||||
|
if (op_args != cap_op.imm) and not (self.immediat_accepted and self.immediat_accepted == cap_op.imm):
|
||||||
|
raise AssertionError("Expected Immediat <{0}> got {1}".format(op_args, cap_op.imm))
|
||||||
|
cap_shift = cap_op.shift
|
||||||
|
if not (cap_shift.type == cap_shift.value == 0):
|
||||||
|
self.compare_shift(next(opargit), cap_shift)
|
||||||
|
else:
|
||||||
|
raise ValueError("Unknow argument {0} of type {1}".format(op_args, type(op_args)))
|
||||||
|
|
||||||
|
# Check that no argument were unused in args
|
||||||
|
# As args + shift should perfectly match the capres_op
|
||||||
|
sentinel = object()
|
||||||
|
nextarg = next(opargit, sentinel)
|
||||||
|
if nextarg != sentinel:
|
||||||
|
# Ignore a leading LSL #0 shift, as it should be authorized but not displayed by disassembler
|
||||||
|
shift = Shift.parse(nextarg)
|
||||||
|
if not (shift.type == "LSL" and shift.value == 0):
|
||||||
|
raise ValueError("Non consomated argument: {0} (probable non-encoded shift)".format(nextarg))
|
||||||
|
|
||||||
|
if capstone:
|
||||||
|
SHIFT_TYPE_TO_CAPSTONE = {
|
||||||
|
"LSL": capstone.arm64.ARM64_SFT_LSL,
|
||||||
|
"LSR": capstone.arm64.ARM64_SFT_LSR,
|
||||||
|
"ASR": capstone.arm64.ARM64_SFT_ASR,
|
||||||
|
"ROR": capstone.arm64.ARM64_SFT_ROR,
|
||||||
|
# "MSL": apstone.arm64.ARM64_SFT_MSL # Not yet used in PFW
|
||||||
|
}
|
||||||
|
|
||||||
|
def compare_shift(self, shiftstr, cap_shift):
|
||||||
|
shift = Shift.parse(shiftstr)
|
||||||
|
if not self.SHIFT_TYPE_TO_CAPSTONE[shift.type] == cap_shift.type:
|
||||||
|
raise ValueError("Shift type mismatch: expected {0} got {1}".format(shift.type, cap_shift.type))
|
||||||
|
if not shift.value == cap_shift.value:
|
||||||
|
raise ValueError("Shift value mismatch: expected {0} got {1}".format(shift.value, cap_shift.value))
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def test_shift_parsing():
|
||||||
|
assert Shift.parse("LSL #0")
|
||||||
|
assert Shift.parse("LSL #12")
|
||||||
|
assert Shift.parse("LSL #1")
|
||||||
|
assert Shift.parse("LSR #1")
|
||||||
|
|
||||||
|
assert Shift.parse("ROR #0").type == "ROR"
|
||||||
|
assert Shift.parse("LSL #0").type == "LSL"
|
||||||
|
assert Shift.parse("LSL #0").value == 0
|
||||||
|
assert Shift.parse("LSL #1").type == "LSL"
|
||||||
|
assert Shift.parse("LSL #1").value == 1
|
||||||
|
|
||||||
|
assert not Shift.parse("LSX #1")
|
||||||
|
assert not Shift.parse("LSX ##1")
|
||||||
|
assert not Shift.parse("LSX #")
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("checkinstr", [
|
||||||
|
CheckInstr(Add)('W0', 'W0', 0),
|
||||||
|
CheckInstr(Add)('W1', 'W0', 0),
|
||||||
|
CheckInstr(Add)('W30', 'W12', 0),
|
||||||
|
CheckInstr(Add)('W0', 'W0', 1),
|
||||||
|
CheckInstr(Add)('X0', 'X0', 0),
|
||||||
|
CheckInstr(Add)('X30', 'X12', 0),
|
||||||
|
CheckInstr(Add)('X0', 'X0', 1),
|
||||||
|
CheckInstr(Add)('X11', 'X12', 0x123),
|
||||||
|
CheckInstr(Add)('X11', 'X12', 0x123, "LSL #0"),
|
||||||
|
CheckInstr(Add)('X11', 'X12', 0x123, "LSL #12"),
|
||||||
|
CheckInstr(Add, must_fail=True)('X11', 'W12', 0x123), # Bitness mismatch
|
||||||
|
CheckInstr(Add, must_fail=True)('BADREG', 'X12', 0),
|
||||||
|
CheckInstr(Add, must_fail=True)('X11', 'X12', 0x123, "LSL #1234"),
|
||||||
|
CheckInstr(Add, must_fail=True)('X11', 'X12', 0x12345678),
|
||||||
|
|
||||||
|
CheckInstr(Movz)('X0', 0),
|
||||||
|
CheckInstr(Movz)('X0', 0, "LSL #32"),
|
||||||
|
CheckInstr(Movz)('X18', 0, "LSL #48"),
|
||||||
|
CheckInstr(Movz)('W18', 0, "LSL #16"),
|
||||||
|
CheckInstr(Movz, must_fail=True)('X0', 0, "LSL #12"), # Invalid LSL for MovWideImmediat
|
||||||
|
CheckInstr(Movz, must_fail=True)('W0', 0, "LSL #32"),
|
||||||
|
CheckInstr(Movz, must_fail=True)('X0', 0, "ROR #32"),
|
||||||
|
|
||||||
|
|
||||||
|
CheckInstr(Orr)('X0', 'X18', 'XZR'),
|
||||||
|
# Official encoding for this in ARM64 ref
|
||||||
|
CheckInstr(Orr, expected_result="mov x0, x18")('X0', 'XZR', 'X18'),
|
||||||
|
CheckInstr(Orr, must_fail=True)('X0', 'WZR', 'X18'), # Size mismatch
|
||||||
|
CheckInstr(Orr, must_fail=True)('W0', 'XZR', 'W18'), # Size mismatch
|
||||||
|
|
||||||
|
CheckInstr(Movk)('X0', 0x1234, "LSL #32"),
|
||||||
|
CheckInstr(Movk)('X18', 0x5678, "LSL #48"),
|
||||||
|
|
||||||
|
CheckInstr(Ret)("X0"),
|
||||||
|
CheckInstr(Ret, expected_result="ret")("X30"),
|
||||||
|
CheckInstr(Ret)(),
|
||||||
|
|
||||||
|
# Virtual instruction that dispatch to something else:
|
||||||
|
# Ex: "mov reg1, re2" -> "orr reg1, xzr, reg2"
|
||||||
|
|
||||||
|
CheckInstr(Mov)('X0', 'X18'),
|
||||||
|
CheckInstr(Mov)('W0', 'W18'),
|
||||||
|
CheckInstr(Mov, must_fail=True)('X0', 'W18'),
|
||||||
|
CheckInstr(Mov, must_fail=True)('X0', 'X18', 'X12'),
|
||||||
|
|
||||||
|
|
||||||
|
], ids=CheckInstr.__repr__)
|
||||||
|
def test_instruction_assembling(checkinstr):
|
||||||
|
assert checkinstr.dotest()
|
||||||
@@ -51,6 +51,7 @@ class TestSystemWithCheckGarbage(object):
|
|||||||
def test_wmi(self):
|
def test_wmi(self):
|
||||||
assert windows.system.wmi is not None
|
assert windows.system.wmi is not None
|
||||||
|
|
||||||
|
@cross_heaven_gates
|
||||||
def test_handles(self):
|
def test_handles(self):
|
||||||
assert windows.system.handles
|
assert windows.system.handles
|
||||||
|
|
||||||
@@ -66,6 +67,7 @@ class TestSystemWithCheckGarbage(object):
|
|||||||
def test_task_object_manager(self):
|
def test_task_object_manager(self):
|
||||||
assert windows.system.object_manager
|
assert windows.system.object_manager
|
||||||
|
|
||||||
|
@cross_heaven_gates
|
||||||
def test_system_modules_ntosk(self):
|
def test_system_modules_ntosk(self):
|
||||||
# NtQuerySystemInformation(gdef.SystemModuleInformation) returns CHAR so not unicode
|
# NtQuerySystemInformation(gdef.SystemModuleInformation) returns CHAR so not unicode
|
||||||
# Another Nt API that returns unicode ?
|
# Another Nt API that returns unicode ?
|
||||||
@@ -83,6 +85,7 @@ class TestSystemWithCheckGarbageAndHandleLeak(object):
|
|||||||
assert windows.current_process.pid in [p.pid for p in procs]
|
assert windows.current_process.pid in [p.pid for p in procs]
|
||||||
assert is_unicode(windows.system.processes[0].name)
|
assert is_unicode(windows.system.processes[0].name)
|
||||||
|
|
||||||
|
@cross_heaven_gates
|
||||||
def test_system_modules(self):
|
def test_system_modules(self):
|
||||||
assert windows.system.modules
|
assert windows.system.modules
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
import windows
|
import windows
|
||||||
import ctypes
|
import ctypes
|
||||||
|
|
||||||
|
from .pfwtest import *
|
||||||
|
|
||||||
|
@cross_heaven_gates
|
||||||
def test_system_module_gc():
|
def test_system_module_gc():
|
||||||
# Test for issue 12 (Py3)
|
# Test for issue 12 (Py3)
|
||||||
# https://github.com/hakril/PythonForWindows/issues/12
|
# https://github.com/hakril/PythonForWindows/issues/12
|
||||||
|
|||||||
+29
-3
@@ -1,6 +1,8 @@
|
|||||||
import pytest
|
import time
|
||||||
import textwrap
|
import textwrap
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
import windows
|
import windows
|
||||||
import windows.generated_def as gdef
|
import windows.generated_def as gdef
|
||||||
import windows.native_exec.simple_x86 as x86
|
import windows.native_exec.simple_x86 as x86
|
||||||
@@ -8,8 +10,28 @@ import windows.native_exec.simple_x64 as x64
|
|||||||
|
|
||||||
from .pfwtest import *
|
from .pfwtest import *
|
||||||
|
|
||||||
pytestmark = pytest.mark.usefixtures('check_for_gc_garbage')
|
# pytestmark = pytest.mark.usefixtures('check_for_gc_garbage')
|
||||||
|
|
||||||
|
def test_print_syswow_state():
|
||||||
|
import platform
|
||||||
|
print("")
|
||||||
|
env = windows.system.environ
|
||||||
|
print("platform.machine()={0}".format(platform.machine()))
|
||||||
|
print("platform.architecture()={0}".format(platform.architecture()))
|
||||||
|
print("windows.system.bitness={0}".format(windows.system.bitness))
|
||||||
|
print("windows.system.architecture={0}".format(windows.system.architecture))
|
||||||
|
print("windows.current_process.bitness={0}".format(windows.current_process.bitness))
|
||||||
|
print("windows.current_process.architecture={0}".format(windows.current_process.architecture))
|
||||||
|
print("env['PROCESSOR_ARCHITECTURE']={0}".format(env['PROCESSOR_ARCHITECTURE']))
|
||||||
|
print("env.get('PROCESSOR_ARCHITEW6432')={0}".format(env.get('PROCESSOR_ARCHITEW6432')))
|
||||||
|
|
||||||
|
print("")
|
||||||
|
print("IsWow64Process2")
|
||||||
|
processMachine = gdef.USHORT()
|
||||||
|
nativeMachine = gdef.USHORT()
|
||||||
|
windows.winproxy.IsWow64Process2(windows.current_process.handle, processMachine, nativeMachine)
|
||||||
|
print("hex(processMachine.value)={0}".format(hex(processMachine.value)))
|
||||||
|
print("hex(nativeMachine.value)={0}".format(hex(nativeMachine.value)))
|
||||||
|
|
||||||
|
|
||||||
@process_syswow_only
|
@process_syswow_only
|
||||||
@@ -30,6 +52,7 @@ class TestSyswowCurrentProcess(object):
|
|||||||
@python_injection
|
@python_injection
|
||||||
@windows_64bit_only
|
@windows_64bit_only
|
||||||
class TestSyswowRemoteProcess(object):
|
class TestSyswowRemoteProcess(object):
|
||||||
|
@cross_heaven_gates
|
||||||
def test_remote_pebsyswow(self, proc32):
|
def test_remote_pebsyswow(self, proc32):
|
||||||
peb64 = proc32.peb_syswow
|
peb64 = proc32.peb_syswow
|
||||||
modules_names = [m.name for m in peb64.modules]
|
modules_names = [m.name for m in peb64.modules]
|
||||||
@@ -39,6 +62,7 @@ class TestSyswowRemoteProcess(object):
|
|||||||
assert "Wow64LdrpInitialize" in wow64.pe.exports
|
assert "Wow64LdrpInitialize" in wow64.pe.exports
|
||||||
|
|
||||||
|
|
||||||
|
@system_architecture_only(gdef.PROCESSOR_ARCHITECTURE_AMD64)
|
||||||
def test_getset_syswow_context(self, proc32):
|
def test_getset_syswow_context(self, proc32):
|
||||||
addr = proc32.virtual_alloc(0x1000)
|
addr = proc32.virtual_alloc(0x1000)
|
||||||
remote_python_code = """
|
remote_python_code = """
|
||||||
@@ -49,6 +73,8 @@ class TestSyswowRemoteProcess(object):
|
|||||||
windows.current_process.write_qword({0}, res)
|
windows.current_process.write_qword({0}, res)
|
||||||
""".format(addr)
|
""".format(addr)
|
||||||
|
|
||||||
|
# Execute the import safely so that the test will not hang if import fails
|
||||||
|
proc32.execute_python("import windows")
|
||||||
t = proc32.execute_python_unsafe(textwrap.dedent(remote_python_code))
|
t = proc32.execute_python_unsafe(textwrap.dedent(remote_python_code))
|
||||||
# Wait for python execution
|
# Wait for python execution
|
||||||
while proc32.read_qword(addr) != 0x8877665544332211:
|
while proc32.read_qword(addr) != 0x8877665544332211:
|
||||||
@@ -85,7 +111,6 @@ def loop_query_ppid(proc, target_ppid):
|
|||||||
assert proc.read_memory(i.BaseAddress, 0x1000)
|
assert proc.read_memory(i.BaseAddress, 0x1000)
|
||||||
# assert False, "LOL"
|
# assert False, "LOL"
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
# import traceback; traceback.print(
|
|
||||||
threads_error[windows.current_thread.tid] = e
|
threads_error[windows.current_thread.tid] = e
|
||||||
raise
|
raise
|
||||||
return True
|
return True
|
||||||
@@ -99,6 +124,7 @@ def test_syswow_call_multithread():
|
|||||||
# Old version of PFW did not handled that thus generating invalid result / crash
|
# Old version of PFW did not handled that thus generating invalid result / crash
|
||||||
for tnb in range(10):
|
for tnb in range(10):
|
||||||
new_proc = windows.test.pop_proc_64()
|
new_proc = windows.test.pop_proc_64()
|
||||||
|
time.sleep(0.1)
|
||||||
new_proc_pid = new_proc.ppid
|
new_proc_pid = new_proc.ppid
|
||||||
all_procs.append(new_proc)
|
all_procs.append(new_proc)
|
||||||
t = threading.Thread(target=loop_query_ppid, args=(new_proc, new_proc_pid))
|
t = threading.Thread(target=loop_query_ppid, args=(new_proc, new_proc_pid))
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ def test_get_object(name, cls):
|
|||||||
# Todo: test
|
# Todo: test
|
||||||
# - put_instance
|
# - put_instance
|
||||||
|
|
||||||
|
@cross_heaven_gates # proc.peb.commandline.str == cmdline
|
||||||
@pytest.mark.parametrize("cmdline", [r"winver.exe test_string_pfw"])
|
@pytest.mark.parametrize("cmdline", [r"winver.exe test_string_pfw"])
|
||||||
def test_exec_method_Win32_Process_create(cmdline):
|
def test_exec_method_Win32_Process_create(cmdline):
|
||||||
namespace = windows.system.wmi["root\\cimv2"]
|
namespace = windows.system.wmi["root\\cimv2"]
|
||||||
|
|||||||
@@ -177,6 +177,10 @@ class SymbolType(object):
|
|||||||
windows.winproxy.LocalFree(res)
|
windows.winproxy.LocalFree(res)
|
||||||
return newres
|
return newres
|
||||||
|
|
||||||
|
@property
|
||||||
|
def module(self):
|
||||||
|
return self.resolver.get_module(self.modbase)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def name(self):
|
def name(self):
|
||||||
return self._get_type_info(gdef.TI_GET_SYMNAME)
|
return self._get_type_info(gdef.TI_GET_SYMNAME)
|
||||||
|
|||||||
@@ -67,5 +67,57 @@ from .winfuncs import *
|
|||||||
from .windef import *
|
from .windef import *
|
||||||
from .interfaces import *
|
from .interfaces import *
|
||||||
|
|
||||||
|
# Define custom Flag mappers for define list that should be enums
|
||||||
|
|
||||||
|
PROCESSOR_ARCHITECTURE_MAPPER = FlagMapper(
|
||||||
|
PROCESSOR_ARCHITECTURE_INTEL,
|
||||||
|
PROCESSOR_ARCHITECTURE_MIPS,
|
||||||
|
PROCESSOR_ARCHITECTURE_ALPHA,
|
||||||
|
PROCESSOR_ARCHITECTURE_PPC,
|
||||||
|
PROCESSOR_ARCHITECTURE_SHX,
|
||||||
|
PROCESSOR_ARCHITECTURE_ARM,
|
||||||
|
PROCESSOR_ARCHITECTURE_IA64,
|
||||||
|
PROCESSOR_ARCHITECTURE_ALPHA64,
|
||||||
|
PROCESSOR_ARCHITECTURE_MSIL,
|
||||||
|
PROCESSOR_ARCHITECTURE_AMD64,
|
||||||
|
PROCESSOR_ARCHITECTURE_IA32_ON_WIN64,
|
||||||
|
PROCESSOR_ARCHITECTURE_NEUTRAL,
|
||||||
|
PROCESSOR_ARCHITECTURE_ARM64,
|
||||||
|
PROCESSOR_ARCHITECTURE_ARM32_ON_WIN64,
|
||||||
|
PROCESSOR_ARCHITECTURE_UNKNOWN,
|
||||||
|
IMAGE_FILE_MACHINE_TARGET_HOST
|
||||||
|
)
|
||||||
|
|
||||||
|
IMAGE_FILE_MACHINE_MAPPER = FlagMapper(
|
||||||
|
IMAGE_FILE_MACHINE_UNKNOWN,
|
||||||
|
IMAGE_FILE_MACHINE_I386,
|
||||||
|
IMAGE_FILE_MACHINE_R3000,
|
||||||
|
IMAGE_FILE_MACHINE_R4000,
|
||||||
|
IMAGE_FILE_MACHINE_R10000,
|
||||||
|
IMAGE_FILE_MACHINE_WCEMIPSV2,
|
||||||
|
IMAGE_FILE_MACHINE_ALPHA,
|
||||||
|
IMAGE_FILE_MACHINE_SH3,
|
||||||
|
IMAGE_FILE_MACHINE_SH3DSP,
|
||||||
|
IMAGE_FILE_MACHINE_SH3E,
|
||||||
|
IMAGE_FILE_MACHINE_SH4,
|
||||||
|
IMAGE_FILE_MACHINE_SH5,
|
||||||
|
IMAGE_FILE_MACHINE_ARM,
|
||||||
|
IMAGE_FILE_MACHINE_THUMB,
|
||||||
|
IMAGE_FILE_MACHINE_ARMNT,
|
||||||
|
IMAGE_FILE_MACHINE_AM33,
|
||||||
|
IMAGE_FILE_MACHINE_POWERPC,
|
||||||
|
IMAGE_FILE_MACHINE_POWERPCFP,
|
||||||
|
IMAGE_FILE_MACHINE_IA64,
|
||||||
|
IMAGE_FILE_MACHINE_MIPS16,
|
||||||
|
IMAGE_FILE_MACHINE_ALPHA64,
|
||||||
|
IMAGE_FILE_MACHINE_MIPSFPU,
|
||||||
|
IMAGE_FILE_MACHINE_MIPSFPU16,
|
||||||
|
IMAGE_FILE_MACHINE_TRICORE,
|
||||||
|
IMAGE_FILE_MACHINE_CEF,
|
||||||
|
IMAGE_FILE_MACHINE_EBC,
|
||||||
|
IMAGE_FILE_MACHINE_AMD64,
|
||||||
|
IMAGE_FILE_MACHINE_M32R,
|
||||||
|
IMAGE_FILE_MACHINE_CEE,
|
||||||
|
IMAGE_FILE_MACHINE_ARM64
|
||||||
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -191,6 +191,8 @@ windef = {'ABOVE_NORMAL_PRIORITY_CLASS',
|
|||||||
'API_SET_SCHEMA_VERSION_V3',
|
'API_SET_SCHEMA_VERSION_V3',
|
||||||
'API_SET_SCHEMA_VERSION_V4',
|
'API_SET_SCHEMA_VERSION_V4',
|
||||||
'APPLICATION_ERROR_MASK',
|
'APPLICATION_ERROR_MASK',
|
||||||
|
'ARM64_MAX_BREAKPOINTS',
|
||||||
|
'ARM64_MAX_WATCHPOINTS',
|
||||||
'ASYNC_MODE_COMPATIBILITY',
|
'ASYNC_MODE_COMPATIBILITY',
|
||||||
'ASYNC_MODE_DEFAULT',
|
'ASYNC_MODE_DEFAULT',
|
||||||
'ATM_ADDR_SIZE',
|
'ATM_ADDR_SIZE',
|
||||||
@@ -661,6 +663,11 @@ windef = {'ABOVE_NORMAL_PRIORITY_CLASS',
|
|||||||
'CONTEXT_AMD64',
|
'CONTEXT_AMD64',
|
||||||
'CONTEXT_ARM',
|
'CONTEXT_ARM',
|
||||||
'CONTEXT_ARM64',
|
'CONTEXT_ARM64',
|
||||||
|
'CONTEXT_ARM64_CONTROL',
|
||||||
|
'CONTEXT_ARM64_DEBUG_REGISTERS',
|
||||||
|
'CONTEXT_ARM64_FLOATING_POINT',
|
||||||
|
'CONTEXT_ARM64_INTEGER',
|
||||||
|
'CONTEXT_ARM64_X18',
|
||||||
'CONTEXT_CONTROL',
|
'CONTEXT_CONTROL',
|
||||||
'CONTEXT_DEBUG_REGISTERS',
|
'CONTEXT_DEBUG_REGISTERS',
|
||||||
'CONTEXT_EXTENDED_REGISTERS',
|
'CONTEXT_EXTENDED_REGISTERS',
|
||||||
@@ -668,8 +675,12 @@ windef = {'ABOVE_NORMAL_PRIORITY_CLASS',
|
|||||||
'CONTEXT_FULL',
|
'CONTEXT_FULL',
|
||||||
'CONTEXT_I386',
|
'CONTEXT_I386',
|
||||||
'CONTEXT_INTEGER',
|
'CONTEXT_INTEGER',
|
||||||
|
'CONTEXT_RET_TO_GUEST',
|
||||||
'CONTEXT_SEGMENTS',
|
'CONTEXT_SEGMENTS',
|
||||||
|
'CONTEXT_UNWOUND_TO_CALL',
|
||||||
'CONTEXT_XSTATE',
|
'CONTEXT_XSTATE',
|
||||||
|
'CONTEXT_i386',
|
||||||
|
'CONTEXT_i486',
|
||||||
'CONTROL_C_EXIT',
|
'CONTROL_C_EXIT',
|
||||||
'CREATE_ALWAYS',
|
'CREATE_ALWAYS',
|
||||||
'CREATE_BREAKAWAY_FROM_JOB',
|
'CREATE_BREAKAWAY_FROM_JOB',
|
||||||
@@ -1722,6 +1733,7 @@ windef = {'ABOVE_NORMAL_PRIORITY_CLASS',
|
|||||||
'IMAGE_FILE_MACHINE_SH3E',
|
'IMAGE_FILE_MACHINE_SH3E',
|
||||||
'IMAGE_FILE_MACHINE_SH4',
|
'IMAGE_FILE_MACHINE_SH4',
|
||||||
'IMAGE_FILE_MACHINE_SH5',
|
'IMAGE_FILE_MACHINE_SH5',
|
||||||
|
'IMAGE_FILE_MACHINE_TARGET_HOST',
|
||||||
'IMAGE_FILE_MACHINE_THUMB',
|
'IMAGE_FILE_MACHINE_THUMB',
|
||||||
'IMAGE_FILE_MACHINE_TRICORE',
|
'IMAGE_FILE_MACHINE_TRICORE',
|
||||||
'IMAGE_FILE_MACHINE_UNKNOWN',
|
'IMAGE_FILE_MACHINE_UNKNOWN',
|
||||||
@@ -2421,7 +2433,44 @@ windef = {'ABOVE_NORMAL_PRIORITY_CLASS',
|
|||||||
'PRIORITY_BIT',
|
'PRIORITY_BIT',
|
||||||
'PRIORITY_EQUAL_FIRST',
|
'PRIORITY_EQUAL_FIRST',
|
||||||
'PRIORITY_EQUAL_LAST',
|
'PRIORITY_EQUAL_LAST',
|
||||||
|
'PROCESSOR_ALPHA_21064',
|
||||||
|
'PROCESSOR_ARCHITECTURE_ALPHA',
|
||||||
|
'PROCESSOR_ARCHITECTURE_ALPHA64',
|
||||||
|
'PROCESSOR_ARCHITECTURE_AMD64',
|
||||||
|
'PROCESSOR_ARCHITECTURE_ARM',
|
||||||
|
'PROCESSOR_ARCHITECTURE_ARM32_ON_WIN64',
|
||||||
|
'PROCESSOR_ARCHITECTURE_ARM64',
|
||||||
|
'PROCESSOR_ARCHITECTURE_IA32_ON_WIN64',
|
||||||
|
'PROCESSOR_ARCHITECTURE_IA64',
|
||||||
|
'PROCESSOR_ARCHITECTURE_INTEL',
|
||||||
|
'PROCESSOR_ARCHITECTURE_MIPS',
|
||||||
|
'PROCESSOR_ARCHITECTURE_MSIL',
|
||||||
|
'PROCESSOR_ARCHITECTURE_NEUTRAL',
|
||||||
|
'PROCESSOR_ARCHITECTURE_PPC',
|
||||||
|
'PROCESSOR_ARCHITECTURE_SHX',
|
||||||
|
'PROCESSOR_ARCHITECTURE_UNKNOWN',
|
||||||
|
'PROCESSOR_ARM720',
|
||||||
|
'PROCESSOR_ARM820',
|
||||||
|
'PROCESSOR_ARM920',
|
||||||
|
'PROCESSOR_ARM_7TDMI',
|
||||||
'PROCESSOR_FEATURE_MAX',
|
'PROCESSOR_FEATURE_MAX',
|
||||||
|
'PROCESSOR_HITACHI_SH3',
|
||||||
|
'PROCESSOR_HITACHI_SH3E',
|
||||||
|
'PROCESSOR_HITACHI_SH4',
|
||||||
|
'PROCESSOR_INTEL_386',
|
||||||
|
'PROCESSOR_INTEL_486',
|
||||||
|
'PROCESSOR_INTEL_IA64',
|
||||||
|
'PROCESSOR_INTEL_PENTIUM',
|
||||||
|
'PROCESSOR_MIPS_R4000',
|
||||||
|
'PROCESSOR_MOTOROLA_821',
|
||||||
|
'PROCESSOR_OPTIL',
|
||||||
|
'PROCESSOR_PPC_601',
|
||||||
|
'PROCESSOR_PPC_603',
|
||||||
|
'PROCESSOR_PPC_604',
|
||||||
|
'PROCESSOR_PPC_620',
|
||||||
|
'PROCESSOR_SHx_SH3',
|
||||||
|
'PROCESSOR_SHx_SH4',
|
||||||
|
'PROCESSOR_STRONGARM',
|
||||||
'PROCESS_ALL_ACCESS',
|
'PROCESS_ALL_ACCESS',
|
||||||
'PROCESS_CREATE_PROCESS',
|
'PROCESS_CREATE_PROCESS',
|
||||||
'PROCESS_CREATE_THREAD',
|
'PROCESS_CREATE_THREAD',
|
||||||
@@ -2443,6 +2492,23 @@ windef = {'ABOVE_NORMAL_PRIORITY_CLASS',
|
|||||||
'PROCESS_VM_OPERATION',
|
'PROCESS_VM_OPERATION',
|
||||||
'PROCESS_VM_READ',
|
'PROCESS_VM_READ',
|
||||||
'PROCESS_VM_WRITE',
|
'PROCESS_VM_WRITE',
|
||||||
|
'PROC_THREAD_ATTRIBUTE_ADDITIVE',
|
||||||
|
'PROC_THREAD_ATTRIBUTE_ENABLE_OPTIONAL_XSTATE_FEATURES',
|
||||||
|
'PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY',
|
||||||
|
'PROC_THREAD_ATTRIBUTE_HANDLE_LIST',
|
||||||
|
'PROC_THREAD_ATTRIBUTE_IDEAL_PROCESSOR',
|
||||||
|
'PROC_THREAD_ATTRIBUTE_INPUT',
|
||||||
|
'PROC_THREAD_ATTRIBUTE_MACHINE_TYPE',
|
||||||
|
'PROC_THREAD_ATTRIBUTE_MITIGATION_POLICY',
|
||||||
|
'PROC_THREAD_ATTRIBUTE_NUMBER',
|
||||||
|
'PROC_THREAD_ATTRIBUTE_PARENT_PROCESS',
|
||||||
|
'PROC_THREAD_ATTRIBUTE_PREFERRED_NODE',
|
||||||
|
'PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL',
|
||||||
|
'PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE',
|
||||||
|
'PROC_THREAD_ATTRIBUTE_SECURITY_CAPABILITIES',
|
||||||
|
'PROC_THREAD_ATTRIBUTE_SVE_VECTOR_LENGTH',
|
||||||
|
'PROC_THREAD_ATTRIBUTE_THREAD',
|
||||||
|
'PROC_THREAD_ATTRIBUTE_UMS_THREAD',
|
||||||
'PRODUCT_BUSINESS',
|
'PRODUCT_BUSINESS',
|
||||||
'PRODUCT_BUSINESS_N',
|
'PRODUCT_BUSINESS_N',
|
||||||
'PRODUCT_CLUSTER_SERVER',
|
'PRODUCT_CLUSTER_SERVER',
|
||||||
@@ -2552,6 +2618,35 @@ windef = {'ABOVE_NORMAL_PRIORITY_CLASS',
|
|||||||
'PROV_RSA_SIG',
|
'PROV_RSA_SIG',
|
||||||
'PROV_SPYRUS_LYNKS',
|
'PROV_SPYRUS_LYNKS',
|
||||||
'PROV_SSL',
|
'PROV_SSL',
|
||||||
|
'ProcThreadAttributeAllApplicationPackagesPolicy',
|
||||||
|
'ProcThreadAttributeBnoIsolation',
|
||||||
|
'ProcThreadAttributeChildProcessPolicy',
|
||||||
|
'ProcThreadAttributeComponentFilter',
|
||||||
|
'ProcThreadAttributeConsoleReference',
|
||||||
|
'ProcThreadAttributeCreateStore',
|
||||||
|
'ProcThreadAttributeDesktopAppPolicy',
|
||||||
|
'ProcThreadAttributeEnableOptionalXStateFeatures',
|
||||||
|
'ProcThreadAttributeExtendedFlags',
|
||||||
|
'ProcThreadAttributeGroupAffinity',
|
||||||
|
'ProcThreadAttributeHandleList',
|
||||||
|
'ProcThreadAttributeIdealProcessor',
|
||||||
|
'ProcThreadAttributeIsolationManifest',
|
||||||
|
'ProcThreadAttributeJobList',
|
||||||
|
'ProcThreadAttributeMachineType',
|
||||||
|
'ProcThreadAttributeMitigationAuditPolicy',
|
||||||
|
'ProcThreadAttributeMitigationPolicy',
|
||||||
|
'ProcThreadAttributeOsMaxVersionTested',
|
||||||
|
'ProcThreadAttributePackageFullName',
|
||||||
|
'ProcThreadAttributeParentProcess',
|
||||||
|
'ProcThreadAttributePreferredNode',
|
||||||
|
'ProcThreadAttributeProtectionLevel',
|
||||||
|
'ProcThreadAttributePseudoConsole',
|
||||||
|
'ProcThreadAttributeSafeOpenPromptOriginClaim',
|
||||||
|
'ProcThreadAttributeSecurityCapabilities',
|
||||||
|
'ProcThreadAttributeSveVectorLength',
|
||||||
|
'ProcThreadAttributeTrustedApp',
|
||||||
|
'ProcThreadAttributeUmsThread',
|
||||||
|
'ProcThreadAttributeWin32kFilter',
|
||||||
'READ_CONTROL',
|
'READ_CONTROL',
|
||||||
'REALTIME_PRIORITY_CLASS',
|
'REALTIME_PRIORITY_CLASS',
|
||||||
'REG_BINARY',
|
'REG_BINARY',
|
||||||
@@ -3197,6 +3292,21 @@ windef = {'ABOVE_NORMAL_PRIORITY_CLASS',
|
|||||||
'WIN_CERT_TYPE_RESERVED_1',
|
'WIN_CERT_TYPE_RESERVED_1',
|
||||||
'WIN_CERT_TYPE_TS_STACK_SIGNED',
|
'WIN_CERT_TYPE_TS_STACK_SIGNED',
|
||||||
'WIN_CERT_TYPE_X509',
|
'WIN_CERT_TYPE_X509',
|
||||||
|
'WOW64_CONTEXT_ALL',
|
||||||
|
'WOW64_CONTEXT_CONTROL',
|
||||||
|
'WOW64_CONTEXT_DEBUG_REGISTERS',
|
||||||
|
'WOW64_CONTEXT_EXCEPTION_ACTIVE',
|
||||||
|
'WOW64_CONTEXT_EXCEPTION_REPORTING',
|
||||||
|
'WOW64_CONTEXT_EXCEPTION_REQUEST',
|
||||||
|
'WOW64_CONTEXT_EXTENDED_REGISTERS',
|
||||||
|
'WOW64_CONTEXT_FLOATING_POINT',
|
||||||
|
'WOW64_CONTEXT_FULL',
|
||||||
|
'WOW64_CONTEXT_INTEGER',
|
||||||
|
'WOW64_CONTEXT_SEGMENTS',
|
||||||
|
'WOW64_CONTEXT_SERVICE_ACTIVE',
|
||||||
|
'WOW64_CONTEXT_XSTATE',
|
||||||
|
'WOW64_CONTEXT_i386',
|
||||||
|
'WOW64_CONTEXT_i486',
|
||||||
'WOW64_MAXIMUM_SUPPORTED_EXTENSION',
|
'WOW64_MAXIMUM_SUPPORTED_EXTENSION',
|
||||||
'WOW64_SIZE_OF_80387_REGISTERS',
|
'WOW64_SIZE_OF_80387_REGISTERS',
|
||||||
'WRITE_DAC',
|
'WRITE_DAC',
|
||||||
@@ -12173,6 +12283,8 @@ structs = {'ACCESS_ALLOWED_ACE',
|
|||||||
'API_SET_VALUE_ARRAY_V4',
|
'API_SET_VALUE_ARRAY_V4',
|
||||||
'API_SET_VALUE_ENTRY',
|
'API_SET_VALUE_ENTRY',
|
||||||
'API_SET_VALUE_ENTRY_V2',
|
'API_SET_VALUE_ENTRY_V2',
|
||||||
|
'ARM64_NT_CONTEXT',
|
||||||
|
'ARM64_NT_NEON128',
|
||||||
'ARRAYDESC',
|
'ARRAYDESC',
|
||||||
'ATTACH_VIRTUAL_DISK_PARAMETERS',
|
'ATTACH_VIRTUAL_DISK_PARAMETERS',
|
||||||
'BG_AUTH_CREDENTIALS',
|
'BG_AUTH_CREDENTIALS',
|
||||||
@@ -12641,6 +12753,7 @@ structs = {'ACCESS_ALLOWED_ACE',
|
|||||||
'LPSTARTUPINFOEXW',
|
'LPSTARTUPINFOEXW',
|
||||||
'LPSTARTUPINFOW',
|
'LPSTARTUPINFOW',
|
||||||
'LPSYSTEMTIME',
|
'LPSYSTEMTIME',
|
||||||
|
'LPSYSTEM_INFO',
|
||||||
'LPTHREADENTRY32',
|
'LPTHREADENTRY32',
|
||||||
'LPTIME_ZONE_INFORMATION',
|
'LPTIME_ZONE_INFORMATION',
|
||||||
'LPTLIBATTR',
|
'LPTLIBATTR',
|
||||||
@@ -12802,6 +12915,8 @@ structs = {'ACCESS_ALLOWED_ACE',
|
|||||||
'PAPI_SET_VALUE_ENTRY_V2',
|
'PAPI_SET_VALUE_ENTRY_V2',
|
||||||
'PARAMDESC',
|
'PARAMDESC',
|
||||||
'PARAMDESCEX',
|
'PARAMDESCEX',
|
||||||
|
'PARM64_NT_CONTEXT',
|
||||||
|
'PARM64_NT_NEON128',
|
||||||
'PATTACH_VIRTUAL_DISK_PARAMETERS',
|
'PATTACH_VIRTUAL_DISK_PARAMETERS',
|
||||||
'PBITMAP',
|
'PBITMAP',
|
||||||
'PBITMAPCOREHEADER',
|
'PBITMAPCOREHEADER',
|
||||||
@@ -13238,6 +13353,7 @@ structs = {'ACCESS_ALLOWED_ACE',
|
|||||||
'PROCESS_BASIC_INFORMATION',
|
'PROCESS_BASIC_INFORMATION',
|
||||||
'PROCESS_INFORMATION',
|
'PROCESS_INFORMATION',
|
||||||
'PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION',
|
'PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION',
|
||||||
|
'PROCESS_MACHINE_INFORMATION',
|
||||||
'PROCESS_MEMORY_COUNTERS',
|
'PROCESS_MEMORY_COUNTERS',
|
||||||
'PROCESS_MEMORY_COUNTERS_EX',
|
'PROCESS_MEMORY_COUNTERS_EX',
|
||||||
'PROCESS_MITIGATION_ASLR_POLICY',
|
'PROCESS_MITIGATION_ASLR_POLICY',
|
||||||
@@ -13459,6 +13575,7 @@ structs = {'ACCESS_ALLOWED_ACE',
|
|||||||
'SYSTEM_HANDLE64',
|
'SYSTEM_HANDLE64',
|
||||||
'SYSTEM_HANDLE_INFORMATION',
|
'SYSTEM_HANDLE_INFORMATION',
|
||||||
'SYSTEM_HANDLE_INFORMATION64',
|
'SYSTEM_HANDLE_INFORMATION64',
|
||||||
|
'SYSTEM_INFO',
|
||||||
'SYSTEM_MANDATORY_LABEL_ACE',
|
'SYSTEM_MANDATORY_LABEL_ACE',
|
||||||
'SYSTEM_MODULE32',
|
'SYSTEM_MODULE32',
|
||||||
'SYSTEM_MODULE64',
|
'SYSTEM_MODULE64',
|
||||||
@@ -13483,8 +13600,6 @@ structs = {'ACCESS_ALLOWED_ACE',
|
|||||||
'TMPUNION_CMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO',
|
'TMPUNION_CMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO',
|
||||||
'TMP_CERT_STRONG_SIGN_PARA_UNION_TYPE',
|
'TMP_CERT_STRONG_SIGN_PARA_UNION_TYPE',
|
||||||
'TMP_CMSG_RECIPIENT_ENCODE_INFO_UNION',
|
'TMP_CMSG_RECIPIENT_ENCODE_INFO_UNION',
|
||||||
'TMP_CONTEXT64_SUBUNION',
|
|
||||||
'TMP_DUMMYSTRUCTNAME',
|
|
||||||
'TMP_SPC_LINK_UNION',
|
'TMP_SPC_LINK_UNION',
|
||||||
'TMP_TYPEDESC_UNION',
|
'TMP_TYPEDESC_UNION',
|
||||||
'TMP_UNION_DEBUG_INFO',
|
'TMP_UNION_DEBUG_INFO',
|
||||||
@@ -13625,6 +13740,8 @@ structs = {'ACCESS_ALLOWED_ACE',
|
|||||||
'_API_SET_VALUE_ARRAY_V4',
|
'_API_SET_VALUE_ARRAY_V4',
|
||||||
'_API_SET_VALUE_ENTRY',
|
'_API_SET_VALUE_ENTRY',
|
||||||
'_API_SET_VALUE_ENTRY_V2',
|
'_API_SET_VALUE_ENTRY_V2',
|
||||||
|
'_ARM64_NT_CONTEXT',
|
||||||
|
'_ARM64_NT_NEON128',
|
||||||
'_ATTACH_VIRTUAL_DISK_PARAMETERS',
|
'_ATTACH_VIRTUAL_DISK_PARAMETERS',
|
||||||
'_BG_FILE_INFO',
|
'_BG_FILE_INFO',
|
||||||
'_BG_FILE_PROGRESS',
|
'_BG_FILE_PROGRESS',
|
||||||
@@ -13958,6 +14075,7 @@ structs = {'ACCESS_ALLOWED_ACE',
|
|||||||
'_PROCESS_BASIC_INFORMATION',
|
'_PROCESS_BASIC_INFORMATION',
|
||||||
'_PROCESS_INFORMATION',
|
'_PROCESS_INFORMATION',
|
||||||
'_PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION',
|
'_PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION',
|
||||||
|
'_PROCESS_MACHINE_INFORMATION',
|
||||||
'_PROCESS_MEMORY_COUNTERS',
|
'_PROCESS_MEMORY_COUNTERS',
|
||||||
'_PROCESS_MEMORY_COUNTERS_EX',
|
'_PROCESS_MEMORY_COUNTERS_EX',
|
||||||
'_PROCESS_MITIGATION_ASLR_POLICY',
|
'_PROCESS_MITIGATION_ASLR_POLICY',
|
||||||
@@ -14038,6 +14156,7 @@ structs = {'ACCESS_ALLOWED_ACE',
|
|||||||
'_SYSTEM_HANDLE64',
|
'_SYSTEM_HANDLE64',
|
||||||
'_SYSTEM_HANDLE_INFORMATION',
|
'_SYSTEM_HANDLE_INFORMATION',
|
||||||
'_SYSTEM_HANDLE_INFORMATION64',
|
'_SYSTEM_HANDLE_INFORMATION64',
|
||||||
|
'_SYSTEM_INFO',
|
||||||
'_SYSTEM_MANDATORY_LABEL_ACE',
|
'_SYSTEM_MANDATORY_LABEL_ACE',
|
||||||
'_SYSTEM_MODULE32',
|
'_SYSTEM_MODULE32',
|
||||||
'_SYSTEM_MODULE64',
|
'_SYSTEM_MODULE64',
|
||||||
@@ -14059,8 +14178,6 @@ structs = {'ACCESS_ALLOWED_ACE',
|
|||||||
'_TMPUNION_CMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO',
|
'_TMPUNION_CMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO',
|
||||||
'_TMPUNION_CMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO',
|
'_TMPUNION_CMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO',
|
||||||
'_TMP_CMSG_RECIPIENT_ENCODE_INFO_UNION',
|
'_TMP_CMSG_RECIPIENT_ENCODE_INFO_UNION',
|
||||||
'_TMP_CONTEXT64_SUBUNION',
|
|
||||||
'_TMP_DUMMYSTRUCTNAME',
|
|
||||||
'_TMP_SPC_LINK_UNION',
|
'_TMP_SPC_LINK_UNION',
|
||||||
'_TMP_TYPEDESC_UNION',
|
'_TMP_TYPEDESC_UNION',
|
||||||
'_TMP_UNION_DEBUG_INFO',
|
'_TMP_UNION_DEBUG_INFO',
|
||||||
@@ -14261,6 +14378,7 @@ enums = {'ACCESS_MODE',
|
|||||||
'KEY_INFORMATION_CLASS',
|
'KEY_INFORMATION_CLASS',
|
||||||
'KEY_VALUE_INFORMATION_CLASS',
|
'KEY_VALUE_INFORMATION_CLASS',
|
||||||
'LocalServerType',
|
'LocalServerType',
|
||||||
|
'MACHINE_ATTRIBUTES',
|
||||||
'MEMORY_INFORMATION_CLASS',
|
'MEMORY_INFORMATION_CLASS',
|
||||||
'MEM_EXTENDED_PARAMETER_TYPE',
|
'MEM_EXTENDED_PARAMETER_TYPE',
|
||||||
'MIB_TCP_STATE',
|
'MIB_TCP_STATE',
|
||||||
@@ -14295,7 +14413,9 @@ enums = {'ACCESS_MODE',
|
|||||||
'PPROCESS_MITIGATION_POLICY',
|
'PPROCESS_MITIGATION_POLICY',
|
||||||
'PREAD_DIRECTORY_NOTIFY_INFORMATION_CLASS',
|
'PREAD_DIRECTORY_NOTIFY_INFORMATION_CLASS',
|
||||||
'PROCESSINFOCLASS',
|
'PROCESSINFOCLASS',
|
||||||
|
'PROCESS_INFORMATION_CLASS',
|
||||||
'PROCESS_MITIGATION_POLICY',
|
'PROCESS_MITIGATION_POLICY',
|
||||||
|
'PROC_THREAD_ATTRIBUTE_NUM',
|
||||||
'PSECURITY_IMPERSONATION_LEVEL',
|
'PSECURITY_IMPERSONATION_LEVEL',
|
||||||
'PSID_NAME_USE',
|
'PSID_NAME_USE',
|
||||||
'PTHREAD_INFORMATION_CLASS',
|
'PTHREAD_INFORMATION_CLASS',
|
||||||
@@ -14394,6 +14514,7 @@ enums = {'ACCESS_MODE',
|
|||||||
'_IO_PRIORITY_HINT',
|
'_IO_PRIORITY_HINT',
|
||||||
'_KEY_INFORMATION_CLASS',
|
'_KEY_INFORMATION_CLASS',
|
||||||
'_KEY_VALUE_INFORMATION_CLASS',
|
'_KEY_VALUE_INFORMATION_CLASS',
|
||||||
|
'_MACHINE_ATTRIBUTES',
|
||||||
'_MEMORY_INFORMATION_CLASS',
|
'_MEMORY_INFORMATION_CLASS',
|
||||||
'_MIB_TCP_STATE',
|
'_MIB_TCP_STATE',
|
||||||
'_MULTIPLE_TRUSTEE_OPERATION',
|
'_MULTIPLE_TRUSTEE_OPERATION',
|
||||||
@@ -14404,7 +14525,9 @@ enums = {'ACCESS_MODE',
|
|||||||
'_POLICY_INFORMATION_CLASS',
|
'_POLICY_INFORMATION_CLASS',
|
||||||
'_POLICY_LSA_SERVER_ROLE',
|
'_POLICY_LSA_SERVER_ROLE',
|
||||||
'_PROCESSINFOCLASS',
|
'_PROCESSINFOCLASS',
|
||||||
|
'_PROCESS_INFORMATION_CLASS',
|
||||||
'_PROCESS_MITIGATION_POLICY',
|
'_PROCESS_MITIGATION_POLICY',
|
||||||
|
'_PROC_THREAD_ATTRIBUTE_NUM',
|
||||||
'_READ_DIRECTORY_NOTIFY_INFORMATION_CLASS',
|
'_READ_DIRECTORY_NOTIFY_INFORMATION_CLASS',
|
||||||
'_RTL_PATH_TYPE',
|
'_RTL_PATH_TYPE',
|
||||||
'_SC_ENUM_TYPE',
|
'_SC_ENUM_TYPE',
|
||||||
@@ -14585,6 +14708,7 @@ functions = {'AccessCheck',
|
|||||||
'CreateProcessAsUserW',
|
'CreateProcessAsUserW',
|
||||||
'CreateProcessW',
|
'CreateProcessW',
|
||||||
'CreateRemoteThread',
|
'CreateRemoteThread',
|
||||||
|
'CreateRemoteThreadEx',
|
||||||
'CreateServiceA',
|
'CreateServiceA',
|
||||||
'CreateServiceW',
|
'CreateServiceW',
|
||||||
'CreateStreamOnHGlobal',
|
'CreateStreamOnHGlobal',
|
||||||
@@ -14803,6 +14927,7 @@ functions = {'AccessCheck',
|
|||||||
'GetModuleHandleW',
|
'GetModuleHandleW',
|
||||||
'GetNamedSecurityInfoA',
|
'GetNamedSecurityInfoA',
|
||||||
'GetNamedSecurityInfoW',
|
'GetNamedSecurityInfoW',
|
||||||
|
'GetNativeSystemInfo',
|
||||||
'GetNumberOfEventLogRecords',
|
'GetNumberOfEventLogRecords',
|
||||||
'GetOverlappedResult',
|
'GetOverlappedResult',
|
||||||
'GetParent',
|
'GetParent',
|
||||||
@@ -14813,6 +14938,7 @@ functions = {'AccessCheck',
|
|||||||
'GetProcessId',
|
'GetProcessId',
|
||||||
'GetProcessImageFileNameA',
|
'GetProcessImageFileNameA',
|
||||||
'GetProcessImageFileNameW',
|
'GetProcessImageFileNameW',
|
||||||
|
'GetProcessInformation',
|
||||||
'GetProcessMemoryInfo',
|
'GetProcessMemoryInfo',
|
||||||
'GetProcessMitigationPolicy',
|
'GetProcessMitigationPolicy',
|
||||||
'GetProcessTimes',
|
'GetProcessTimes',
|
||||||
@@ -14839,10 +14965,15 @@ functions = {'AccessCheck',
|
|||||||
'GetSidSubAuthorityCount',
|
'GetSidSubAuthorityCount',
|
||||||
'GetStdHandle',
|
'GetStdHandle',
|
||||||
'GetStringConditionFromBinary',
|
'GetStringConditionFromBinary',
|
||||||
|
'GetSystemInfo',
|
||||||
'GetSystemMetrics',
|
'GetSystemMetrics',
|
||||||
'GetSystemTime',
|
'GetSystemTime',
|
||||||
'GetSystemTimeAsFileTime',
|
'GetSystemTimeAsFileTime',
|
||||||
'GetSystemTimes',
|
'GetSystemTimes',
|
||||||
|
'GetSystemWow64Directory2A',
|
||||||
|
'GetSystemWow64Directory2W',
|
||||||
|
'GetSystemWow64DirectoryA',
|
||||||
|
'GetSystemWow64DirectoryW',
|
||||||
'GetThreadContext',
|
'GetThreadContext',
|
||||||
'GetThreadId',
|
'GetThreadId',
|
||||||
'GetTickCount',
|
'GetTickCount',
|
||||||
@@ -14901,6 +15032,9 @@ functions = {'AccessCheck',
|
|||||||
'IsDebuggerPresent',
|
'IsDebuggerPresent',
|
||||||
'IsOS',
|
'IsOS',
|
||||||
'IsValidSecurityDescriptor',
|
'IsValidSecurityDescriptor',
|
||||||
|
'IsWow64GuestMachineSupported',
|
||||||
|
'IsWow64Process',
|
||||||
|
'IsWow64Process2',
|
||||||
'LdrLoadDll',
|
'LdrLoadDll',
|
||||||
'LoadLibraryA',
|
'LoadLibraryA',
|
||||||
'LoadLibraryExA',
|
'LoadLibraryExA',
|
||||||
@@ -15150,6 +15284,7 @@ functions = {'AccessCheck',
|
|||||||
'SetNamedSecurityInfoA',
|
'SetNamedSecurityInfoA',
|
||||||
'SetNamedSecurityInfoW',
|
'SetNamedSecurityInfoW',
|
||||||
'SetPriorityClass',
|
'SetPriorityClass',
|
||||||
|
'SetProcessInformation',
|
||||||
'SetProcessMitigationPolicy',
|
'SetProcessMitigationPolicy',
|
||||||
'SetSecurityDescriptorDacl',
|
'SetSecurityDescriptorDacl',
|
||||||
'SetSecurityDescriptorOwner',
|
'SetSecurityDescriptorOwner',
|
||||||
@@ -15304,6 +15439,8 @@ functions = {'AccessCheck',
|
|||||||
'Wow64GetThreadContext',
|
'Wow64GetThreadContext',
|
||||||
'Wow64RevertWow64FsRedirection',
|
'Wow64RevertWow64FsRedirection',
|
||||||
'Wow64SetThreadContext',
|
'Wow64SetThreadContext',
|
||||||
|
'Wow64SetThreadDefaultGuestMachine',
|
||||||
|
'Wow64SuspendThread',
|
||||||
'WriteFile',
|
'WriteFile',
|
||||||
'WriteProcessMemory',
|
'WriteProcessMemory',
|
||||||
'ZwDuplicateObject',
|
'ZwDuplicateObject',
|
||||||
|
|||||||
+139
-13
@@ -24,6 +24,22 @@ def CTL_CODE(DeviceType, Function, Method, Access):
|
|||||||
|
|
||||||
def HRESULT_FACILITY(hr):
|
def HRESULT_FACILITY(hr):
|
||||||
return (((hr) >> 16) & 0x1fff)
|
return (((hr) >> 16) & 0x1fff)
|
||||||
|
|
||||||
|
# https://github.com/microsoft/win32metadata/blob/6af96d8470751e13a4e3f579f84b7b8b3ca398e1/generation/WinSDK/RecompiledIdlHeaders/um/WinBase.h#L3562
|
||||||
|
# Original MACRO:
|
||||||
|
|
||||||
|
#define ProcThreadAttributeValue(Number, Thread, Input, Additive) \
|
||||||
|
# (((Number) & PROC_THREAD_ATTRIBUTE_NUMBER) | \
|
||||||
|
# ((Thread != FALSE) ? PROC_THREAD_ATTRIBUTE_THREAD : 0) | \
|
||||||
|
# ((Input != FALSE) ? PROC_THREAD_ATTRIBUTE_INPUT : 0) | \
|
||||||
|
# ((Additive != FALSE) ? PROC_THREAD_ATTRIBUTE_ADDITIVE : 0))
|
||||||
|
|
||||||
|
def ProcThreadAttributeValue(Number, Thread, Input, Additive):
|
||||||
|
return ((Number & PROC_THREAD_ATTRIBUTE_NUMBER) |
|
||||||
|
(Thread and PROC_THREAD_ATTRIBUTE_THREAD) |
|
||||||
|
(Input and PROC_THREAD_ATTRIBUTE_INPUT) |
|
||||||
|
(Additive and PROC_THREAD_ATTRIBUTE_ADDITIVE))
|
||||||
|
|
||||||
from .ntstatus import *
|
from .ntstatus import *
|
||||||
from .winerror import *
|
from .winerror import *
|
||||||
BG_JOB_ENUM_ALL_USERS = make_flag("BG_JOB_ENUM_ALL_USERS", 0x0001)
|
BG_JOB_ENUM_ALL_USERS = make_flag("BG_JOB_ENUM_ALL_USERS", 0x0001)
|
||||||
@@ -1169,6 +1185,89 @@ PIPE_UNLIMITED_INSTANCES = make_flag("PIPE_UNLIMITED_INSTANCES", 255)
|
|||||||
NMPWAIT_WAIT_FOREVER = make_flag("NMPWAIT_WAIT_FOREVER", 0xffffffff)
|
NMPWAIT_WAIT_FOREVER = make_flag("NMPWAIT_WAIT_FOREVER", 0xffffffff)
|
||||||
NMPWAIT_NOWAIT = make_flag("NMPWAIT_NOWAIT", 0x00000001)
|
NMPWAIT_NOWAIT = make_flag("NMPWAIT_NOWAIT", 0x00000001)
|
||||||
NMPWAIT_USE_DEFAULT_WAIT = make_flag("NMPWAIT_USE_DEFAULT_WAIT", 0x00000000)
|
NMPWAIT_USE_DEFAULT_WAIT = make_flag("NMPWAIT_USE_DEFAULT_WAIT", 0x00000000)
|
||||||
|
ProcThreadAttributeParentProcess = make_flag("ProcThreadAttributeParentProcess", 0)
|
||||||
|
ProcThreadAttributeExtendedFlags = make_flag("ProcThreadAttributeExtendedFlags", 1)
|
||||||
|
ProcThreadAttributeHandleList = make_flag("ProcThreadAttributeHandleList", 2)
|
||||||
|
ProcThreadAttributeGroupAffinity = make_flag("ProcThreadAttributeGroupAffinity", 3)
|
||||||
|
ProcThreadAttributePreferredNode = make_flag("ProcThreadAttributePreferredNode", 4)
|
||||||
|
ProcThreadAttributeIdealProcessor = make_flag("ProcThreadAttributeIdealProcessor", 5)
|
||||||
|
ProcThreadAttributeUmsThread = make_flag("ProcThreadAttributeUmsThread", 6)
|
||||||
|
ProcThreadAttributeMitigationPolicy = make_flag("ProcThreadAttributeMitigationPolicy", 7)
|
||||||
|
ProcThreadAttributePackageFullName = make_flag("ProcThreadAttributePackageFullName", 8)
|
||||||
|
ProcThreadAttributeSecurityCapabilities = make_flag("ProcThreadAttributeSecurityCapabilities", 9)
|
||||||
|
ProcThreadAttributeConsoleReference = make_flag("ProcThreadAttributeConsoleReference", 10)
|
||||||
|
ProcThreadAttributeProtectionLevel = make_flag("ProcThreadAttributeProtectionLevel", 11)
|
||||||
|
ProcThreadAttributeOsMaxVersionTested = make_flag("ProcThreadAttributeOsMaxVersionTested", 12)
|
||||||
|
ProcThreadAttributeJobList = make_flag("ProcThreadAttributeJobList", 13)
|
||||||
|
ProcThreadAttributeChildProcessPolicy = make_flag("ProcThreadAttributeChildProcessPolicy", 14)
|
||||||
|
ProcThreadAttributeAllApplicationPackagesPolicy = make_flag("ProcThreadAttributeAllApplicationPackagesPolicy", 15)
|
||||||
|
ProcThreadAttributeWin32kFilter = make_flag("ProcThreadAttributeWin32kFilter", 16)
|
||||||
|
ProcThreadAttributeSafeOpenPromptOriginClaim = make_flag("ProcThreadAttributeSafeOpenPromptOriginClaim", 17)
|
||||||
|
ProcThreadAttributeDesktopAppPolicy = make_flag("ProcThreadAttributeDesktopAppPolicy", 18)
|
||||||
|
ProcThreadAttributeBnoIsolation = make_flag("ProcThreadAttributeBnoIsolation", 19)
|
||||||
|
ProcThreadAttributePseudoConsole = make_flag("ProcThreadAttributePseudoConsole", 22)
|
||||||
|
ProcThreadAttributeIsolationManifest = make_flag("ProcThreadAttributeIsolationManifest", 23)
|
||||||
|
ProcThreadAttributeMitigationAuditPolicy = make_flag("ProcThreadAttributeMitigationAuditPolicy", 24)
|
||||||
|
ProcThreadAttributeMachineType = make_flag("ProcThreadAttributeMachineType", 25)
|
||||||
|
ProcThreadAttributeComponentFilter = make_flag("ProcThreadAttributeComponentFilter", 26)
|
||||||
|
ProcThreadAttributeEnableOptionalXStateFeatures = make_flag("ProcThreadAttributeEnableOptionalXStateFeatures", 27)
|
||||||
|
ProcThreadAttributeCreateStore = make_flag("ProcThreadAttributeCreateStore", 28)
|
||||||
|
ProcThreadAttributeTrustedApp = make_flag("ProcThreadAttributeTrustedApp", 29)
|
||||||
|
ProcThreadAttributeSveVectorLength = make_flag("ProcThreadAttributeSveVectorLength", 30)
|
||||||
|
PROC_THREAD_ATTRIBUTE_NUMBER = make_flag("PROC_THREAD_ATTRIBUTE_NUMBER", 0x0000FFFF)
|
||||||
|
PROC_THREAD_ATTRIBUTE_THREAD = make_flag("PROC_THREAD_ATTRIBUTE_THREAD", 0x00010000)
|
||||||
|
PROC_THREAD_ATTRIBUTE_INPUT = make_flag("PROC_THREAD_ATTRIBUTE_INPUT", 0x00020000)
|
||||||
|
PROC_THREAD_ATTRIBUTE_ADDITIVE = make_flag("PROC_THREAD_ATTRIBUTE_ADDITIVE", 0x00040000)
|
||||||
|
PROC_THREAD_ATTRIBUTE_PARENT_PROCESS = make_flag("PROC_THREAD_ATTRIBUTE_PARENT_PROCESS", ProcThreadAttributeValue ( ProcThreadAttributeParentProcess , False , True , False ))
|
||||||
|
PROC_THREAD_ATTRIBUTE_HANDLE_LIST = make_flag("PROC_THREAD_ATTRIBUTE_HANDLE_LIST", ProcThreadAttributeValue ( ProcThreadAttributeHandleList , False , True , False ))
|
||||||
|
PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY = make_flag("PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY", ProcThreadAttributeValue ( ProcThreadAttributeGroupAffinity , True , True , False ))
|
||||||
|
PROC_THREAD_ATTRIBUTE_PREFERRED_NODE = make_flag("PROC_THREAD_ATTRIBUTE_PREFERRED_NODE", ProcThreadAttributeValue ( ProcThreadAttributePreferredNode , False , True , False ))
|
||||||
|
PROC_THREAD_ATTRIBUTE_IDEAL_PROCESSOR = make_flag("PROC_THREAD_ATTRIBUTE_IDEAL_PROCESSOR", ProcThreadAttributeValue ( ProcThreadAttributeIdealProcessor , True , True , False ))
|
||||||
|
PROC_THREAD_ATTRIBUTE_UMS_THREAD = make_flag("PROC_THREAD_ATTRIBUTE_UMS_THREAD", ProcThreadAttributeValue ( ProcThreadAttributeUmsThread , True , True , False ))
|
||||||
|
PROC_THREAD_ATTRIBUTE_MITIGATION_POLICY = make_flag("PROC_THREAD_ATTRIBUTE_MITIGATION_POLICY", ProcThreadAttributeValue ( ProcThreadAttributeMitigationPolicy , False , True , False ))
|
||||||
|
PROC_THREAD_ATTRIBUTE_SECURITY_CAPABILITIES = make_flag("PROC_THREAD_ATTRIBUTE_SECURITY_CAPABILITIES", ProcThreadAttributeValue ( ProcThreadAttributeSecurityCapabilities , False , True , False ))
|
||||||
|
PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL = make_flag("PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL", ProcThreadAttributeValue ( ProcThreadAttributeProtectionLevel , False , True , False ))
|
||||||
|
PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE = make_flag("PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE", ProcThreadAttributeValue ( ProcThreadAttributePseudoConsole , False , True , False ))
|
||||||
|
PROC_THREAD_ATTRIBUTE_MACHINE_TYPE = make_flag("PROC_THREAD_ATTRIBUTE_MACHINE_TYPE", ProcThreadAttributeValue ( ProcThreadAttributeMachineType , False , True , False ))
|
||||||
|
PROC_THREAD_ATTRIBUTE_ENABLE_OPTIONAL_XSTATE_FEATURES = make_flag("PROC_THREAD_ATTRIBUTE_ENABLE_OPTIONAL_XSTATE_FEATURES", ProcThreadAttributeValue ( ProcThreadAttributeEnableOptionalXStateFeatures , True , True , False ))
|
||||||
|
PROC_THREAD_ATTRIBUTE_SVE_VECTOR_LENGTH = make_flag("PROC_THREAD_ATTRIBUTE_SVE_VECTOR_LENGTH", ProcThreadAttributeValue ( ProcThreadAttributeSveVectorLength , False , True , False ))
|
||||||
|
PROCESSOR_INTEL_386 = make_flag("PROCESSOR_INTEL_386", 386)
|
||||||
|
PROCESSOR_INTEL_486 = make_flag("PROCESSOR_INTEL_486", 486)
|
||||||
|
PROCESSOR_INTEL_PENTIUM = make_flag("PROCESSOR_INTEL_PENTIUM", 586)
|
||||||
|
PROCESSOR_INTEL_IA64 = make_flag("PROCESSOR_INTEL_IA64", 2200)
|
||||||
|
PROCESSOR_MIPS_R4000 = make_flag("PROCESSOR_MIPS_R4000", 4000)
|
||||||
|
PROCESSOR_ALPHA_21064 = make_flag("PROCESSOR_ALPHA_21064", 21064)
|
||||||
|
PROCESSOR_PPC_601 = make_flag("PROCESSOR_PPC_601", 601)
|
||||||
|
PROCESSOR_PPC_603 = make_flag("PROCESSOR_PPC_603", 603)
|
||||||
|
PROCESSOR_PPC_604 = make_flag("PROCESSOR_PPC_604", 604)
|
||||||
|
PROCESSOR_PPC_620 = make_flag("PROCESSOR_PPC_620", 620)
|
||||||
|
PROCESSOR_HITACHI_SH3 = make_flag("PROCESSOR_HITACHI_SH3", 10003)
|
||||||
|
PROCESSOR_HITACHI_SH3E = make_flag("PROCESSOR_HITACHI_SH3E", 10004)
|
||||||
|
PROCESSOR_HITACHI_SH4 = make_flag("PROCESSOR_HITACHI_SH4", 10005)
|
||||||
|
PROCESSOR_MOTOROLA_821 = make_flag("PROCESSOR_MOTOROLA_821", 821)
|
||||||
|
PROCESSOR_SHx_SH3 = make_flag("PROCESSOR_SHx_SH3", 103)
|
||||||
|
PROCESSOR_SHx_SH4 = make_flag("PROCESSOR_SHx_SH4", 104)
|
||||||
|
PROCESSOR_STRONGARM = make_flag("PROCESSOR_STRONGARM", 2577)
|
||||||
|
PROCESSOR_ARM720 = make_flag("PROCESSOR_ARM720", 1824)
|
||||||
|
PROCESSOR_ARM820 = make_flag("PROCESSOR_ARM820", 2080)
|
||||||
|
PROCESSOR_ARM920 = make_flag("PROCESSOR_ARM920", 2336)
|
||||||
|
PROCESSOR_ARM_7TDMI = make_flag("PROCESSOR_ARM_7TDMI", 70001)
|
||||||
|
PROCESSOR_OPTIL = make_flag("PROCESSOR_OPTIL", 0x494f)
|
||||||
|
PROCESSOR_ARCHITECTURE_INTEL = make_flag("PROCESSOR_ARCHITECTURE_INTEL", 0)
|
||||||
|
PROCESSOR_ARCHITECTURE_MIPS = make_flag("PROCESSOR_ARCHITECTURE_MIPS", 1)
|
||||||
|
PROCESSOR_ARCHITECTURE_ALPHA = make_flag("PROCESSOR_ARCHITECTURE_ALPHA", 2)
|
||||||
|
PROCESSOR_ARCHITECTURE_PPC = make_flag("PROCESSOR_ARCHITECTURE_PPC", 3)
|
||||||
|
PROCESSOR_ARCHITECTURE_SHX = make_flag("PROCESSOR_ARCHITECTURE_SHX", 4)
|
||||||
|
PROCESSOR_ARCHITECTURE_ARM = make_flag("PROCESSOR_ARCHITECTURE_ARM", 5)
|
||||||
|
PROCESSOR_ARCHITECTURE_IA64 = make_flag("PROCESSOR_ARCHITECTURE_IA64", 6)
|
||||||
|
PROCESSOR_ARCHITECTURE_ALPHA64 = make_flag("PROCESSOR_ARCHITECTURE_ALPHA64", 7)
|
||||||
|
PROCESSOR_ARCHITECTURE_MSIL = make_flag("PROCESSOR_ARCHITECTURE_MSIL", 8)
|
||||||
|
PROCESSOR_ARCHITECTURE_AMD64 = make_flag("PROCESSOR_ARCHITECTURE_AMD64", 9)
|
||||||
|
PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 = make_flag("PROCESSOR_ARCHITECTURE_IA32_ON_WIN64", 10)
|
||||||
|
PROCESSOR_ARCHITECTURE_NEUTRAL = make_flag("PROCESSOR_ARCHITECTURE_NEUTRAL", 11)
|
||||||
|
PROCESSOR_ARCHITECTURE_ARM64 = make_flag("PROCESSOR_ARCHITECTURE_ARM64", 12)
|
||||||
|
PROCESSOR_ARCHITECTURE_ARM32_ON_WIN64 = make_flag("PROCESSOR_ARCHITECTURE_ARM32_ON_WIN64", 13)
|
||||||
|
PROCESSOR_ARCHITECTURE_UNKNOWN = make_flag("PROCESSOR_ARCHITECTURE_UNKNOWN", 0xFFFF)
|
||||||
HKEY_CLASSES_ROOT = make_flag("HKEY_CLASSES_ROOT", ( 0x80000000 ))
|
HKEY_CLASSES_ROOT = make_flag("HKEY_CLASSES_ROOT", ( 0x80000000 ))
|
||||||
HKEY_CURRENT_USER = make_flag("HKEY_CURRENT_USER", ( 0x80000001 ))
|
HKEY_CURRENT_USER = make_flag("HKEY_CURRENT_USER", ( 0x80000001 ))
|
||||||
HKEY_LOCAL_MACHINE = make_flag("HKEY_LOCAL_MACHINE", ( 0x80000002 ))
|
HKEY_LOCAL_MACHINE = make_flag("HKEY_LOCAL_MACHINE", ( 0x80000002 ))
|
||||||
@@ -1790,6 +1889,45 @@ SPC_MINIMAL_CRITERIA_OBJID = make_flag("SPC_MINIMAL_CRITERIA_OBJID", "1.3.6.1.4.
|
|||||||
SPC_FINANCIAL_CRITERIA_OBJID = make_flag("SPC_FINANCIAL_CRITERIA_OBJID", "1.3.6.1.4.1.311.2.1.27")
|
SPC_FINANCIAL_CRITERIA_OBJID = make_flag("SPC_FINANCIAL_CRITERIA_OBJID", "1.3.6.1.4.1.311.2.1.27")
|
||||||
SPC_LINK_OBJID = make_flag("SPC_LINK_OBJID", "1.3.6.1.4.1.311.2.1.28")
|
SPC_LINK_OBJID = make_flag("SPC_LINK_OBJID", "1.3.6.1.4.1.311.2.1.28")
|
||||||
SPC_SIGINFO_OBJID = make_flag("SPC_SIGINFO_OBJID", "1.3.6.1.4.1.311.2.1.30")
|
SPC_SIGINFO_OBJID = make_flag("SPC_SIGINFO_OBJID", "1.3.6.1.4.1.311.2.1.30")
|
||||||
|
CONTEXT_I386 = make_flag("CONTEXT_I386", 0x00010000)
|
||||||
|
CONTEXT_AMD64 = make_flag("CONTEXT_AMD64", 0x00100000)
|
||||||
|
CONTEXT_ARM = make_flag("CONTEXT_ARM", 0x00200000)
|
||||||
|
CONTEXT_ARM64 = make_flag("CONTEXT_ARM64", 0x00400000)
|
||||||
|
CONTEXT_i386 = make_flag("CONTEXT_i386", 0x00010000)
|
||||||
|
CONTEXT_i486 = make_flag("CONTEXT_i486", 0x00010000)
|
||||||
|
WOW64_CONTEXT_i386 = make_flag("WOW64_CONTEXT_i386", 0x00010000)
|
||||||
|
WOW64_CONTEXT_i486 = make_flag("WOW64_CONTEXT_i486", 0x00010000)
|
||||||
|
CONTEXT_CONTROL = make_flag("CONTEXT_CONTROL", 0x00000001)
|
||||||
|
CONTEXT_INTEGER = make_flag("CONTEXT_INTEGER", 0x00000002)
|
||||||
|
CONTEXT_SEGMENTS = make_flag("CONTEXT_SEGMENTS", 0x00000004)
|
||||||
|
CONTEXT_FLOATING_POINT = make_flag("CONTEXT_FLOATING_POINT", 0x00000008)
|
||||||
|
CONTEXT_DEBUG_REGISTERS = make_flag("CONTEXT_DEBUG_REGISTERS", 0x00000010)
|
||||||
|
CONTEXT_EXTENDED_REGISTERS = make_flag("CONTEXT_EXTENDED_REGISTERS", 0x00000020)
|
||||||
|
CONTEXT_FULL = make_flag("CONTEXT_FULL", ( CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS ))
|
||||||
|
CONTEXT_ALL = make_flag("CONTEXT_ALL", ( CONTEXT_FULL | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | CONTEXT_EXTENDED_REGISTERS ))
|
||||||
|
CONTEXT_XSTATE = make_flag("CONTEXT_XSTATE", ( CONTEXT_I386 | 0x00000040 ))
|
||||||
|
WOW64_CONTEXT_CONTROL = make_flag("WOW64_CONTEXT_CONTROL", ( WOW64_CONTEXT_i386 | 0x00000001 ))
|
||||||
|
WOW64_CONTEXT_INTEGER = make_flag("WOW64_CONTEXT_INTEGER", ( WOW64_CONTEXT_i386 | 0x00000002 ))
|
||||||
|
WOW64_CONTEXT_SEGMENTS = make_flag("WOW64_CONTEXT_SEGMENTS", ( WOW64_CONTEXT_i386 | 0x00000004 ))
|
||||||
|
WOW64_CONTEXT_FLOATING_POINT = make_flag("WOW64_CONTEXT_FLOATING_POINT", ( WOW64_CONTEXT_i386 | 0x00000008 ))
|
||||||
|
WOW64_CONTEXT_DEBUG_REGISTERS = make_flag("WOW64_CONTEXT_DEBUG_REGISTERS", ( WOW64_CONTEXT_i386 | 0x00000010 ))
|
||||||
|
WOW64_CONTEXT_EXTENDED_REGISTERS = make_flag("WOW64_CONTEXT_EXTENDED_REGISTERS", ( WOW64_CONTEXT_i386 | 0x00000020 ))
|
||||||
|
WOW64_CONTEXT_FULL = make_flag("WOW64_CONTEXT_FULL", ( WOW64_CONTEXT_CONTROL | WOW64_CONTEXT_INTEGER | WOW64_CONTEXT_SEGMENTS ))
|
||||||
|
WOW64_CONTEXT_ALL = make_flag("WOW64_CONTEXT_ALL", ( WOW64_CONTEXT_CONTROL | WOW64_CONTEXT_INTEGER | WOW64_CONTEXT_SEGMENTS | WOW64_CONTEXT_FLOATING_POINT | WOW64_CONTEXT_DEBUG_REGISTERS | WOW64_CONTEXT_EXTENDED_REGISTERS ))
|
||||||
|
WOW64_CONTEXT_XSTATE = make_flag("WOW64_CONTEXT_XSTATE", ( WOW64_CONTEXT_i386 | 0x00000040 ))
|
||||||
|
WOW64_CONTEXT_EXCEPTION_ACTIVE = make_flag("WOW64_CONTEXT_EXCEPTION_ACTIVE", 0x08000000)
|
||||||
|
WOW64_CONTEXT_SERVICE_ACTIVE = make_flag("WOW64_CONTEXT_SERVICE_ACTIVE", 0x10000000)
|
||||||
|
WOW64_CONTEXT_EXCEPTION_REQUEST = make_flag("WOW64_CONTEXT_EXCEPTION_REQUEST", 0x40000000)
|
||||||
|
WOW64_CONTEXT_EXCEPTION_REPORTING = make_flag("WOW64_CONTEXT_EXCEPTION_REPORTING", 0x80000000)
|
||||||
|
CONTEXT_ARM64_CONTROL = make_flag("CONTEXT_ARM64_CONTROL", ( CONTEXT_ARM64 | 0x1 ))
|
||||||
|
CONTEXT_ARM64_INTEGER = make_flag("CONTEXT_ARM64_INTEGER", ( CONTEXT_ARM64 | 0x2 ))
|
||||||
|
CONTEXT_ARM64_FLOATING_POINT = make_flag("CONTEXT_ARM64_FLOATING_POINT", ( CONTEXT_ARM64 | 0x4 ))
|
||||||
|
CONTEXT_ARM64_DEBUG_REGISTERS = make_flag("CONTEXT_ARM64_DEBUG_REGISTERS", ( CONTEXT_ARM64 | 0x8 ))
|
||||||
|
CONTEXT_ARM64_X18 = make_flag("CONTEXT_ARM64_X18", ( CONTEXT_ARM64 | 0x10 ))
|
||||||
|
CONTEXT_UNWOUND_TO_CALL = make_flag("CONTEXT_UNWOUND_TO_CALL", 0x20000000)
|
||||||
|
CONTEXT_RET_TO_GUEST = make_flag("CONTEXT_RET_TO_GUEST", 0x04000000)
|
||||||
|
ARM64_MAX_BREAKPOINTS = make_flag("ARM64_MAX_BREAKPOINTS", 8)
|
||||||
|
ARM64_MAX_WATCHPOINTS = make_flag("ARM64_MAX_WATCHPOINTS", 2)
|
||||||
FILE_VER_GET_LOCALISED = make_flag("FILE_VER_GET_LOCALISED", 0x01)
|
FILE_VER_GET_LOCALISED = make_flag("FILE_VER_GET_LOCALISED", 0x01)
|
||||||
FILE_VER_GET_NEUTRAL = make_flag("FILE_VER_GET_NEUTRAL", 0x02)
|
FILE_VER_GET_NEUTRAL = make_flag("FILE_VER_GET_NEUTRAL", 0x02)
|
||||||
FILE_VER_GET_PREFETCHED = make_flag("FILE_VER_GET_PREFETCHED", 0x04)
|
FILE_VER_GET_PREFETCHED = make_flag("FILE_VER_GET_PREFETCHED", 0x04)
|
||||||
@@ -1901,19 +2039,6 @@ TH32CS_SNAPMODULE = make_flag("TH32CS_SNAPMODULE", 0x00000008)
|
|||||||
TH32CS_SNAPMODULE32 = make_flag("TH32CS_SNAPMODULE32", 0x00000010)
|
TH32CS_SNAPMODULE32 = make_flag("TH32CS_SNAPMODULE32", 0x00000010)
|
||||||
TH32CS_SNAPALL = make_flag("TH32CS_SNAPALL", ( TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE ))
|
TH32CS_SNAPALL = make_flag("TH32CS_SNAPALL", ( TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE ))
|
||||||
TH32CS_INHERIT = make_flag("TH32CS_INHERIT", 0x80000000)
|
TH32CS_INHERIT = make_flag("TH32CS_INHERIT", 0x80000000)
|
||||||
CONTEXT_I386 = make_flag("CONTEXT_I386", 0x00010000)
|
|
||||||
CONTEXT_AMD64 = make_flag("CONTEXT_AMD64", 0x00100000)
|
|
||||||
CONTEXT_ARM = make_flag("CONTEXT_ARM", 0x00200000)
|
|
||||||
CONTEXT_ARM64 = make_flag("CONTEXT_ARM64", 0x00400000)
|
|
||||||
CONTEXT_CONTROL = make_flag("CONTEXT_CONTROL", 0x00000001)
|
|
||||||
CONTEXT_INTEGER = make_flag("CONTEXT_INTEGER", 0x00000002)
|
|
||||||
CONTEXT_SEGMENTS = make_flag("CONTEXT_SEGMENTS", 0x00000004)
|
|
||||||
CONTEXT_FLOATING_POINT = make_flag("CONTEXT_FLOATING_POINT", 0x00000008)
|
|
||||||
CONTEXT_DEBUG_REGISTERS = make_flag("CONTEXT_DEBUG_REGISTERS", 0x00000010)
|
|
||||||
CONTEXT_EXTENDED_REGISTERS = make_flag("CONTEXT_EXTENDED_REGISTERS", 0x00000020)
|
|
||||||
CONTEXT_FULL = make_flag("CONTEXT_FULL", ( CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS ))
|
|
||||||
CONTEXT_ALL = make_flag("CONTEXT_ALL", ( CONTEXT_FULL | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | CONTEXT_EXTENDED_REGISTERS ))
|
|
||||||
CONTEXT_XSTATE = make_flag("CONTEXT_XSTATE", ( CONTEXT_I386 | 0x00000040 ))
|
|
||||||
PAGE_NOACCESS = make_flag("PAGE_NOACCESS", 0x01)
|
PAGE_NOACCESS = make_flag("PAGE_NOACCESS", 0x01)
|
||||||
PAGE_READONLY = make_flag("PAGE_READONLY", 0x02)
|
PAGE_READONLY = make_flag("PAGE_READONLY", 0x02)
|
||||||
PAGE_READWRITE = make_flag("PAGE_READWRITE", 0x04)
|
PAGE_READWRITE = make_flag("PAGE_READWRITE", 0x04)
|
||||||
@@ -2946,6 +3071,7 @@ IMAGE_FILE_MACHINE_AMD64 = make_flag("IMAGE_FILE_MACHINE_AMD64", 0x8664)
|
|||||||
IMAGE_FILE_MACHINE_M32R = make_flag("IMAGE_FILE_MACHINE_M32R", 0x9041)
|
IMAGE_FILE_MACHINE_M32R = make_flag("IMAGE_FILE_MACHINE_M32R", 0x9041)
|
||||||
IMAGE_FILE_MACHINE_CEE = make_flag("IMAGE_FILE_MACHINE_CEE", 0xC0EE)
|
IMAGE_FILE_MACHINE_CEE = make_flag("IMAGE_FILE_MACHINE_CEE", 0xC0EE)
|
||||||
IMAGE_FILE_MACHINE_ARM64 = make_flag("IMAGE_FILE_MACHINE_ARM64", 0xAA64)
|
IMAGE_FILE_MACHINE_ARM64 = make_flag("IMAGE_FILE_MACHINE_ARM64", 0xAA64)
|
||||||
|
IMAGE_FILE_MACHINE_TARGET_HOST = make_flag("IMAGE_FILE_MACHINE_TARGET_HOST", 0x0001)
|
||||||
CERT_QUERY_OBJECT_FILE = make_flag("CERT_QUERY_OBJECT_FILE", 0x00000001)
|
CERT_QUERY_OBJECT_FILE = make_flag("CERT_QUERY_OBJECT_FILE", 0x00000001)
|
||||||
CERT_QUERY_OBJECT_BLOB = make_flag("CERT_QUERY_OBJECT_BLOB", 0x00000002)
|
CERT_QUERY_OBJECT_BLOB = make_flag("CERT_QUERY_OBJECT_BLOB", 0x00000002)
|
||||||
CERT_QUERY_CONTENT_CERT = make_flag("CERT_QUERY_CONTENT_CERT", 1)
|
CERT_QUERY_CONTENT_CERT = make_flag("CERT_QUERY_CONTENT_CERT", 1)
|
||||||
|
|||||||
@@ -1735,6 +1735,16 @@ LoadLibraryExWParams = ((1, 'lpLibFileName'), (1, 'hFile'), (1, 'dwFlags'))
|
|||||||
FreeLibraryPrototype = WINFUNCTYPE(BOOL, HMODULE)
|
FreeLibraryPrototype = WINFUNCTYPE(BOOL, HMODULE)
|
||||||
FreeLibraryParams = ((1, 'hLibModule'),)
|
FreeLibraryParams = ((1, 'hLibModule'),)
|
||||||
|
|
||||||
|
#def GetProcessInformation(hProcess, ProcessInformationClass, ProcessInformation, ProcessInformationSize):
|
||||||
|
# return GetProcessInformation.ctypes_function(hProcess, ProcessInformationClass, ProcessInformation, ProcessInformationSize)
|
||||||
|
GetProcessInformationPrototype = WINFUNCTYPE(BOOL, HANDLE, PROCESS_INFORMATION_CLASS, LPVOID, DWORD)
|
||||||
|
GetProcessInformationParams = ((1, 'hProcess'), (1, 'ProcessInformationClass'), (1, 'ProcessInformation'), (1, 'ProcessInformationSize'))
|
||||||
|
|
||||||
|
#def SetProcessInformation(hProcess, ProcessInformationClass, ProcessInformation, ProcessInformationSize):
|
||||||
|
# return SetProcessInformation.ctypes_function(hProcess, ProcessInformationClass, ProcessInformation, ProcessInformationSize)
|
||||||
|
SetProcessInformationPrototype = WINFUNCTYPE(BOOL, HANDLE, PROCESS_INFORMATION_CLASS, LPVOID, DWORD)
|
||||||
|
SetProcessInformationParams = ((1, 'hProcess'), (1, 'ProcessInformationClass'), (1, 'ProcessInformation'), (1, 'ProcessInformationSize'))
|
||||||
|
|
||||||
#def RtlGetCurrentPeb():
|
#def RtlGetCurrentPeb():
|
||||||
# return RtlGetCurrentPeb.ctypes_function()
|
# return RtlGetCurrentPeb.ctypes_function()
|
||||||
RtlGetCurrentPebPrototype = WINFUNCTYPE(PVOID)
|
RtlGetCurrentPebPrototype = WINFUNCTYPE(PVOID)
|
||||||
@@ -3030,6 +3040,96 @@ LookupAccountNameAParams = ((1, 'lpSystemName'), (1, 'lpAccountName'), (1, 'Sid'
|
|||||||
LookupAccountNameWPrototype = WINFUNCTYPE(BOOL, LPCWSTR, LPCWSTR, PSID, LPDWORD, LPWSTR, LPDWORD, PSID_NAME_USE)
|
LookupAccountNameWPrototype = WINFUNCTYPE(BOOL, LPCWSTR, LPCWSTR, PSID, LPDWORD, LPWSTR, LPDWORD, PSID_NAME_USE)
|
||||||
LookupAccountNameWParams = ((1, 'lpSystemName'), (1, 'lpAccountName'), (1, 'Sid'), (1, 'cbSid'), (1, 'ReferencedDomainName'), (1, 'cchReferencedDomainName'), (1, 'peUse'))
|
LookupAccountNameWParams = ((1, 'lpSystemName'), (1, 'lpAccountName'), (1, 'Sid'), (1, 'cbSid'), (1, 'ReferencedDomainName'), (1, 'cchReferencedDomainName'), (1, 'peUse'))
|
||||||
|
|
||||||
|
#def GetNativeSystemInfo(lpSystemInfo):
|
||||||
|
# return GetNativeSystemInfo.ctypes_function(lpSystemInfo)
|
||||||
|
GetNativeSystemInfoPrototype = WINFUNCTYPE(PVOID, LPSYSTEM_INFO)
|
||||||
|
GetNativeSystemInfoParams = ((1, 'lpSystemInfo'),)
|
||||||
|
|
||||||
|
#def GetSystemInfo(lpSystemInfo):
|
||||||
|
# return GetSystemInfo.ctypes_function(lpSystemInfo)
|
||||||
|
GetSystemInfoPrototype = WINFUNCTYPE(PVOID, LPSYSTEM_INFO)
|
||||||
|
GetSystemInfoParams = ((1, 'lpSystemInfo'),)
|
||||||
|
|
||||||
|
#def IsWow64Process(hProcess, Wow64Process):
|
||||||
|
# return IsWow64Process.ctypes_function(hProcess, Wow64Process)
|
||||||
|
IsWow64ProcessPrototype = WINFUNCTYPE(BOOL, HANDLE, PBOOL)
|
||||||
|
IsWow64ProcessParams = ((1, 'hProcess'), (1, 'Wow64Process'))
|
||||||
|
|
||||||
|
#def IsWow64Process2(hProcess, pProcessMachine, pNativeMachine):
|
||||||
|
# return IsWow64Process2.ctypes_function(hProcess, pProcessMachine, pNativeMachine)
|
||||||
|
IsWow64Process2Prototype = WINFUNCTYPE(BOOL, HANDLE, POINTER(USHORT), POINTER(USHORT))
|
||||||
|
IsWow64Process2Params = ((1, 'hProcess'), (1, 'pProcessMachine'), (1, 'pNativeMachine'))
|
||||||
|
|
||||||
|
#def IsWow64GuestMachineSupported(WowGuestMachine, MachineIsSupported):
|
||||||
|
# return IsWow64GuestMachineSupported.ctypes_function(WowGuestMachine, MachineIsSupported)
|
||||||
|
IsWow64GuestMachineSupportedPrototype = WINFUNCTYPE(HRESULT, USHORT, POINTER(BOOL))
|
||||||
|
IsWow64GuestMachineSupportedParams = ((1, 'WowGuestMachine'), (1, 'MachineIsSupported'))
|
||||||
|
|
||||||
|
#def GetSystemWow64DirectoryA(lpBuffer, uSize):
|
||||||
|
# return GetSystemWow64DirectoryA.ctypes_function(lpBuffer, uSize)
|
||||||
|
GetSystemWow64DirectoryAPrototype = WINFUNCTYPE(UINT, LPSTR, UINT)
|
||||||
|
GetSystemWow64DirectoryAParams = ((1, 'lpBuffer'), (1, 'uSize'))
|
||||||
|
|
||||||
|
#def GetSystemWow64DirectoryW(lpBuffer, uSize):
|
||||||
|
# return GetSystemWow64DirectoryW.ctypes_function(lpBuffer, uSize)
|
||||||
|
GetSystemWow64DirectoryWPrototype = WINFUNCTYPE(UINT, LPWSTR, UINT)
|
||||||
|
GetSystemWow64DirectoryWParams = ((1, 'lpBuffer'), (1, 'uSize'))
|
||||||
|
|
||||||
|
#def GetSystemWow64Directory2A(lpBuffer, uSize, ImageFileMachineType):
|
||||||
|
# return GetSystemWow64Directory2A.ctypes_function(lpBuffer, uSize, ImageFileMachineType)
|
||||||
|
GetSystemWow64Directory2APrototype = WINFUNCTYPE(UINT, LPSTR, UINT, WORD)
|
||||||
|
GetSystemWow64Directory2AParams = ((1, 'lpBuffer'), (1, 'uSize'), (1, 'ImageFileMachineType'))
|
||||||
|
|
||||||
|
#def GetSystemWow64Directory2W(lpBuffer, uSize, ImageFileMachineType):
|
||||||
|
# return GetSystemWow64Directory2W.ctypes_function(lpBuffer, uSize, ImageFileMachineType)
|
||||||
|
GetSystemWow64Directory2WPrototype = WINFUNCTYPE(UINT, LPWSTR, UINT, WORD)
|
||||||
|
GetSystemWow64Directory2WParams = ((1, 'lpBuffer'), (1, 'uSize'), (1, 'ImageFileMachineType'))
|
||||||
|
|
||||||
|
#def Wow64DisableWow64FsRedirection(OldValue):
|
||||||
|
# return Wow64DisableWow64FsRedirection.ctypes_function(OldValue)
|
||||||
|
Wow64DisableWow64FsRedirectionPrototype = WINFUNCTYPE(BOOL, POINTER(PVOID))
|
||||||
|
Wow64DisableWow64FsRedirectionParams = ((1, 'OldValue'),)
|
||||||
|
|
||||||
|
#def Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection):
|
||||||
|
# return Wow64EnableWow64FsRedirection.ctypes_function(Wow64FsEnableRedirection)
|
||||||
|
Wow64EnableWow64FsRedirectionPrototype = WINFUNCTYPE(BOOLEAN, BOOLEAN)
|
||||||
|
Wow64EnableWow64FsRedirectionParams = ((1, 'Wow64FsEnableRedirection'),)
|
||||||
|
|
||||||
|
#def Wow64RevertWow64FsRedirection(OlValue):
|
||||||
|
# return Wow64RevertWow64FsRedirection.ctypes_function(OlValue)
|
||||||
|
Wow64RevertWow64FsRedirectionPrototype = WINFUNCTYPE(BOOL, PVOID)
|
||||||
|
Wow64RevertWow64FsRedirectionParams = ((1, 'OlValue'),)
|
||||||
|
|
||||||
|
#def Wow64GetThreadContext(hThread, lpContext):
|
||||||
|
# return Wow64GetThreadContext.ctypes_function(hThread, lpContext)
|
||||||
|
Wow64GetThreadContextPrototype = WINFUNCTYPE(BOOL, HANDLE, PWOW64_CONTEXT)
|
||||||
|
Wow64GetThreadContextParams = ((1, 'hThread'), (1, 'lpContext'))
|
||||||
|
|
||||||
|
#def Wow64SetThreadContext(hThread, lpContext):
|
||||||
|
# return Wow64SetThreadContext.ctypes_function(hThread, lpContext)
|
||||||
|
Wow64SetThreadContextPrototype = WINFUNCTYPE(BOOL, HANDLE, POINTER(WOW64_CONTEXT))
|
||||||
|
Wow64SetThreadContextParams = ((1, 'hThread'), (1, 'lpContext'))
|
||||||
|
|
||||||
|
#def Wow64SetThreadDefaultGuestMachine(Machine):
|
||||||
|
# return Wow64SetThreadDefaultGuestMachine.ctypes_function(Machine)
|
||||||
|
Wow64SetThreadDefaultGuestMachinePrototype = WINFUNCTYPE(USHORT, USHORT)
|
||||||
|
Wow64SetThreadDefaultGuestMachineParams = ((1, 'Machine'),)
|
||||||
|
|
||||||
|
#def Wow64SuspendThread(hThread):
|
||||||
|
# return Wow64SuspendThread.ctypes_function(hThread)
|
||||||
|
Wow64SuspendThreadPrototype = WINFUNCTYPE(DWORD, HANDLE)
|
||||||
|
Wow64SuspendThreadParams = ((1, 'hThread'),)
|
||||||
|
|
||||||
|
#def NtWow64ReadVirtualMemory64(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesRead):
|
||||||
|
# return NtWow64ReadVirtualMemory64.ctypes_function(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesRead)
|
||||||
|
NtWow64ReadVirtualMemory64Prototype = WINFUNCTYPE(NTSTATUS, HANDLE, ULONG64, LPVOID, ULONG64, PULONG64)
|
||||||
|
NtWow64ReadVirtualMemory64Params = ((1, 'hProcess'), (1, 'lpBaseAddress'), (1, 'lpBuffer'), (1, 'nSize'), (1, 'lpNumberOfBytesRead'))
|
||||||
|
|
||||||
|
#def NtWow64WriteVirtualMemory64(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesWritten):
|
||||||
|
# return NtWow64WriteVirtualMemory64.ctypes_function(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesWritten)
|
||||||
|
NtWow64WriteVirtualMemory64Prototype = WINFUNCTYPE(NTSTATUS, HANDLE, ULONG64, LPVOID, ULONG64, PULONG64)
|
||||||
|
NtWow64WriteVirtualMemory64Params = ((1, 'hProcess'), (1, 'lpBaseAddress'), (1, 'lpBuffer'), (1, 'nSize'), (1, 'lpNumberOfBytesWritten'))
|
||||||
|
|
||||||
#def FileTimeToSystemTime(lpFileTime, lpSystemTime):
|
#def FileTimeToSystemTime(lpFileTime, lpSystemTime):
|
||||||
# return FileTimeToSystemTime.ctypes_function(lpFileTime, lpSystemTime)
|
# return FileTimeToSystemTime.ctypes_function(lpFileTime, lpSystemTime)
|
||||||
FileTimeToSystemTimePrototype = WINFUNCTYPE(BOOL, POINTER(FILETIME), LPSYSTEMTIME)
|
FileTimeToSystemTimePrototype = WINFUNCTYPE(BOOL, POINTER(FILETIME), LPSYSTEMTIME)
|
||||||
@@ -3370,6 +3470,11 @@ CreateThreadParams = ((1, 'lpThreadAttributes'), (1, 'dwStackSize'), (1, 'lpStar
|
|||||||
CreateRemoteThreadPrototype = WINFUNCTYPE(HANDLE, HANDLE, LPSECURITY_ATTRIBUTES, SIZE_T, LPTHREAD_START_ROUTINE, LPVOID, DWORD, LPDWORD)
|
CreateRemoteThreadPrototype = WINFUNCTYPE(HANDLE, HANDLE, LPSECURITY_ATTRIBUTES, SIZE_T, LPTHREAD_START_ROUTINE, LPVOID, DWORD, LPDWORD)
|
||||||
CreateRemoteThreadParams = ((1, 'hProcess'), (1, 'lpThreadAttributes'), (1, 'dwStackSize'), (1, 'lpStartAddress'), (1, 'lpParameter'), (1, 'dwCreationFlags'), (1, 'lpThreadId'))
|
CreateRemoteThreadParams = ((1, 'hProcess'), (1, 'lpThreadAttributes'), (1, 'dwStackSize'), (1, 'lpStartAddress'), (1, 'lpParameter'), (1, 'dwCreationFlags'), (1, 'lpThreadId'))
|
||||||
|
|
||||||
|
#def CreateRemoteThreadEx(hProcess, lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpAttributeList, lpThreadId):
|
||||||
|
# return CreateRemoteThreadEx.ctypes_function(hProcess, lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpAttributeList, lpThreadId)
|
||||||
|
CreateRemoteThreadExPrototype = WINFUNCTYPE(HANDLE, HANDLE, LPSECURITY_ATTRIBUTES, SIZE_T, LPTHREAD_START_ROUTINE, LPVOID, DWORD, LPPROC_THREAD_ATTRIBUTE_LIST, LPDWORD)
|
||||||
|
CreateRemoteThreadExParams = ((1, 'hProcess'), (1, 'lpThreadAttributes'), (1, 'dwStackSize'), (1, 'lpStartAddress'), (1, 'lpParameter'), (1, 'dwCreationFlags'), (1, 'lpAttributeList'), (1, 'lpThreadId'))
|
||||||
|
|
||||||
#def CreateProcessA(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation):
|
#def CreateProcessA(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation):
|
||||||
# return CreateProcessA.ctypes_function(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation)
|
# return CreateProcessA.ctypes_function(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation)
|
||||||
CreateProcessAPrototype = WINFUNCTYPE(BOOL, LPCSTR, LPSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, BOOL, DWORD, LPVOID, LPCSTR, LPSTARTUPINFOA, LPPROCESS_INFORMATION)
|
CreateProcessAPrototype = WINFUNCTYPE(BOOL, LPCSTR, LPSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, BOOL, DWORD, LPVOID, LPCSTR, LPSTARTUPINFOA, LPPROCESS_INFORMATION)
|
||||||
@@ -3420,21 +3525,11 @@ CloseHandleParams = ((1, 'hObject'),)
|
|||||||
ReadProcessMemoryPrototype = WINFUNCTYPE(BOOL, HANDLE, LPCVOID, LPVOID, SIZE_T, POINTER(SIZE_T))
|
ReadProcessMemoryPrototype = WINFUNCTYPE(BOOL, HANDLE, LPCVOID, LPVOID, SIZE_T, POINTER(SIZE_T))
|
||||||
ReadProcessMemoryParams = ((1, 'hProcess'), (1, 'lpBaseAddress'), (1, 'lpBuffer'), (1, 'nSize'), (1, 'lpNumberOfBytesRead'))
|
ReadProcessMemoryParams = ((1, 'hProcess'), (1, 'lpBaseAddress'), (1, 'lpBuffer'), (1, 'nSize'), (1, 'lpNumberOfBytesRead'))
|
||||||
|
|
||||||
#def NtWow64ReadVirtualMemory64(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesRead):
|
|
||||||
# return NtWow64ReadVirtualMemory64.ctypes_function(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesRead)
|
|
||||||
NtWow64ReadVirtualMemory64Prototype = WINFUNCTYPE(NTSTATUS, HANDLE, ULONG64, LPVOID, ULONG64, PULONG64)
|
|
||||||
NtWow64ReadVirtualMemory64Params = ((1, 'hProcess'), (1, 'lpBaseAddress'), (1, 'lpBuffer'), (1, 'nSize'), (1, 'lpNumberOfBytesRead'))
|
|
||||||
|
|
||||||
#def WriteProcessMemory(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesWritten):
|
#def WriteProcessMemory(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesWritten):
|
||||||
# return WriteProcessMemory.ctypes_function(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesWritten)
|
# return WriteProcessMemory.ctypes_function(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesWritten)
|
||||||
WriteProcessMemoryPrototype = WINFUNCTYPE(BOOL, HANDLE, LPVOID, LPCVOID, SIZE_T, POINTER(SIZE_T))
|
WriteProcessMemoryPrototype = WINFUNCTYPE(BOOL, HANDLE, LPVOID, LPCVOID, SIZE_T, POINTER(SIZE_T))
|
||||||
WriteProcessMemoryParams = ((1, 'hProcess'), (1, 'lpBaseAddress'), (1, 'lpBuffer'), (1, 'nSize'), (1, 'lpNumberOfBytesWritten'))
|
WriteProcessMemoryParams = ((1, 'hProcess'), (1, 'lpBaseAddress'), (1, 'lpBuffer'), (1, 'nSize'), (1, 'lpNumberOfBytesWritten'))
|
||||||
|
|
||||||
#def NtWow64WriteVirtualMemory64(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesWritten):
|
|
||||||
# return NtWow64WriteVirtualMemory64.ctypes_function(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesWritten)
|
|
||||||
NtWow64WriteVirtualMemory64Prototype = WINFUNCTYPE(NTSTATUS, HANDLE, ULONG64, LPVOID, ULONG64, PULONG64)
|
|
||||||
NtWow64WriteVirtualMemory64Params = ((1, 'hProcess'), (1, 'lpBaseAddress'), (1, 'lpBuffer'), (1, 'nSize'), (1, 'lpNumberOfBytesWritten'))
|
|
||||||
|
|
||||||
#def GetCurrentProcess():
|
#def GetCurrentProcess():
|
||||||
# return GetCurrentProcess.ctypes_function()
|
# return GetCurrentProcess.ctypes_function()
|
||||||
GetCurrentProcessPrototype = WINFUNCTYPE(HANDLE)
|
GetCurrentProcessPrototype = WINFUNCTYPE(HANDLE)
|
||||||
@@ -3665,26 +3760,6 @@ GetThreadIdParams = ((1, 'Thread'),)
|
|||||||
DeviceIoControlPrototype = WINFUNCTYPE(BOOL, HANDLE, DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPOVERLAPPED)
|
DeviceIoControlPrototype = WINFUNCTYPE(BOOL, HANDLE, DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPOVERLAPPED)
|
||||||
DeviceIoControlParams = ((1, 'hDevice'), (1, 'dwIoControlCode'), (1, 'lpInBuffer'), (1, 'nInBufferSize'), (1, 'lpOutBuffer'), (1, 'nOutBufferSize'), (1, 'lpBytesReturned'), (1, 'lpOverlapped'))
|
DeviceIoControlParams = ((1, 'hDevice'), (1, 'dwIoControlCode'), (1, 'lpInBuffer'), (1, 'nInBufferSize'), (1, 'lpOutBuffer'), (1, 'nOutBufferSize'), (1, 'lpBytesReturned'), (1, 'lpOverlapped'))
|
||||||
|
|
||||||
#def Wow64DisableWow64FsRedirection(OldValue):
|
|
||||||
# return Wow64DisableWow64FsRedirection.ctypes_function(OldValue)
|
|
||||||
Wow64DisableWow64FsRedirectionPrototype = WINFUNCTYPE(BOOL, POINTER(PVOID))
|
|
||||||
Wow64DisableWow64FsRedirectionParams = ((1, 'OldValue'),)
|
|
||||||
|
|
||||||
#def Wow64RevertWow64FsRedirection(OldValue):
|
|
||||||
# return Wow64RevertWow64FsRedirection.ctypes_function(OldValue)
|
|
||||||
Wow64RevertWow64FsRedirectionPrototype = WINFUNCTYPE(BOOL, PVOID)
|
|
||||||
Wow64RevertWow64FsRedirectionParams = ((1, 'OldValue'),)
|
|
||||||
|
|
||||||
#def Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection):
|
|
||||||
# return Wow64EnableWow64FsRedirection.ctypes_function(Wow64FsEnableRedirection)
|
|
||||||
Wow64EnableWow64FsRedirectionPrototype = WINFUNCTYPE(BOOLEAN, BOOLEAN)
|
|
||||||
Wow64EnableWow64FsRedirectionParams = ((1, 'Wow64FsEnableRedirection'),)
|
|
||||||
|
|
||||||
#def Wow64GetThreadContext(hThread, lpContext):
|
|
||||||
# return Wow64GetThreadContext.ctypes_function(hThread, lpContext)
|
|
||||||
Wow64GetThreadContextPrototype = WINFUNCTYPE(BOOL, HANDLE, PWOW64_CONTEXT)
|
|
||||||
Wow64GetThreadContextParams = ((1, 'hThread'), (1, 'lpContext'))
|
|
||||||
|
|
||||||
#def SetConsoleCtrlHandler(HandlerRoutine, Add):
|
#def SetConsoleCtrlHandler(HandlerRoutine, Add):
|
||||||
# return SetConsoleCtrlHandler.ctypes_function(HandlerRoutine, Add)
|
# return SetConsoleCtrlHandler.ctypes_function(HandlerRoutine, Add)
|
||||||
SetConsoleCtrlHandlerPrototype = WINFUNCTYPE(BOOL, PHANDLER_ROUTINE, BOOL)
|
SetConsoleCtrlHandlerPrototype = WINFUNCTYPE(BOOL, PHANDLER_ROUTINE, BOOL)
|
||||||
@@ -3820,11 +3895,6 @@ DebugBreakProcessParams = ((1, 'Process'),)
|
|||||||
GetProcessIdPrototype = WINFUNCTYPE(DWORD, HANDLE)
|
GetProcessIdPrototype = WINFUNCTYPE(DWORD, HANDLE)
|
||||||
GetProcessIdParams = ((1, 'Process'),)
|
GetProcessIdParams = ((1, 'Process'),)
|
||||||
|
|
||||||
#def Wow64SetThreadContext(hThread, lpContext):
|
|
||||||
# return Wow64SetThreadContext.ctypes_function(hThread, lpContext)
|
|
||||||
Wow64SetThreadContextPrototype = WINFUNCTYPE(BOOL, HANDLE, POINTER(WOW64_CONTEXT))
|
|
||||||
Wow64SetThreadContextParams = ((1, 'hThread'), (1, 'lpContext'))
|
|
||||||
|
|
||||||
#def GetMappedFileNameW(hProcess, lpv, lpFilename, nSize):
|
#def GetMappedFileNameW(hProcess, lpv, lpFilename, nSize):
|
||||||
# return GetMappedFileNameW.ctypes_function(hProcess, lpv, lpFilename, nSize)
|
# return GetMappedFileNameW.ctypes_function(hProcess, lpv, lpFilename, nSize)
|
||||||
GetMappedFileNameWPrototype = WINFUNCTYPE(DWORD, HANDLE, LPVOID, PVOID, DWORD)
|
GetMappedFileNameWPrototype = WINFUNCTYPE(DWORD, HANDLE, LPVOID, PVOID, DWORD)
|
||||||
|
|||||||
+518
-345
@@ -3595,6 +3595,187 @@ class _IMAGE_LOAD_CONFIG_DIRECTORY64(Structure):
|
|||||||
IMAGE_LOAD_CONFIG_DIRECTORY64 = _IMAGE_LOAD_CONFIG_DIRECTORY64
|
IMAGE_LOAD_CONFIG_DIRECTORY64 = _IMAGE_LOAD_CONFIG_DIRECTORY64
|
||||||
PIMAGE_LOAD_CONFIG_DIRECTORY64 = POINTER(_IMAGE_LOAD_CONFIG_DIRECTORY64)
|
PIMAGE_LOAD_CONFIG_DIRECTORY64 = POINTER(_IMAGE_LOAD_CONFIG_DIRECTORY64)
|
||||||
|
|
||||||
|
ProcThreadAttributeParentProcess = EnumValue("_PROC_THREAD_ATTRIBUTE_NUM", "ProcThreadAttributeParentProcess", 0x0)
|
||||||
|
ProcThreadAttributeHandleList = EnumValue("_PROC_THREAD_ATTRIBUTE_NUM", "ProcThreadAttributeHandleList", 0x2)
|
||||||
|
ProcThreadAttributeGroupAffinity = EnumValue("_PROC_THREAD_ATTRIBUTE_NUM", "ProcThreadAttributeGroupAffinity", 0x3)
|
||||||
|
ProcThreadAttributePreferredNode = EnumValue("_PROC_THREAD_ATTRIBUTE_NUM", "ProcThreadAttributePreferredNode", 0x4)
|
||||||
|
ProcThreadAttributeIdealProcessor = EnumValue("_PROC_THREAD_ATTRIBUTE_NUM", "ProcThreadAttributeIdealProcessor", 0x5)
|
||||||
|
ProcThreadAttributeUmsThread = EnumValue("_PROC_THREAD_ATTRIBUTE_NUM", "ProcThreadAttributeUmsThread", 0x6)
|
||||||
|
ProcThreadAttributeMitigationPolicy = EnumValue("_PROC_THREAD_ATTRIBUTE_NUM", "ProcThreadAttributeMitigationPolicy", 0x7)
|
||||||
|
ProcThreadAttributeSecurityCapabilities = EnumValue("_PROC_THREAD_ATTRIBUTE_NUM", "ProcThreadAttributeSecurityCapabilities", 0x9)
|
||||||
|
ProcThreadAttributeProtectionLevel = EnumValue("_PROC_THREAD_ATTRIBUTE_NUM", "ProcThreadAttributeProtectionLevel", 0xb)
|
||||||
|
ProcThreadAttributeJobList = EnumValue("_PROC_THREAD_ATTRIBUTE_NUM", "ProcThreadAttributeJobList", 0xd)
|
||||||
|
ProcThreadAttributeChildProcessPolicy = EnumValue("_PROC_THREAD_ATTRIBUTE_NUM", "ProcThreadAttributeChildProcessPolicy", 0xe)
|
||||||
|
ProcThreadAttributeAllApplicationPackagesPolicy = EnumValue("_PROC_THREAD_ATTRIBUTE_NUM", "ProcThreadAttributeAllApplicationPackagesPolicy", 0xf)
|
||||||
|
ProcThreadAttributeWin32kFilter = EnumValue("_PROC_THREAD_ATTRIBUTE_NUM", "ProcThreadAttributeWin32kFilter", 0x10)
|
||||||
|
ProcThreadAttributeSafeOpenPromptOriginClaim = EnumValue("_PROC_THREAD_ATTRIBUTE_NUM", "ProcThreadAttributeSafeOpenPromptOriginClaim", 0x11)
|
||||||
|
ProcThreadAttributeDesktopAppPolicy = EnumValue("_PROC_THREAD_ATTRIBUTE_NUM", "ProcThreadAttributeDesktopAppPolicy", 0x12)
|
||||||
|
ProcThreadAttributePseudoConsole = EnumValue("_PROC_THREAD_ATTRIBUTE_NUM", "ProcThreadAttributePseudoConsole", 0x16)
|
||||||
|
ProcThreadAttributeMitigationAuditPolicy = EnumValue("_PROC_THREAD_ATTRIBUTE_NUM", "ProcThreadAttributeMitigationAuditPolicy", 0x18)
|
||||||
|
ProcThreadAttributeMachineType = EnumValue("_PROC_THREAD_ATTRIBUTE_NUM", "ProcThreadAttributeMachineType", 0x19)
|
||||||
|
ProcThreadAttributeComponentFilter = EnumValue("_PROC_THREAD_ATTRIBUTE_NUM", "ProcThreadAttributeComponentFilter", 0x1a)
|
||||||
|
ProcThreadAttributeEnableOptionalXStateFeatures = EnumValue("_PROC_THREAD_ATTRIBUTE_NUM", "ProcThreadAttributeEnableOptionalXStateFeatures", 0x1b)
|
||||||
|
ProcThreadAttributeTrustedApp = EnumValue("_PROC_THREAD_ATTRIBUTE_NUM", "ProcThreadAttributeTrustedApp", 0x1d)
|
||||||
|
ProcThreadAttributeSveVectorLength = EnumValue("_PROC_THREAD_ATTRIBUTE_NUM", "ProcThreadAttributeSveVectorLength", 0x1e)
|
||||||
|
class _PROC_THREAD_ATTRIBUTE_NUM(EnumType):
|
||||||
|
values = [ProcThreadAttributeParentProcess, ProcThreadAttributeHandleList, ProcThreadAttributeGroupAffinity, ProcThreadAttributePreferredNode, ProcThreadAttributeIdealProcessor, ProcThreadAttributeUmsThread, ProcThreadAttributeMitigationPolicy, ProcThreadAttributeSecurityCapabilities, ProcThreadAttributeProtectionLevel, ProcThreadAttributeJobList, ProcThreadAttributeChildProcessPolicy, ProcThreadAttributeAllApplicationPackagesPolicy, ProcThreadAttributeWin32kFilter, ProcThreadAttributeSafeOpenPromptOriginClaim, ProcThreadAttributeDesktopAppPolicy, ProcThreadAttributePseudoConsole, ProcThreadAttributeMitigationAuditPolicy, ProcThreadAttributeMachineType, ProcThreadAttributeComponentFilter, ProcThreadAttributeEnableOptionalXStateFeatures, ProcThreadAttributeTrustedApp, ProcThreadAttributeSveVectorLength]
|
||||||
|
mapper = FlagMapper(*values)
|
||||||
|
PROC_THREAD_ATTRIBUTE_NUM = _PROC_THREAD_ATTRIBUTE_NUM
|
||||||
|
|
||||||
|
|
||||||
|
MemoryBasicInformation = EnumValue("_MEMORY_INFORMATION_CLASS", "MemoryBasicInformation", 0x0)
|
||||||
|
MemoryWorkingSetList = EnumValue("_MEMORY_INFORMATION_CLASS", "MemoryWorkingSetList", 0x1)
|
||||||
|
MemorySectionName = EnumValue("_MEMORY_INFORMATION_CLASS", "MemorySectionName", 0x2)
|
||||||
|
MemoryBasicVlmInformation = EnumValue("_MEMORY_INFORMATION_CLASS", "MemoryBasicVlmInformation", 0x3)
|
||||||
|
MemoryWorkingSetListEx = EnumValue("_MEMORY_INFORMATION_CLASS", "MemoryWorkingSetListEx", 0x4)
|
||||||
|
class _MEMORY_INFORMATION_CLASS(EnumType):
|
||||||
|
values = [MemoryBasicInformation, MemoryWorkingSetList, MemorySectionName, MemoryBasicVlmInformation, MemoryWorkingSetListEx]
|
||||||
|
mapper = FlagMapper(*values)
|
||||||
|
MEMORY_INFORMATION_CLASS = _MEMORY_INFORMATION_CLASS
|
||||||
|
|
||||||
|
|
||||||
|
ThreadBasicInformation = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadBasicInformation", 0x0)
|
||||||
|
ThreadTimes = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadTimes", 0x1)
|
||||||
|
ThreadPriority = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadPriority", 0x2)
|
||||||
|
ThreadBasePriority = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadBasePriority", 0x3)
|
||||||
|
ThreadAffinityMask = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadAffinityMask", 0x4)
|
||||||
|
ThreadImpersonationToken = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadImpersonationToken", 0x5)
|
||||||
|
ThreadDescriptorTableEntry = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadDescriptorTableEntry", 0x6)
|
||||||
|
ThreadEnableAlignmentFaultFixup = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadEnableAlignmentFaultFixup", 0x7)
|
||||||
|
ThreadEventPair = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadEventPair", 0x8)
|
||||||
|
ThreadQuerySetWin32StartAddress = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadQuerySetWin32StartAddress", 0x9)
|
||||||
|
ThreadZeroTlsCell = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadZeroTlsCell", 0xa)
|
||||||
|
ThreadPerformanceCount = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadPerformanceCount", 0xb)
|
||||||
|
ThreadAmILastThread = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadAmILastThread", 0xc)
|
||||||
|
ThreadIdealProcessor = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadIdealProcessor", 0xd)
|
||||||
|
ThreadPriorityBoost = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadPriorityBoost", 0xe)
|
||||||
|
ThreadSetTlsArrayAddress = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadSetTlsArrayAddress", 0xf)
|
||||||
|
ThreadIsIoPending = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadIsIoPending", 0x10)
|
||||||
|
ThreadHideFromDebugger = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadHideFromDebugger", 0x11)
|
||||||
|
class _THREAD_INFORMATION_CLASS(EnumType):
|
||||||
|
values = [ThreadBasicInformation, ThreadTimes, ThreadPriority, ThreadBasePriority, ThreadAffinityMask, ThreadImpersonationToken, ThreadDescriptorTableEntry, ThreadEnableAlignmentFaultFixup, ThreadEventPair, ThreadQuerySetWin32StartAddress, ThreadZeroTlsCell, ThreadPerformanceCount, ThreadAmILastThread, ThreadIdealProcessor, ThreadPriorityBoost, ThreadSetTlsArrayAddress, ThreadIsIoPending, ThreadHideFromDebugger]
|
||||||
|
mapper = FlagMapper(*values)
|
||||||
|
PTHREAD_INFORMATION_CLASS = POINTER(_THREAD_INFORMATION_CLASS)
|
||||||
|
THREAD_INFORMATION_CLASS = _THREAD_INFORMATION_CLASS
|
||||||
|
|
||||||
|
|
||||||
|
ProcessBasicInformation = EnumValue("_PROCESSINFOCLASS", "ProcessBasicInformation", 0x0)
|
||||||
|
ProcessQuotaLimits = EnumValue("_PROCESSINFOCLASS", "ProcessQuotaLimits", 0x1)
|
||||||
|
ProcessIoCounters = EnumValue("_PROCESSINFOCLASS", "ProcessIoCounters", 0x2)
|
||||||
|
ProcessVmCounters = EnumValue("_PROCESSINFOCLASS", "ProcessVmCounters", 0x3)
|
||||||
|
ProcessTimes = EnumValue("_PROCESSINFOCLASS", "ProcessTimes", 0x4)
|
||||||
|
ProcessBasePriority = EnumValue("_PROCESSINFOCLASS", "ProcessBasePriority", 0x5)
|
||||||
|
ProcessRaisePriority = EnumValue("_PROCESSINFOCLASS", "ProcessRaisePriority", 0x6)
|
||||||
|
ProcessDebugPort = EnumValue("_PROCESSINFOCLASS", "ProcessDebugPort", 0x7)
|
||||||
|
ProcessExceptionPort = EnumValue("_PROCESSINFOCLASS", "ProcessExceptionPort", 0x8)
|
||||||
|
ProcessAccessToken = EnumValue("_PROCESSINFOCLASS", "ProcessAccessToken", 0x9)
|
||||||
|
ProcessLdtInformation = EnumValue("_PROCESSINFOCLASS", "ProcessLdtInformation", 0xa)
|
||||||
|
ProcessLdtSize = EnumValue("_PROCESSINFOCLASS", "ProcessLdtSize", 0xb)
|
||||||
|
ProcessDefaultHardErrorMode = EnumValue("_PROCESSINFOCLASS", "ProcessDefaultHardErrorMode", 0xc)
|
||||||
|
ProcessIoPortHandlers = EnumValue("_PROCESSINFOCLASS", "ProcessIoPortHandlers", 0xd)
|
||||||
|
ProcessPooledUsageAndLimits = EnumValue("_PROCESSINFOCLASS", "ProcessPooledUsageAndLimits", 0xe)
|
||||||
|
ProcessWorkingSetWatch = EnumValue("_PROCESSINFOCLASS", "ProcessWorkingSetWatch", 0xf)
|
||||||
|
ProcessUserModeIOPL = EnumValue("_PROCESSINFOCLASS", "ProcessUserModeIOPL", 0x10)
|
||||||
|
ProcessEnableAlignmentFaultFixup = EnumValue("_PROCESSINFOCLASS", "ProcessEnableAlignmentFaultFixup", 0x11)
|
||||||
|
ProcessPriorityClass = EnumValue("_PROCESSINFOCLASS", "ProcessPriorityClass", 0x12)
|
||||||
|
ProcessWx86Information = EnumValue("_PROCESSINFOCLASS", "ProcessWx86Information", 0x13)
|
||||||
|
ProcessHandleCount = EnumValue("_PROCESSINFOCLASS", "ProcessHandleCount", 0x14)
|
||||||
|
ProcessAffinityMask = EnumValue("_PROCESSINFOCLASS", "ProcessAffinityMask", 0x15)
|
||||||
|
ProcessPriorityBoost = EnumValue("_PROCESSINFOCLASS", "ProcessPriorityBoost", 0x16)
|
||||||
|
ProcessDeviceMap = EnumValue("_PROCESSINFOCLASS", "ProcessDeviceMap", 0x17)
|
||||||
|
ProcessSessionInformation = EnumValue("_PROCESSINFOCLASS", "ProcessSessionInformation", 0x18)
|
||||||
|
ProcessForegroundInformation = EnumValue("_PROCESSINFOCLASS", "ProcessForegroundInformation", 0x19)
|
||||||
|
ProcessWow64Information = EnumValue("_PROCESSINFOCLASS", "ProcessWow64Information", 0x1a)
|
||||||
|
ProcessImageFileName = EnumValue("_PROCESSINFOCLASS", "ProcessImageFileName", 0x1b)
|
||||||
|
ProcessLUIDDeviceMapsEnabled = EnumValue("_PROCESSINFOCLASS", "ProcessLUIDDeviceMapsEnabled", 0x1c)
|
||||||
|
ProcessBreakOnTermination = EnumValue("_PROCESSINFOCLASS", "ProcessBreakOnTermination", 0x1d)
|
||||||
|
ProcessDebugObjectHandle = EnumValue("_PROCESSINFOCLASS", "ProcessDebugObjectHandle", 0x1e)
|
||||||
|
ProcessDebugFlags = EnumValue("_PROCESSINFOCLASS", "ProcessDebugFlags", 0x1f)
|
||||||
|
ProcessHandleTracing = EnumValue("_PROCESSINFOCLASS", "ProcessHandleTracing", 0x20)
|
||||||
|
ProcessIoPriority = EnumValue("_PROCESSINFOCLASS", "ProcessIoPriority", 0x21)
|
||||||
|
ProcessExecuteFlags = EnumValue("_PROCESSINFOCLASS", "ProcessExecuteFlags", 0x22)
|
||||||
|
ProcessTlsInformation = EnumValue("_PROCESSINFOCLASS", "ProcessTlsInformation", 0x23)
|
||||||
|
ProcessCookie = EnumValue("_PROCESSINFOCLASS", "ProcessCookie", 0x24)
|
||||||
|
ProcessImageInformation = EnumValue("_PROCESSINFOCLASS", "ProcessImageInformation", 0x25)
|
||||||
|
ProcessCycleTime = EnumValue("_PROCESSINFOCLASS", "ProcessCycleTime", 0x26)
|
||||||
|
ProcessPagePriority = EnumValue("_PROCESSINFOCLASS", "ProcessPagePriority", 0x27)
|
||||||
|
ProcessInstrumentationCallback = EnumValue("_PROCESSINFOCLASS", "ProcessInstrumentationCallback", 0x28)
|
||||||
|
ProcessThreadStackAllocation = EnumValue("_PROCESSINFOCLASS", "ProcessThreadStackAllocation", 0x29)
|
||||||
|
ProcessWorkingSetWatchEx = EnumValue("_PROCESSINFOCLASS", "ProcessWorkingSetWatchEx", 0x2a)
|
||||||
|
ProcessImageFileNameWin32 = EnumValue("_PROCESSINFOCLASS", "ProcessImageFileNameWin32", 0x2b)
|
||||||
|
ProcessImageFileMapping = EnumValue("_PROCESSINFOCLASS", "ProcessImageFileMapping", 0x2c)
|
||||||
|
ProcessAffinityUpdateMode = EnumValue("_PROCESSINFOCLASS", "ProcessAffinityUpdateMode", 0x2d)
|
||||||
|
ProcessMemoryAllocationMode = EnumValue("_PROCESSINFOCLASS", "ProcessMemoryAllocationMode", 0x2e)
|
||||||
|
ProcessGroupInformation = EnumValue("_PROCESSINFOCLASS", "ProcessGroupInformation", 0x2f)
|
||||||
|
ProcessTokenVirtualizationEnabled = EnumValue("_PROCESSINFOCLASS", "ProcessTokenVirtualizationEnabled", 0x30)
|
||||||
|
ProcessOwnerInformation = EnumValue("_PROCESSINFOCLASS", "ProcessOwnerInformation", 0x31)
|
||||||
|
ProcessWindowInformation = EnumValue("_PROCESSINFOCLASS", "ProcessWindowInformation", 0x32)
|
||||||
|
ProcessHandleInformation = EnumValue("_PROCESSINFOCLASS", "ProcessHandleInformation", 0x33)
|
||||||
|
ProcessMitigationPolicy = EnumValue("_PROCESSINFOCLASS", "ProcessMitigationPolicy", 0x34)
|
||||||
|
ProcessDynamicFunctionTableInformation = EnumValue("_PROCESSINFOCLASS", "ProcessDynamicFunctionTableInformation", 0x35)
|
||||||
|
ProcessHandleCheckingMode = EnumValue("_PROCESSINFOCLASS", "ProcessHandleCheckingMode", 0x36)
|
||||||
|
ProcessKeepAliveCount = EnumValue("_PROCESSINFOCLASS", "ProcessKeepAliveCount", 0x37)
|
||||||
|
ProcessRevokeFileHandles = EnumValue("_PROCESSINFOCLASS", "ProcessRevokeFileHandles", 0x38)
|
||||||
|
ProcessWorkingSetControl = EnumValue("_PROCESSINFOCLASS", "ProcessWorkingSetControl", 0x39)
|
||||||
|
ProcessHandleTable = EnumValue("_PROCESSINFOCLASS", "ProcessHandleTable", 0x3a)
|
||||||
|
ProcessCheckStackExtentsMode = EnumValue("_PROCESSINFOCLASS", "ProcessCheckStackExtentsMode", 0x3b)
|
||||||
|
ProcessCommandLineInformation = EnumValue("_PROCESSINFOCLASS", "ProcessCommandLineInformation", 0x3c)
|
||||||
|
ProcessProtectionInformation = EnumValue("_PROCESSINFOCLASS", "ProcessProtectionInformation", 0x3d)
|
||||||
|
ProcessMemoryExhaustion = EnumValue("_PROCESSINFOCLASS", "ProcessMemoryExhaustion", 0x3e)
|
||||||
|
ProcessFaultInformation = EnumValue("_PROCESSINFOCLASS", "ProcessFaultInformation", 0x3f)
|
||||||
|
ProcessTelemetryIdInformation = EnumValue("_PROCESSINFOCLASS", "ProcessTelemetryIdInformation", 0x40)
|
||||||
|
ProcessCommitReleaseInformation = EnumValue("_PROCESSINFOCLASS", "ProcessCommitReleaseInformation", 0x41)
|
||||||
|
ProcessReserved1Information = EnumValue("_PROCESSINFOCLASS", "ProcessReserved1Information", 0x42)
|
||||||
|
ProcessReserved2Information = EnumValue("_PROCESSINFOCLASS", "ProcessReserved2Information", 0x43)
|
||||||
|
ProcessSubsystemProcess = EnumValue("_PROCESSINFOCLASS", "ProcessSubsystemProcess", 0x44)
|
||||||
|
ProcessInPrivate = EnumValue("_PROCESSINFOCLASS", "ProcessInPrivate", 0x46)
|
||||||
|
ProcessRaiseUMExceptionOnInvalidHandleClose = EnumValue("_PROCESSINFOCLASS", "ProcessRaiseUMExceptionOnInvalidHandleClose", 0x47)
|
||||||
|
ProcessSubsystemInformation = EnumValue("_PROCESSINFOCLASS", "ProcessSubsystemInformation", 0x4b)
|
||||||
|
ProcessWin32kSyscallFilterInformation = EnumValue("_PROCESSINFOCLASS", "ProcessWin32kSyscallFilterInformation", 0x4f)
|
||||||
|
ProcessEnergyTrackingState = EnumValue("_PROCESSINFOCLASS", "ProcessEnergyTrackingState", 0x52)
|
||||||
|
MaxProcessInfoClass = EnumValue("_PROCESSINFOCLASS", "MaxProcessInfoClass", 0x53)
|
||||||
|
class _PROCESSINFOCLASS(EnumType):
|
||||||
|
values = [ProcessBasicInformation, ProcessQuotaLimits, ProcessIoCounters, ProcessVmCounters, ProcessTimes, ProcessBasePriority, ProcessRaisePriority, ProcessDebugPort, ProcessExceptionPort, ProcessAccessToken, ProcessLdtInformation, ProcessLdtSize, ProcessDefaultHardErrorMode, ProcessIoPortHandlers, ProcessPooledUsageAndLimits, ProcessWorkingSetWatch, ProcessUserModeIOPL, ProcessEnableAlignmentFaultFixup, ProcessPriorityClass, ProcessWx86Information, ProcessHandleCount, ProcessAffinityMask, ProcessPriorityBoost, ProcessDeviceMap, ProcessSessionInformation, ProcessForegroundInformation, ProcessWow64Information, ProcessImageFileName, ProcessLUIDDeviceMapsEnabled, ProcessBreakOnTermination, ProcessDebugObjectHandle, ProcessDebugFlags, ProcessHandleTracing, ProcessIoPriority, ProcessExecuteFlags, ProcessTlsInformation, ProcessCookie, ProcessImageInformation, ProcessCycleTime, ProcessPagePriority, ProcessInstrumentationCallback, ProcessThreadStackAllocation, ProcessWorkingSetWatchEx, ProcessImageFileNameWin32, ProcessImageFileMapping, ProcessAffinityUpdateMode, ProcessMemoryAllocationMode, ProcessGroupInformation, ProcessTokenVirtualizationEnabled, ProcessOwnerInformation, ProcessWindowInformation, ProcessHandleInformation, ProcessMitigationPolicy, ProcessDynamicFunctionTableInformation, ProcessHandleCheckingMode, ProcessKeepAliveCount, ProcessRevokeFileHandles, ProcessWorkingSetControl, ProcessHandleTable, ProcessCheckStackExtentsMode, ProcessCommandLineInformation, ProcessProtectionInformation, ProcessMemoryExhaustion, ProcessFaultInformation, ProcessTelemetryIdInformation, ProcessCommitReleaseInformation, ProcessReserved1Information, ProcessReserved2Information, ProcessSubsystemProcess, ProcessInPrivate, ProcessRaiseUMExceptionOnInvalidHandleClose, ProcessSubsystemInformation, ProcessWin32kSyscallFilterInformation, ProcessEnergyTrackingState, MaxProcessInfoClass]
|
||||||
|
mapper = FlagMapper(*values)
|
||||||
|
PROCESSINFOCLASS = _PROCESSINFOCLASS
|
||||||
|
|
||||||
|
|
||||||
|
ProcessMemoryPriority = EnumValue("_PROCESS_INFORMATION_CLASS", "ProcessMemoryPriority", 0x0)
|
||||||
|
ProcessMemoryExhaustionInfo = EnumValue("_PROCESS_INFORMATION_CLASS", "ProcessMemoryExhaustionInfo", 0x1)
|
||||||
|
ProcessAppMemoryInfo = EnumValue("_PROCESS_INFORMATION_CLASS", "ProcessAppMemoryInfo", 0x2)
|
||||||
|
ProcessInPrivateInfo = EnumValue("_PROCESS_INFORMATION_CLASS", "ProcessInPrivateInfo", 0x3)
|
||||||
|
ProcessPowerThrottling = EnumValue("_PROCESS_INFORMATION_CLASS", "ProcessPowerThrottling", 0x4)
|
||||||
|
ProcessReservedValue1 = EnumValue("_PROCESS_INFORMATION_CLASS", "ProcessReservedValue1", 0x5)
|
||||||
|
ProcessTelemetryCoverageInfo = EnumValue("_PROCESS_INFORMATION_CLASS", "ProcessTelemetryCoverageInfo", 0x6)
|
||||||
|
ProcessProtectionLevelInfo = EnumValue("_PROCESS_INFORMATION_CLASS", "ProcessProtectionLevelInfo", 0x7)
|
||||||
|
ProcessLeapSecondInfo = EnumValue("_PROCESS_INFORMATION_CLASS", "ProcessLeapSecondInfo", 0x8)
|
||||||
|
ProcessMachineTypeInfo = EnumValue("_PROCESS_INFORMATION_CLASS", "ProcessMachineTypeInfo", 0x9)
|
||||||
|
ProcessOverrideSubsequentPrefetchParameter = EnumValue("_PROCESS_INFORMATION_CLASS", "ProcessOverrideSubsequentPrefetchParameter", 0xa)
|
||||||
|
ProcessMaxOverridePrefetchParameter = EnumValue("_PROCESS_INFORMATION_CLASS", "ProcessMaxOverridePrefetchParameter", 0xb)
|
||||||
|
ProcessInformationClassMax = EnumValue("_PROCESS_INFORMATION_CLASS", "ProcessInformationClassMax", 0xc)
|
||||||
|
class _PROCESS_INFORMATION_CLASS(EnumType):
|
||||||
|
values = [ProcessMemoryPriority, ProcessMemoryExhaustionInfo, ProcessAppMemoryInfo, ProcessInPrivateInfo, ProcessPowerThrottling, ProcessReservedValue1, ProcessTelemetryCoverageInfo, ProcessProtectionLevelInfo, ProcessLeapSecondInfo, ProcessMachineTypeInfo, ProcessOverrideSubsequentPrefetchParameter, ProcessMaxOverridePrefetchParameter, ProcessInformationClassMax]
|
||||||
|
mapper = FlagMapper(*values)
|
||||||
|
PROCESS_INFORMATION_CLASS = _PROCESS_INFORMATION_CLASS
|
||||||
|
|
||||||
|
|
||||||
|
UserEnabled = EnumValue("_MACHINE_ATTRIBUTES", "UserEnabled", 0x1)
|
||||||
|
KernelEnabled = EnumValue("_MACHINE_ATTRIBUTES", "KernelEnabled", 0x2)
|
||||||
|
Wow64Container = EnumValue("_MACHINE_ATTRIBUTES", "Wow64Container", 0x4)
|
||||||
|
class _MACHINE_ATTRIBUTES(EnumType):
|
||||||
|
values = [UserEnabled, KernelEnabled, Wow64Container]
|
||||||
|
mapper = FlagMapper(*values)
|
||||||
|
MACHINE_ATTRIBUTES = _MACHINE_ATTRIBUTES
|
||||||
|
|
||||||
|
|
||||||
|
class _PROCESS_MACHINE_INFORMATION(Structure):
|
||||||
|
_fields_ = [
|
||||||
|
("ProcessMachine", USHORT),
|
||||||
|
("Res0", USHORT),
|
||||||
|
("MachineAttributes", MACHINE_ATTRIBUTES),
|
||||||
|
]
|
||||||
|
PROCESS_MACHINE_INFORMATION = _PROCESS_MACHINE_INFORMATION
|
||||||
|
|
||||||
MemExtendedParameterInvalidType = EnumValue("MEM_EXTENDED_PARAMETER_TYPE", "MemExtendedParameterInvalidType", 0x0)
|
MemExtendedParameterInvalidType = EnumValue("MEM_EXTENDED_PARAMETER_TYPE", "MemExtendedParameterInvalidType", 0x0)
|
||||||
MemExtendedParameterAddressRequirements = EnumValue("MEM_EXTENDED_PARAMETER_TYPE", "MemExtendedParameterAddressRequirements", 0x1)
|
MemExtendedParameterAddressRequirements = EnumValue("MEM_EXTENDED_PARAMETER_TYPE", "MemExtendedParameterAddressRequirements", 0x1)
|
||||||
MemExtendedParameterNumaNode = EnumValue("MEM_EXTENDED_PARAMETER_TYPE", "MemExtendedParameterNumaNode", 0x2)
|
MemExtendedParameterNumaNode = EnumValue("MEM_EXTENDED_PARAMETER_TYPE", "MemExtendedParameterNumaNode", 0x2)
|
||||||
@@ -4630,6 +4811,36 @@ class _SYSTEM_BASIC_INFORMATION(Structure):
|
|||||||
PSYSTEM_BASIC_INFORMATION = POINTER(_SYSTEM_BASIC_INFORMATION)
|
PSYSTEM_BASIC_INFORMATION = POINTER(_SYSTEM_BASIC_INFORMATION)
|
||||||
SYSTEM_BASIC_INFORMATION = _SYSTEM_BASIC_INFORMATION
|
SYSTEM_BASIC_INFORMATION = _SYSTEM_BASIC_INFORMATION
|
||||||
|
|
||||||
|
class _ANON__ANON__SYSTEM_INFO_SUB_UNION_1_SUB_STRUCTURE_1(Structure):
|
||||||
|
_fields_ = [
|
||||||
|
("wProcessorArchitecture", WORD),
|
||||||
|
("wReserved", WORD),
|
||||||
|
]
|
||||||
|
|
||||||
|
class _ANON__SYSTEM_INFO_SUB_UNION_1(Union):
|
||||||
|
_anonymous_ = ("DUMMYSTRUCTNAME",)
|
||||||
|
_fields_ = [
|
||||||
|
("dwOemId", DWORD),
|
||||||
|
("DUMMYSTRUCTNAME", _ANON__ANON__SYSTEM_INFO_SUB_UNION_1_SUB_STRUCTURE_1),
|
||||||
|
]
|
||||||
|
|
||||||
|
class _SYSTEM_INFO(Structure):
|
||||||
|
_anonymous_ = ("DUMMYUNIONNAME",)
|
||||||
|
_fields_ = [
|
||||||
|
("DUMMYUNIONNAME", _ANON__SYSTEM_INFO_SUB_UNION_1),
|
||||||
|
("dwPageSize", DWORD),
|
||||||
|
("lpMinimumApplicationAddress", LPVOID),
|
||||||
|
("lpMaximumApplicationAddress", LPVOID),
|
||||||
|
("dwActiveProcessorMask", DWORD_PTR),
|
||||||
|
("dwNumberOfProcessors", DWORD),
|
||||||
|
("dwProcessorType", DWORD),
|
||||||
|
("dwAllocationGranularity", DWORD),
|
||||||
|
("wProcessorLevel", WORD),
|
||||||
|
("wProcessorRevision", WORD),
|
||||||
|
]
|
||||||
|
LPSYSTEM_INFO = POINTER(_SYSTEM_INFO)
|
||||||
|
SYSTEM_INFO = _SYSTEM_INFO
|
||||||
|
|
||||||
TASK_ACTION_EXEC = EnumValue("_TASK_ACTION_TYPE", "TASK_ACTION_EXEC", 0x0)
|
TASK_ACTION_EXEC = EnumValue("_TASK_ACTION_TYPE", "TASK_ACTION_EXEC", 0x0)
|
||||||
TASK_ACTION_COM_HANDLER = EnumValue("_TASK_ACTION_TYPE", "TASK_ACTION_COM_HANDLER", 0x5)
|
TASK_ACTION_COM_HANDLER = EnumValue("_TASK_ACTION_TYPE", "TASK_ACTION_COM_HANDLER", 0x5)
|
||||||
TASK_ACTION_SEND_EMAIL = EnumValue("_TASK_ACTION_TYPE", "TASK_ACTION_SEND_EMAIL", 0x6)
|
TASK_ACTION_SEND_EMAIL = EnumValue("_TASK_ACTION_TYPE", "TASK_ACTION_SEND_EMAIL", 0x6)
|
||||||
@@ -5001,6 +5212,313 @@ class _TEB(Structure):
|
|||||||
]
|
]
|
||||||
TEB = _TEB
|
TEB = _TEB
|
||||||
|
|
||||||
|
class _ANON__ARM64_NT_NEON128_SUB_STRUCTURE_1(Structure):
|
||||||
|
_fields_ = [
|
||||||
|
("Low", ULONGLONG),
|
||||||
|
("High", LONGLONG),
|
||||||
|
]
|
||||||
|
|
||||||
|
class _ARM64_NT_NEON128(Union):
|
||||||
|
_anonymous_ = ("DUMMYSTRUCTNAME",)
|
||||||
|
_fields_ = [
|
||||||
|
("DUMMYSTRUCTNAME", _ANON__ARM64_NT_NEON128_SUB_STRUCTURE_1),
|
||||||
|
("D", DOUBLE * (2)),
|
||||||
|
("S", FLOAT * (4)),
|
||||||
|
("H", WORD * (8)),
|
||||||
|
("B", BYTE * (16)),
|
||||||
|
]
|
||||||
|
ARM64_NT_NEON128 = _ARM64_NT_NEON128
|
||||||
|
PARM64_NT_NEON128 = POINTER(_ARM64_NT_NEON128)
|
||||||
|
|
||||||
|
class _ANON__ANON__ARM64_NT_CONTEXT_SUB_UNION_1_SUB_STRUCTURE_1(Structure):
|
||||||
|
_fields_ = [
|
||||||
|
("X0", DWORD64),
|
||||||
|
("X1", DWORD64),
|
||||||
|
("X2", DWORD64),
|
||||||
|
("X3", DWORD64),
|
||||||
|
("X4", DWORD64),
|
||||||
|
("X5", DWORD64),
|
||||||
|
("X6", DWORD64),
|
||||||
|
("X7", DWORD64),
|
||||||
|
("X8", DWORD64),
|
||||||
|
("X9", DWORD64),
|
||||||
|
("X10", DWORD64),
|
||||||
|
("X11", DWORD64),
|
||||||
|
("X12", DWORD64),
|
||||||
|
("X13", DWORD64),
|
||||||
|
("X14", DWORD64),
|
||||||
|
("X15", DWORD64),
|
||||||
|
("X16", DWORD64),
|
||||||
|
("X17", DWORD64),
|
||||||
|
("X18", DWORD64),
|
||||||
|
("X19", DWORD64),
|
||||||
|
("X20", DWORD64),
|
||||||
|
("X21", DWORD64),
|
||||||
|
("X22", DWORD64),
|
||||||
|
("X23", DWORD64),
|
||||||
|
("X24", DWORD64),
|
||||||
|
("X25", DWORD64),
|
||||||
|
("X26", DWORD64),
|
||||||
|
("X27", DWORD64),
|
||||||
|
("X28", DWORD64),
|
||||||
|
("Fp", DWORD64),
|
||||||
|
("Lr", DWORD64),
|
||||||
|
]
|
||||||
|
|
||||||
|
class _ANON__ARM64_NT_CONTEXT_SUB_UNION_1(Union):
|
||||||
|
_anonymous_ = ("DUMMYSTRUCTNAME",)
|
||||||
|
_fields_ = [
|
||||||
|
("DUMMYSTRUCTNAME", _ANON__ANON__ARM64_NT_CONTEXT_SUB_UNION_1_SUB_STRUCTURE_1),
|
||||||
|
("X", DWORD64 * (31)),
|
||||||
|
]
|
||||||
|
|
||||||
|
class _ARM64_NT_CONTEXT(Structure):
|
||||||
|
_anonymous_ = ("DUMMYUNIONNAME",)
|
||||||
|
_fields_ = [
|
||||||
|
("ContextFlags", DWORD),
|
||||||
|
("Cpsr", DWORD),
|
||||||
|
("DUMMYUNIONNAME", _ANON__ARM64_NT_CONTEXT_SUB_UNION_1),
|
||||||
|
("Sp", DWORD64),
|
||||||
|
("Pc", DWORD64),
|
||||||
|
("V", ARM64_NT_NEON128 * (32)),
|
||||||
|
("Fpcr", DWORD),
|
||||||
|
("Fpsr", DWORD),
|
||||||
|
("Bcr", DWORD * (ARM64_MAX_BREAKPOINTS)),
|
||||||
|
("Bvr", DWORD64 * (ARM64_MAX_BREAKPOINTS)),
|
||||||
|
("Wcr", DWORD * (ARM64_MAX_WATCHPOINTS)),
|
||||||
|
("Wvr", DWORD64 * (ARM64_MAX_WATCHPOINTS)),
|
||||||
|
]
|
||||||
|
ARM64_NT_CONTEXT = _ARM64_NT_CONTEXT
|
||||||
|
PARM64_NT_CONTEXT = POINTER(_ARM64_NT_CONTEXT)
|
||||||
|
|
||||||
|
class _FLOATING_SAVE_AREA(Structure):
|
||||||
|
_fields_ = [
|
||||||
|
("ControlWord", DWORD),
|
||||||
|
("StatusWord", DWORD),
|
||||||
|
("TagWord", DWORD),
|
||||||
|
("ErrorOffset", DWORD),
|
||||||
|
("ErrorSelector", DWORD),
|
||||||
|
("DataOffset", DWORD),
|
||||||
|
("DataSelector", DWORD),
|
||||||
|
("RegisterArea", BYTE * (80)),
|
||||||
|
("Cr0NpxState", DWORD),
|
||||||
|
]
|
||||||
|
FLOATING_SAVE_AREA = _FLOATING_SAVE_AREA
|
||||||
|
|
||||||
|
class _CONTEXT32(Structure):
|
||||||
|
_fields_ = [
|
||||||
|
("ContextFlags", DWORD),
|
||||||
|
("Dr0", DWORD),
|
||||||
|
("Dr1", DWORD),
|
||||||
|
("Dr2", DWORD),
|
||||||
|
("Dr3", DWORD),
|
||||||
|
("Dr6", DWORD),
|
||||||
|
("Dr7", DWORD),
|
||||||
|
("FloatSave", FLOATING_SAVE_AREA),
|
||||||
|
("SegGs", DWORD),
|
||||||
|
("SegFs", DWORD),
|
||||||
|
("SegEs", DWORD),
|
||||||
|
("SegDs", DWORD),
|
||||||
|
("Edi", DWORD),
|
||||||
|
("Esi", DWORD),
|
||||||
|
("Ebx", DWORD),
|
||||||
|
("Edx", DWORD),
|
||||||
|
("Ecx", DWORD),
|
||||||
|
("Eax", DWORD),
|
||||||
|
("Ebp", DWORD),
|
||||||
|
("Eip", DWORD),
|
||||||
|
("SegCs", DWORD),
|
||||||
|
("EFlags", DWORD),
|
||||||
|
("Esp", DWORD),
|
||||||
|
("SegSs", DWORD),
|
||||||
|
("ExtendedRegisters", BYTE * (512)),
|
||||||
|
]
|
||||||
|
CONTEXT32 = _CONTEXT32
|
||||||
|
LPCONTEXT32 = POINTER(_CONTEXT32)
|
||||||
|
PCONTEXT32 = POINTER(_CONTEXT32)
|
||||||
|
|
||||||
|
class _WOW64_FLOATING_SAVE_AREA(Structure):
|
||||||
|
_fields_ = [
|
||||||
|
("ControlWord", DWORD),
|
||||||
|
("StatusWord", DWORD),
|
||||||
|
("TagWord", DWORD),
|
||||||
|
("ErrorOffset", DWORD),
|
||||||
|
("ErrorSelector", DWORD),
|
||||||
|
("DataOffset", DWORD),
|
||||||
|
("DataSelector", DWORD),
|
||||||
|
("RegisterArea", BYTE * (WOW64_SIZE_OF_80387_REGISTERS)),
|
||||||
|
("Cr0NpxState", DWORD),
|
||||||
|
]
|
||||||
|
WOW64_FLOATING_SAVE_AREA = _WOW64_FLOATING_SAVE_AREA
|
||||||
|
|
||||||
|
class _WOW64_CONTEXT(Structure):
|
||||||
|
_fields_ = [
|
||||||
|
("ContextFlags", DWORD),
|
||||||
|
("Dr0", DWORD),
|
||||||
|
("Dr1", DWORD),
|
||||||
|
("Dr2", DWORD),
|
||||||
|
("Dr3", DWORD),
|
||||||
|
("Dr6", DWORD),
|
||||||
|
("Dr7", DWORD),
|
||||||
|
("FloatSave", WOW64_FLOATING_SAVE_AREA),
|
||||||
|
("SegGs", DWORD),
|
||||||
|
("SegFs", DWORD),
|
||||||
|
("SegEs", DWORD),
|
||||||
|
("SegDs", DWORD),
|
||||||
|
("Edi", DWORD),
|
||||||
|
("Esi", DWORD),
|
||||||
|
("Ebx", DWORD),
|
||||||
|
("Edx", DWORD),
|
||||||
|
("Ecx", DWORD),
|
||||||
|
("Eax", DWORD),
|
||||||
|
("Ebp", DWORD),
|
||||||
|
("Eip", DWORD),
|
||||||
|
("SegCs", DWORD),
|
||||||
|
("EFlags", DWORD),
|
||||||
|
("Esp", DWORD),
|
||||||
|
("SegSs", DWORD),
|
||||||
|
("ExtendedRegisters", BYTE * (WOW64_MAXIMUM_SUPPORTED_EXTENSION)),
|
||||||
|
]
|
||||||
|
PWOW64_CONTEXT = POINTER(_WOW64_CONTEXT)
|
||||||
|
WOW64_CONTEXT = _WOW64_CONTEXT
|
||||||
|
|
||||||
|
class _M128A(Structure):
|
||||||
|
_fields_ = [
|
||||||
|
("Low", ULONGLONG),
|
||||||
|
("High", LONGLONG),
|
||||||
|
]
|
||||||
|
M128A = _M128A
|
||||||
|
PM128A = POINTER(_M128A)
|
||||||
|
|
||||||
|
class _XSAVE_FORMAT_64(Structure):
|
||||||
|
_fields_ = [
|
||||||
|
("ControlWord", WORD),
|
||||||
|
("StatusWord", WORD),
|
||||||
|
("TagWord", BYTE),
|
||||||
|
("Reserved1", BYTE),
|
||||||
|
("ErrorOpcode", WORD),
|
||||||
|
("ErrorOffset", DWORD),
|
||||||
|
("ErrorSelector", WORD),
|
||||||
|
("Reserved2", WORD),
|
||||||
|
("DataOffset", DWORD),
|
||||||
|
("DataSelector", WORD),
|
||||||
|
("Reserved3", WORD),
|
||||||
|
("MxCsr", DWORD),
|
||||||
|
("MxCsr_Mask", DWORD),
|
||||||
|
("FloatRegisters", M128A * (8)),
|
||||||
|
("XmmRegisters", M128A * (16)),
|
||||||
|
("Reserved4", BYTE * (96)),
|
||||||
|
]
|
||||||
|
PXSAVE_FORMAT_64 = POINTER(_XSAVE_FORMAT_64)
|
||||||
|
XSAVE_FORMAT_64 = _XSAVE_FORMAT_64
|
||||||
|
|
||||||
|
class _XSAVE_FORMAT_32(Structure):
|
||||||
|
_fields_ = [
|
||||||
|
("ControlWord", WORD),
|
||||||
|
("StatusWord", WORD),
|
||||||
|
("TagWord", BYTE),
|
||||||
|
("Reserved1", BYTE),
|
||||||
|
("ErrorOpcode", WORD),
|
||||||
|
("ErrorOffset", DWORD),
|
||||||
|
("ErrorSelector", WORD),
|
||||||
|
("Reserved2", WORD),
|
||||||
|
("DataOffset", DWORD),
|
||||||
|
("DataSelector", WORD),
|
||||||
|
("Reserved3", WORD),
|
||||||
|
("MxCsr", DWORD),
|
||||||
|
("MxCsr_Mask", DWORD),
|
||||||
|
("FloatRegisters", M128A * (8)),
|
||||||
|
("XmmRegisters", M128A * (8)),
|
||||||
|
("Reserved4", BYTE * (192)),
|
||||||
|
("StackControl", DWORD * (7)),
|
||||||
|
("Cr0NpxState", DWORD),
|
||||||
|
]
|
||||||
|
PXSAVE_FORMAT_32 = POINTER(_XSAVE_FORMAT_32)
|
||||||
|
XSAVE_FORMAT_32 = _XSAVE_FORMAT_32
|
||||||
|
|
||||||
|
class _ANON__ANON__CONTEXT64_SUB_UNION_1_SUB_STRUCTURE_1(Structure):
|
||||||
|
_fields_ = [
|
||||||
|
("Header", M128A * (2)),
|
||||||
|
("Legacy", M128A * (8)),
|
||||||
|
("Xmm0", M128A),
|
||||||
|
("Xmm1", M128A),
|
||||||
|
("Xmm2", M128A),
|
||||||
|
("Xmm3", M128A),
|
||||||
|
("Xmm4", M128A),
|
||||||
|
("Xmm5", M128A),
|
||||||
|
("Xmm6", M128A),
|
||||||
|
("Xmm7", M128A),
|
||||||
|
("Xmm8", M128A),
|
||||||
|
("Xmm9", M128A),
|
||||||
|
("Xmm10", M128A),
|
||||||
|
("Xmm11", M128A),
|
||||||
|
("Xmm12", M128A),
|
||||||
|
("Xmm13", M128A),
|
||||||
|
("Xmm14", M128A),
|
||||||
|
("Xmm15", M128A),
|
||||||
|
]
|
||||||
|
|
||||||
|
class _ANON__CONTEXT64_SUB_UNION_1(Union):
|
||||||
|
_anonymous_ = ("DUMMYSTRUCTNAME",)
|
||||||
|
_fields_ = [
|
||||||
|
("FltSave", XSAVE_FORMAT_64),
|
||||||
|
("DUMMYSTRUCTNAME", _ANON__ANON__CONTEXT64_SUB_UNION_1_SUB_STRUCTURE_1),
|
||||||
|
]
|
||||||
|
|
||||||
|
class _CONTEXT64(Structure):
|
||||||
|
_anonymous_ = ("DUMMYUNIONNAME",)
|
||||||
|
_fields_ = [
|
||||||
|
("P1Home", DWORD64),
|
||||||
|
("P2Home", DWORD64),
|
||||||
|
("P3Home", DWORD64),
|
||||||
|
("P4Home", DWORD64),
|
||||||
|
("P5Home", DWORD64),
|
||||||
|
("P6Home", DWORD64),
|
||||||
|
("ContextFlags", DWORD),
|
||||||
|
("MxCsr", DWORD),
|
||||||
|
("SegCs", WORD),
|
||||||
|
("SegDs", WORD),
|
||||||
|
("SegEs", WORD),
|
||||||
|
("SegFs", WORD),
|
||||||
|
("SegGs", WORD),
|
||||||
|
("SegSs", WORD),
|
||||||
|
("EFlags", DWORD),
|
||||||
|
("Dr0", DWORD64),
|
||||||
|
("Dr1", DWORD64),
|
||||||
|
("Dr2", DWORD64),
|
||||||
|
("Dr3", DWORD64),
|
||||||
|
("Dr6", DWORD64),
|
||||||
|
("Dr7", DWORD64),
|
||||||
|
("Rax", DWORD64),
|
||||||
|
("Rcx", DWORD64),
|
||||||
|
("Rdx", DWORD64),
|
||||||
|
("Rbx", DWORD64),
|
||||||
|
("Rsp", DWORD64),
|
||||||
|
("Rbp", DWORD64),
|
||||||
|
("Rsi", DWORD64),
|
||||||
|
("Rdi", DWORD64),
|
||||||
|
("R8", DWORD64),
|
||||||
|
("R9", DWORD64),
|
||||||
|
("R10", DWORD64),
|
||||||
|
("R11", DWORD64),
|
||||||
|
("R12", DWORD64),
|
||||||
|
("R13", DWORD64),
|
||||||
|
("R14", DWORD64),
|
||||||
|
("R15", DWORD64),
|
||||||
|
("Rip", DWORD64),
|
||||||
|
("DUMMYUNIONNAME", _ANON__CONTEXT64_SUB_UNION_1),
|
||||||
|
("VectorRegister", M128A * (26)),
|
||||||
|
("VectorControl", DWORD64),
|
||||||
|
("DebugControl", DWORD64),
|
||||||
|
("LastBranchToRip", DWORD64),
|
||||||
|
("LastBranchFromRip", DWORD64),
|
||||||
|
("LastExceptionToRip", DWORD64),
|
||||||
|
("LastExceptionFromRip", DWORD64),
|
||||||
|
]
|
||||||
|
CONTEXT64 = _CONTEXT64
|
||||||
|
LPCONTEXT64 = POINTER(_CONTEXT64)
|
||||||
|
PCONTEXT64 = POINTER(_CONTEXT64)
|
||||||
|
|
||||||
class _TRACE_PROVIDER_INFO(Structure):
|
class _TRACE_PROVIDER_INFO(Structure):
|
||||||
_fields_ = [
|
_fields_ = [
|
||||||
("ProviderGuid", GUID),
|
("ProviderGuid", GUID),
|
||||||
@@ -5495,123 +6013,6 @@ class _SECTION_INHERIT(EnumType):
|
|||||||
SECTION_INHERIT = _SECTION_INHERIT
|
SECTION_INHERIT = _SECTION_INHERIT
|
||||||
|
|
||||||
|
|
||||||
ProcessBasicInformation = EnumValue("_PROCESSINFOCLASS", "ProcessBasicInformation", 0x0)
|
|
||||||
ProcessQuotaLimits = EnumValue("_PROCESSINFOCLASS", "ProcessQuotaLimits", 0x1)
|
|
||||||
ProcessIoCounters = EnumValue("_PROCESSINFOCLASS", "ProcessIoCounters", 0x2)
|
|
||||||
ProcessVmCounters = EnumValue("_PROCESSINFOCLASS", "ProcessVmCounters", 0x3)
|
|
||||||
ProcessTimes = EnumValue("_PROCESSINFOCLASS", "ProcessTimes", 0x4)
|
|
||||||
ProcessBasePriority = EnumValue("_PROCESSINFOCLASS", "ProcessBasePriority", 0x5)
|
|
||||||
ProcessRaisePriority = EnumValue("_PROCESSINFOCLASS", "ProcessRaisePriority", 0x6)
|
|
||||||
ProcessDebugPort = EnumValue("_PROCESSINFOCLASS", "ProcessDebugPort", 0x7)
|
|
||||||
ProcessExceptionPort = EnumValue("_PROCESSINFOCLASS", "ProcessExceptionPort", 0x8)
|
|
||||||
ProcessAccessToken = EnumValue("_PROCESSINFOCLASS", "ProcessAccessToken", 0x9)
|
|
||||||
ProcessLdtInformation = EnumValue("_PROCESSINFOCLASS", "ProcessLdtInformation", 0xa)
|
|
||||||
ProcessLdtSize = EnumValue("_PROCESSINFOCLASS", "ProcessLdtSize", 0xb)
|
|
||||||
ProcessDefaultHardErrorMode = EnumValue("_PROCESSINFOCLASS", "ProcessDefaultHardErrorMode", 0xc)
|
|
||||||
ProcessIoPortHandlers = EnumValue("_PROCESSINFOCLASS", "ProcessIoPortHandlers", 0xd)
|
|
||||||
ProcessPooledUsageAndLimits = EnumValue("_PROCESSINFOCLASS", "ProcessPooledUsageAndLimits", 0xe)
|
|
||||||
ProcessWorkingSetWatch = EnumValue("_PROCESSINFOCLASS", "ProcessWorkingSetWatch", 0xf)
|
|
||||||
ProcessUserModeIOPL = EnumValue("_PROCESSINFOCLASS", "ProcessUserModeIOPL", 0x10)
|
|
||||||
ProcessEnableAlignmentFaultFixup = EnumValue("_PROCESSINFOCLASS", "ProcessEnableAlignmentFaultFixup", 0x11)
|
|
||||||
ProcessPriorityClass = EnumValue("_PROCESSINFOCLASS", "ProcessPriorityClass", 0x12)
|
|
||||||
ProcessWx86Information = EnumValue("_PROCESSINFOCLASS", "ProcessWx86Information", 0x13)
|
|
||||||
ProcessHandleCount = EnumValue("_PROCESSINFOCLASS", "ProcessHandleCount", 0x14)
|
|
||||||
ProcessAffinityMask = EnumValue("_PROCESSINFOCLASS", "ProcessAffinityMask", 0x15)
|
|
||||||
ProcessPriorityBoost = EnumValue("_PROCESSINFOCLASS", "ProcessPriorityBoost", 0x16)
|
|
||||||
ProcessDeviceMap = EnumValue("_PROCESSINFOCLASS", "ProcessDeviceMap", 0x17)
|
|
||||||
ProcessSessionInformation = EnumValue("_PROCESSINFOCLASS", "ProcessSessionInformation", 0x18)
|
|
||||||
ProcessForegroundInformation = EnumValue("_PROCESSINFOCLASS", "ProcessForegroundInformation", 0x19)
|
|
||||||
ProcessWow64Information = EnumValue("_PROCESSINFOCLASS", "ProcessWow64Information", 0x1a)
|
|
||||||
ProcessImageFileName = EnumValue("_PROCESSINFOCLASS", "ProcessImageFileName", 0x1b)
|
|
||||||
ProcessLUIDDeviceMapsEnabled = EnumValue("_PROCESSINFOCLASS", "ProcessLUIDDeviceMapsEnabled", 0x1c)
|
|
||||||
ProcessBreakOnTermination = EnumValue("_PROCESSINFOCLASS", "ProcessBreakOnTermination", 0x1d)
|
|
||||||
ProcessDebugObjectHandle = EnumValue("_PROCESSINFOCLASS", "ProcessDebugObjectHandle", 0x1e)
|
|
||||||
ProcessDebugFlags = EnumValue("_PROCESSINFOCLASS", "ProcessDebugFlags", 0x1f)
|
|
||||||
ProcessHandleTracing = EnumValue("_PROCESSINFOCLASS", "ProcessHandleTracing", 0x20)
|
|
||||||
ProcessIoPriority = EnumValue("_PROCESSINFOCLASS", "ProcessIoPriority", 0x21)
|
|
||||||
ProcessExecuteFlags = EnumValue("_PROCESSINFOCLASS", "ProcessExecuteFlags", 0x22)
|
|
||||||
ProcessTlsInformation = EnumValue("_PROCESSINFOCLASS", "ProcessTlsInformation", 0x23)
|
|
||||||
ProcessCookie = EnumValue("_PROCESSINFOCLASS", "ProcessCookie", 0x24)
|
|
||||||
ProcessImageInformation = EnumValue("_PROCESSINFOCLASS", "ProcessImageInformation", 0x25)
|
|
||||||
ProcessCycleTime = EnumValue("_PROCESSINFOCLASS", "ProcessCycleTime", 0x26)
|
|
||||||
ProcessPagePriority = EnumValue("_PROCESSINFOCLASS", "ProcessPagePriority", 0x27)
|
|
||||||
ProcessInstrumentationCallback = EnumValue("_PROCESSINFOCLASS", "ProcessInstrumentationCallback", 0x28)
|
|
||||||
ProcessThreadStackAllocation = EnumValue("_PROCESSINFOCLASS", "ProcessThreadStackAllocation", 0x29)
|
|
||||||
ProcessWorkingSetWatchEx = EnumValue("_PROCESSINFOCLASS", "ProcessWorkingSetWatchEx", 0x2a)
|
|
||||||
ProcessImageFileNameWin32 = EnumValue("_PROCESSINFOCLASS", "ProcessImageFileNameWin32", 0x2b)
|
|
||||||
ProcessImageFileMapping = EnumValue("_PROCESSINFOCLASS", "ProcessImageFileMapping", 0x2c)
|
|
||||||
ProcessAffinityUpdateMode = EnumValue("_PROCESSINFOCLASS", "ProcessAffinityUpdateMode", 0x2d)
|
|
||||||
ProcessMemoryAllocationMode = EnumValue("_PROCESSINFOCLASS", "ProcessMemoryAllocationMode", 0x2e)
|
|
||||||
ProcessGroupInformation = EnumValue("_PROCESSINFOCLASS", "ProcessGroupInformation", 0x2f)
|
|
||||||
ProcessTokenVirtualizationEnabled = EnumValue("_PROCESSINFOCLASS", "ProcessTokenVirtualizationEnabled", 0x30)
|
|
||||||
ProcessOwnerInformation = EnumValue("_PROCESSINFOCLASS", "ProcessOwnerInformation", 0x31)
|
|
||||||
ProcessWindowInformation = EnumValue("_PROCESSINFOCLASS", "ProcessWindowInformation", 0x32)
|
|
||||||
ProcessHandleInformation = EnumValue("_PROCESSINFOCLASS", "ProcessHandleInformation", 0x33)
|
|
||||||
ProcessMitigationPolicy = EnumValue("_PROCESSINFOCLASS", "ProcessMitigationPolicy", 0x34)
|
|
||||||
ProcessDynamicFunctionTableInformation = EnumValue("_PROCESSINFOCLASS", "ProcessDynamicFunctionTableInformation", 0x35)
|
|
||||||
ProcessHandleCheckingMode = EnumValue("_PROCESSINFOCLASS", "ProcessHandleCheckingMode", 0x36)
|
|
||||||
ProcessKeepAliveCount = EnumValue("_PROCESSINFOCLASS", "ProcessKeepAliveCount", 0x37)
|
|
||||||
ProcessRevokeFileHandles = EnumValue("_PROCESSINFOCLASS", "ProcessRevokeFileHandles", 0x38)
|
|
||||||
ProcessWorkingSetControl = EnumValue("_PROCESSINFOCLASS", "ProcessWorkingSetControl", 0x39)
|
|
||||||
ProcessHandleTable = EnumValue("_PROCESSINFOCLASS", "ProcessHandleTable", 0x3a)
|
|
||||||
ProcessCheckStackExtentsMode = EnumValue("_PROCESSINFOCLASS", "ProcessCheckStackExtentsMode", 0x3b)
|
|
||||||
ProcessCommandLineInformation = EnumValue("_PROCESSINFOCLASS", "ProcessCommandLineInformation", 0x3c)
|
|
||||||
ProcessProtectionInformation = EnumValue("_PROCESSINFOCLASS", "ProcessProtectionInformation", 0x3d)
|
|
||||||
ProcessMemoryExhaustion = EnumValue("_PROCESSINFOCLASS", "ProcessMemoryExhaustion", 0x3e)
|
|
||||||
ProcessFaultInformation = EnumValue("_PROCESSINFOCLASS", "ProcessFaultInformation", 0x3f)
|
|
||||||
ProcessTelemetryIdInformation = EnumValue("_PROCESSINFOCLASS", "ProcessTelemetryIdInformation", 0x40)
|
|
||||||
ProcessCommitReleaseInformation = EnumValue("_PROCESSINFOCLASS", "ProcessCommitReleaseInformation", 0x41)
|
|
||||||
ProcessReserved1Information = EnumValue("_PROCESSINFOCLASS", "ProcessReserved1Information", 0x42)
|
|
||||||
ProcessReserved2Information = EnumValue("_PROCESSINFOCLASS", "ProcessReserved2Information", 0x43)
|
|
||||||
ProcessSubsystemProcess = EnumValue("_PROCESSINFOCLASS", "ProcessSubsystemProcess", 0x44)
|
|
||||||
ProcessInPrivate = EnumValue("_PROCESSINFOCLASS", "ProcessInPrivate", 0x46)
|
|
||||||
ProcessRaiseUMExceptionOnInvalidHandleClose = EnumValue("_PROCESSINFOCLASS", "ProcessRaiseUMExceptionOnInvalidHandleClose", 0x47)
|
|
||||||
ProcessSubsystemInformation = EnumValue("_PROCESSINFOCLASS", "ProcessSubsystemInformation", 0x4b)
|
|
||||||
ProcessWin32kSyscallFilterInformation = EnumValue("_PROCESSINFOCLASS", "ProcessWin32kSyscallFilterInformation", 0x4f)
|
|
||||||
ProcessEnergyTrackingState = EnumValue("_PROCESSINFOCLASS", "ProcessEnergyTrackingState", 0x52)
|
|
||||||
MaxProcessInfoClass = EnumValue("_PROCESSINFOCLASS", "MaxProcessInfoClass", 0x53)
|
|
||||||
class _PROCESSINFOCLASS(EnumType):
|
|
||||||
values = [ProcessBasicInformation, ProcessQuotaLimits, ProcessIoCounters, ProcessVmCounters, ProcessTimes, ProcessBasePriority, ProcessRaisePriority, ProcessDebugPort, ProcessExceptionPort, ProcessAccessToken, ProcessLdtInformation, ProcessLdtSize, ProcessDefaultHardErrorMode, ProcessIoPortHandlers, ProcessPooledUsageAndLimits, ProcessWorkingSetWatch, ProcessUserModeIOPL, ProcessEnableAlignmentFaultFixup, ProcessPriorityClass, ProcessWx86Information, ProcessHandleCount, ProcessAffinityMask, ProcessPriorityBoost, ProcessDeviceMap, ProcessSessionInformation, ProcessForegroundInformation, ProcessWow64Information, ProcessImageFileName, ProcessLUIDDeviceMapsEnabled, ProcessBreakOnTermination, ProcessDebugObjectHandle, ProcessDebugFlags, ProcessHandleTracing, ProcessIoPriority, ProcessExecuteFlags, ProcessTlsInformation, ProcessCookie, ProcessImageInformation, ProcessCycleTime, ProcessPagePriority, ProcessInstrumentationCallback, ProcessThreadStackAllocation, ProcessWorkingSetWatchEx, ProcessImageFileNameWin32, ProcessImageFileMapping, ProcessAffinityUpdateMode, ProcessMemoryAllocationMode, ProcessGroupInformation, ProcessTokenVirtualizationEnabled, ProcessOwnerInformation, ProcessWindowInformation, ProcessHandleInformation, ProcessMitigationPolicy, ProcessDynamicFunctionTableInformation, ProcessHandleCheckingMode, ProcessKeepAliveCount, ProcessRevokeFileHandles, ProcessWorkingSetControl, ProcessHandleTable, ProcessCheckStackExtentsMode, ProcessCommandLineInformation, ProcessProtectionInformation, ProcessMemoryExhaustion, ProcessFaultInformation, ProcessTelemetryIdInformation, ProcessCommitReleaseInformation, ProcessReserved1Information, ProcessReserved2Information, ProcessSubsystemProcess, ProcessInPrivate, ProcessRaiseUMExceptionOnInvalidHandleClose, ProcessSubsystemInformation, ProcessWin32kSyscallFilterInformation, ProcessEnergyTrackingState, MaxProcessInfoClass]
|
|
||||||
mapper = FlagMapper(*values)
|
|
||||||
PROCESSINFOCLASS = _PROCESSINFOCLASS
|
|
||||||
|
|
||||||
|
|
||||||
MemoryBasicInformation = EnumValue("_MEMORY_INFORMATION_CLASS", "MemoryBasicInformation", 0x0)
|
|
||||||
MemoryWorkingSetList = EnumValue("_MEMORY_INFORMATION_CLASS", "MemoryWorkingSetList", 0x1)
|
|
||||||
MemorySectionName = EnumValue("_MEMORY_INFORMATION_CLASS", "MemorySectionName", 0x2)
|
|
||||||
MemoryBasicVlmInformation = EnumValue("_MEMORY_INFORMATION_CLASS", "MemoryBasicVlmInformation", 0x3)
|
|
||||||
MemoryWorkingSetListEx = EnumValue("_MEMORY_INFORMATION_CLASS", "MemoryWorkingSetListEx", 0x4)
|
|
||||||
class _MEMORY_INFORMATION_CLASS(EnumType):
|
|
||||||
values = [MemoryBasicInformation, MemoryWorkingSetList, MemorySectionName, MemoryBasicVlmInformation, MemoryWorkingSetListEx]
|
|
||||||
mapper = FlagMapper(*values)
|
|
||||||
MEMORY_INFORMATION_CLASS = _MEMORY_INFORMATION_CLASS
|
|
||||||
|
|
||||||
|
|
||||||
ThreadBasicInformation = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadBasicInformation", 0x0)
|
|
||||||
ThreadTimes = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadTimes", 0x1)
|
|
||||||
ThreadPriority = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadPriority", 0x2)
|
|
||||||
ThreadBasePriority = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadBasePriority", 0x3)
|
|
||||||
ThreadAffinityMask = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadAffinityMask", 0x4)
|
|
||||||
ThreadImpersonationToken = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadImpersonationToken", 0x5)
|
|
||||||
ThreadDescriptorTableEntry = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadDescriptorTableEntry", 0x6)
|
|
||||||
ThreadEnableAlignmentFaultFixup = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadEnableAlignmentFaultFixup", 0x7)
|
|
||||||
ThreadEventPair = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadEventPair", 0x8)
|
|
||||||
ThreadQuerySetWin32StartAddress = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadQuerySetWin32StartAddress", 0x9)
|
|
||||||
ThreadZeroTlsCell = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadZeroTlsCell", 0xa)
|
|
||||||
ThreadPerformanceCount = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadPerformanceCount", 0xb)
|
|
||||||
ThreadAmILastThread = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadAmILastThread", 0xc)
|
|
||||||
ThreadIdealProcessor = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadIdealProcessor", 0xd)
|
|
||||||
ThreadPriorityBoost = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadPriorityBoost", 0xe)
|
|
||||||
ThreadSetTlsArrayAddress = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadSetTlsArrayAddress", 0xf)
|
|
||||||
ThreadIsIoPending = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadIsIoPending", 0x10)
|
|
||||||
ThreadHideFromDebugger = EnumValue("_THREAD_INFORMATION_CLASS", "ThreadHideFromDebugger", 0x11)
|
|
||||||
class _THREAD_INFORMATION_CLASS(EnumType):
|
|
||||||
values = [ThreadBasicInformation, ThreadTimes, ThreadPriority, ThreadBasePriority, ThreadAffinityMask, ThreadImpersonationToken, ThreadDescriptorTableEntry, ThreadEnableAlignmentFaultFixup, ThreadEventPair, ThreadQuerySetWin32StartAddress, ThreadZeroTlsCell, ThreadPerformanceCount, ThreadAmILastThread, ThreadIdealProcessor, ThreadPriorityBoost, ThreadSetTlsArrayAddress, ThreadIsIoPending, ThreadHideFromDebugger]
|
|
||||||
mapper = FlagMapper(*values)
|
|
||||||
PTHREAD_INFORMATION_CLASS = POINTER(_THREAD_INFORMATION_CLASS)
|
|
||||||
THREAD_INFORMATION_CLASS = _THREAD_INFORMATION_CLASS
|
|
||||||
|
|
||||||
|
|
||||||
VT_EMPTY = EnumValue("_VARENUM", "VT_EMPTY", 0x0)
|
VT_EMPTY = EnumValue("_VARENUM", "VT_EMPTY", 0x0)
|
||||||
VT_NULL = EnumValue("_VARENUM", "VT_NULL", 0x1)
|
VT_NULL = EnumValue("_VARENUM", "VT_NULL", 0x1)
|
||||||
VT_I2 = EnumValue("_VARENUM", "VT_I2", 0x2)
|
VT_I2 = EnumValue("_VARENUM", "VT_I2", 0x2)
|
||||||
@@ -6227,234 +6628,6 @@ LPPROCESS_INFORMATION = POINTER(_PROCESS_INFORMATION)
|
|||||||
PPROCESS_INFORMATION = POINTER(_PROCESS_INFORMATION)
|
PPROCESS_INFORMATION = POINTER(_PROCESS_INFORMATION)
|
||||||
PROCESS_INFORMATION = _PROCESS_INFORMATION
|
PROCESS_INFORMATION = _PROCESS_INFORMATION
|
||||||
|
|
||||||
class _FLOATING_SAVE_AREA(Structure):
|
|
||||||
_fields_ = [
|
|
||||||
("ControlWord", DWORD),
|
|
||||||
("StatusWord", DWORD),
|
|
||||||
("TagWord", DWORD),
|
|
||||||
("ErrorOffset", DWORD),
|
|
||||||
("ErrorSelector", DWORD),
|
|
||||||
("DataOffset", DWORD),
|
|
||||||
("DataSelector", DWORD),
|
|
||||||
("RegisterArea", BYTE * (80)),
|
|
||||||
("Cr0NpxState", DWORD),
|
|
||||||
]
|
|
||||||
FLOATING_SAVE_AREA = _FLOATING_SAVE_AREA
|
|
||||||
|
|
||||||
class _CONTEXT32(Structure):
|
|
||||||
_fields_ = [
|
|
||||||
("ContextFlags", DWORD),
|
|
||||||
("Dr0", DWORD),
|
|
||||||
("Dr1", DWORD),
|
|
||||||
("Dr2", DWORD),
|
|
||||||
("Dr3", DWORD),
|
|
||||||
("Dr6", DWORD),
|
|
||||||
("Dr7", DWORD),
|
|
||||||
("FloatSave", FLOATING_SAVE_AREA),
|
|
||||||
("SegGs", DWORD),
|
|
||||||
("SegFs", DWORD),
|
|
||||||
("SegEs", DWORD),
|
|
||||||
("SegDs", DWORD),
|
|
||||||
("Edi", DWORD),
|
|
||||||
("Esi", DWORD),
|
|
||||||
("Ebx", DWORD),
|
|
||||||
("Edx", DWORD),
|
|
||||||
("Ecx", DWORD),
|
|
||||||
("Eax", DWORD),
|
|
||||||
("Ebp", DWORD),
|
|
||||||
("Eip", DWORD),
|
|
||||||
("SegCs", DWORD),
|
|
||||||
("EFlags", DWORD),
|
|
||||||
("Esp", DWORD),
|
|
||||||
("SegSs", DWORD),
|
|
||||||
("ExtendedRegisters", BYTE * (512)),
|
|
||||||
]
|
|
||||||
CONTEXT32 = _CONTEXT32
|
|
||||||
LPCONTEXT32 = POINTER(_CONTEXT32)
|
|
||||||
PCONTEXT32 = POINTER(_CONTEXT32)
|
|
||||||
|
|
||||||
class _WOW64_FLOATING_SAVE_AREA(Structure):
|
|
||||||
_fields_ = [
|
|
||||||
("ControlWord", DWORD),
|
|
||||||
("StatusWord", DWORD),
|
|
||||||
("TagWord", DWORD),
|
|
||||||
("ErrorOffset", DWORD),
|
|
||||||
("ErrorSelector", DWORD),
|
|
||||||
("DataOffset", DWORD),
|
|
||||||
("DataSelector", DWORD),
|
|
||||||
("RegisterArea", BYTE * (WOW64_SIZE_OF_80387_REGISTERS)),
|
|
||||||
("Cr0NpxState", DWORD),
|
|
||||||
]
|
|
||||||
WOW64_FLOATING_SAVE_AREA = _WOW64_FLOATING_SAVE_AREA
|
|
||||||
|
|
||||||
class _WOW64_CONTEXT(Structure):
|
|
||||||
_fields_ = [
|
|
||||||
("ContextFlags", DWORD),
|
|
||||||
("Dr0", DWORD),
|
|
||||||
("Dr1", DWORD),
|
|
||||||
("Dr2", DWORD),
|
|
||||||
("Dr3", DWORD),
|
|
||||||
("Dr6", DWORD),
|
|
||||||
("Dr7", DWORD),
|
|
||||||
("FloatSave", WOW64_FLOATING_SAVE_AREA),
|
|
||||||
("SegGs", DWORD),
|
|
||||||
("SegFs", DWORD),
|
|
||||||
("SegEs", DWORD),
|
|
||||||
("SegDs", DWORD),
|
|
||||||
("Edi", DWORD),
|
|
||||||
("Esi", DWORD),
|
|
||||||
("Ebx", DWORD),
|
|
||||||
("Edx", DWORD),
|
|
||||||
("Ecx", DWORD),
|
|
||||||
("Eax", DWORD),
|
|
||||||
("Ebp", DWORD),
|
|
||||||
("Eip", DWORD),
|
|
||||||
("SegCs", DWORD),
|
|
||||||
("EFlags", DWORD),
|
|
||||||
("Esp", DWORD),
|
|
||||||
("SegSs", DWORD),
|
|
||||||
("ExtendedRegisters", BYTE * (WOW64_MAXIMUM_SUPPORTED_EXTENSION)),
|
|
||||||
]
|
|
||||||
PWOW64_CONTEXT = POINTER(_WOW64_CONTEXT)
|
|
||||||
WOW64_CONTEXT = _WOW64_CONTEXT
|
|
||||||
|
|
||||||
class _M128A(Structure):
|
|
||||||
_fields_ = [
|
|
||||||
("Low", ULONGLONG),
|
|
||||||
("High", LONGLONG),
|
|
||||||
]
|
|
||||||
M128A = _M128A
|
|
||||||
PM128A = POINTER(_M128A)
|
|
||||||
|
|
||||||
class _XSAVE_FORMAT_64(Structure):
|
|
||||||
_fields_ = [
|
|
||||||
("ControlWord", WORD),
|
|
||||||
("StatusWord", WORD),
|
|
||||||
("TagWord", BYTE),
|
|
||||||
("Reserved1", BYTE),
|
|
||||||
("ErrorOpcode", WORD),
|
|
||||||
("ErrorOffset", DWORD),
|
|
||||||
("ErrorSelector", WORD),
|
|
||||||
("Reserved2", WORD),
|
|
||||||
("DataOffset", DWORD),
|
|
||||||
("DataSelector", WORD),
|
|
||||||
("Reserved3", WORD),
|
|
||||||
("MxCsr", DWORD),
|
|
||||||
("MxCsr_Mask", DWORD),
|
|
||||||
("FloatRegisters", M128A * (8)),
|
|
||||||
("XmmRegisters", M128A * (16)),
|
|
||||||
("Reserved4", BYTE * (96)),
|
|
||||||
]
|
|
||||||
PXSAVE_FORMAT_64 = POINTER(_XSAVE_FORMAT_64)
|
|
||||||
XSAVE_FORMAT_64 = _XSAVE_FORMAT_64
|
|
||||||
|
|
||||||
class _XSAVE_FORMAT_32(Structure):
|
|
||||||
_fields_ = [
|
|
||||||
("ControlWord", WORD),
|
|
||||||
("StatusWord", WORD),
|
|
||||||
("TagWord", BYTE),
|
|
||||||
("Reserved1", BYTE),
|
|
||||||
("ErrorOpcode", WORD),
|
|
||||||
("ErrorOffset", DWORD),
|
|
||||||
("ErrorSelector", WORD),
|
|
||||||
("Reserved2", WORD),
|
|
||||||
("DataOffset", DWORD),
|
|
||||||
("DataSelector", WORD),
|
|
||||||
("Reserved3", WORD),
|
|
||||||
("MxCsr", DWORD),
|
|
||||||
("MxCsr_Mask", DWORD),
|
|
||||||
("FloatRegisters", M128A * (8)),
|
|
||||||
("XmmRegisters", M128A * (8)),
|
|
||||||
("Reserved4", BYTE * (192)),
|
|
||||||
("StackControl", DWORD * (7)),
|
|
||||||
("Cr0NpxState", DWORD),
|
|
||||||
]
|
|
||||||
PXSAVE_FORMAT_32 = POINTER(_XSAVE_FORMAT_32)
|
|
||||||
XSAVE_FORMAT_32 = _XSAVE_FORMAT_32
|
|
||||||
|
|
||||||
class _TMP_DUMMYSTRUCTNAME(Structure):
|
|
||||||
_fields_ = [
|
|
||||||
("Header", M128A * (2)),
|
|
||||||
("Legacy", M128A * (8)),
|
|
||||||
("Xmm0", M128A),
|
|
||||||
("Xmm1", M128A),
|
|
||||||
("Xmm2", M128A),
|
|
||||||
("Xmm3", M128A),
|
|
||||||
("Xmm4", M128A),
|
|
||||||
("Xmm5", M128A),
|
|
||||||
("Xmm6", M128A),
|
|
||||||
("Xmm7", M128A),
|
|
||||||
("Xmm8", M128A),
|
|
||||||
("Xmm9", M128A),
|
|
||||||
("Xmm10", M128A),
|
|
||||||
("Xmm11", M128A),
|
|
||||||
("Xmm12", M128A),
|
|
||||||
("Xmm13", M128A),
|
|
||||||
("Xmm14", M128A),
|
|
||||||
("Xmm15", M128A),
|
|
||||||
]
|
|
||||||
TMP_DUMMYSTRUCTNAME = _TMP_DUMMYSTRUCTNAME
|
|
||||||
|
|
||||||
class _TMP_CONTEXT64_SUBUNION(Union):
|
|
||||||
_fields_ = [
|
|
||||||
("FltSave", XSAVE_FORMAT_64),
|
|
||||||
("DUMMYSTRUCTNAME", TMP_DUMMYSTRUCTNAME),
|
|
||||||
]
|
|
||||||
TMP_CONTEXT64_SUBUNION = _TMP_CONTEXT64_SUBUNION
|
|
||||||
|
|
||||||
class _CONTEXT64(Structure):
|
|
||||||
_fields_ = [
|
|
||||||
("P1Home", DWORD64),
|
|
||||||
("P2Home", DWORD64),
|
|
||||||
("P3Home", DWORD64),
|
|
||||||
("P4Home", DWORD64),
|
|
||||||
("P5Home", DWORD64),
|
|
||||||
("P6Home", DWORD64),
|
|
||||||
("ContextFlags", DWORD),
|
|
||||||
("MxCsr", DWORD),
|
|
||||||
("SegCs", WORD),
|
|
||||||
("SegDs", WORD),
|
|
||||||
("SegEs", WORD),
|
|
||||||
("SegFs", WORD),
|
|
||||||
("SegGs", WORD),
|
|
||||||
("SegSs", WORD),
|
|
||||||
("EFlags", DWORD),
|
|
||||||
("Dr0", DWORD64),
|
|
||||||
("Dr1", DWORD64),
|
|
||||||
("Dr2", DWORD64),
|
|
||||||
("Dr3", DWORD64),
|
|
||||||
("Dr6", DWORD64),
|
|
||||||
("Dr7", DWORD64),
|
|
||||||
("Rax", DWORD64),
|
|
||||||
("Rcx", DWORD64),
|
|
||||||
("Rdx", DWORD64),
|
|
||||||
("Rbx", DWORD64),
|
|
||||||
("Rsp", DWORD64),
|
|
||||||
("Rbp", DWORD64),
|
|
||||||
("Rsi", DWORD64),
|
|
||||||
("Rdi", DWORD64),
|
|
||||||
("R8", DWORD64),
|
|
||||||
("R9", DWORD64),
|
|
||||||
("R10", DWORD64),
|
|
||||||
("R11", DWORD64),
|
|
||||||
("R12", DWORD64),
|
|
||||||
("R13", DWORD64),
|
|
||||||
("R14", DWORD64),
|
|
||||||
("R15", DWORD64),
|
|
||||||
("Rip", DWORD64),
|
|
||||||
("DUMMYUNIONNAME", TMP_CONTEXT64_SUBUNION),
|
|
||||||
("VectorRegister", M128A * (26)),
|
|
||||||
("VectorControl", DWORD64),
|
|
||||||
("DebugControl", DWORD64),
|
|
||||||
("LastBranchToRip", DWORD64),
|
|
||||||
("LastBranchFromRip", DWORD64),
|
|
||||||
("LastExceptionToRip", DWORD64),
|
|
||||||
("LastExceptionFromRip", DWORD64),
|
|
||||||
]
|
|
||||||
CONTEXT64 = _CONTEXT64
|
|
||||||
LPCONTEXT64 = POINTER(_CONTEXT64)
|
|
||||||
PCONTEXT64 = POINTER(_CONTEXT64)
|
|
||||||
|
|
||||||
class tagPROCESSENTRY32W(Structure):
|
class tagPROCESSENTRY32W(Structure):
|
||||||
_fields_ = [
|
_fields_ = [
|
||||||
("dwSize", DWORD),
|
("dwSize", DWORD),
|
||||||
|
|||||||
@@ -184,6 +184,8 @@ def perform_manual_getproc_loadlib(target, *args, **kwargs):
|
|||||||
|
|
||||||
|
|
||||||
def load_dll_in_remote_process(target, dll_path):
|
def load_dll_in_remote_process(target, dll_path):
|
||||||
|
if target.architecture == gdef.IMAGE_FILE_MACHINE_ARM64:
|
||||||
|
raise NotImplementedError("Injection in ARM64 target process is not implemented")
|
||||||
rpeb = target.peb
|
rpeb = target.peb
|
||||||
if rpeb.Ldr:
|
if rpeb.Ldr:
|
||||||
# LDR est parcourable, ca va etre deja plus simple..
|
# LDR est parcourable, ca va etre deja plus simple..
|
||||||
@@ -372,6 +374,8 @@ def generate_python_exec_shellcode_64(target, PyDll):
|
|||||||
|
|
||||||
def inject_python_command(target, code_injected, PYDLL):
|
def inject_python_command(target, code_injected, PYDLL):
|
||||||
"""Postulate: PYDLL is already loaded in target process"""
|
"""Postulate: PYDLL is already loaded in target process"""
|
||||||
|
if target.architecture == gdef.IMAGE_FILE_MACHINE_ARM64:
|
||||||
|
raise NotImplementedError("Injection in ARM64 target process is not implemented")
|
||||||
PYCODE = code_injected + "\x00"
|
PYCODE = code_injected + "\x00"
|
||||||
# TODO: free this (how ? when ?)
|
# TODO: free this (how ? when ?)
|
||||||
remote_python_code_addr = target.virtual_alloc(len(PYCODE))
|
remote_python_code_addr = target.virtual_alloc(len(PYCODE))
|
||||||
|
|||||||
@@ -0,0 +1,627 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import sys
|
||||||
|
import collections
|
||||||
|
import struct
|
||||||
|
import binascii
|
||||||
|
import operator
|
||||||
|
|
||||||
|
|
||||||
|
# py3
|
||||||
|
is_py3 = (sys.version_info.major >= 3)
|
||||||
|
if is_py3:
|
||||||
|
basestring = str
|
||||||
|
int_types = int
|
||||||
|
else:
|
||||||
|
int_types = (int, long)
|
||||||
|
|
||||||
|
# https://documentation-service.arm.com/static/67581b3355451e3c38d97c22
|
||||||
|
# Chapter C4: A64 Instruction Set Encoding: :
|
||||||
|
|
||||||
|
## C2.1.3
|
||||||
|
# 32-bit variant (sf = 0).
|
||||||
|
# 64-bit variant (sf = 1).
|
||||||
|
|
||||||
|
## C2.1.5
|
||||||
|
# The following symbol conventions are used:
|
||||||
|
# <Xn> The 64-bit name of a general-purpose register (X0-X30) or the zero register (XZR).
|
||||||
|
# <Wn> The 32-bit name of a general-purpose register (W0-W30) or the zero register (WZR).
|
||||||
|
# <Xn|SP> The 64-bit name of a general-purpose register (X0-X30) or the current stack pointer (SP).
|
||||||
|
# <Wn|WSP> The 32-bit name of a general-purpose register (W0-W30) or the current stack pointer (WSP).
|
||||||
|
# <Bn>, <Hn>, <Sn>, <Dn>, <Qn>
|
||||||
|
# The 8, 16, 32, 64, or 128-bit name of a SIMD and floating-point register in a scalar context, as
|
||||||
|
# described in Register names.
|
||||||
|
# <Vn> The name of a SIMD and floating-point register in a vector context, as described in Register names.
|
||||||
|
# <Zn> The name of an SVE scalable vector register, as described in Treatment of SVE scalable vector
|
||||||
|
# registers.
|
||||||
|
# <Pn> The name of an SVE scalable predicate register, as described in Vector predication
|
||||||
|
|
||||||
|
|
||||||
|
# Make a special memoryview that match what is show in the ARM Chapter C4 ?
|
||||||
|
|
||||||
|
# A lot of hardcoded bits are filled this way:
|
||||||
|
|
||||||
|
## self.bits[24:32] = reversed(bytearray(XXX))
|
||||||
|
|
||||||
|
# This allow to write the bits in the same order as the ARM manual which is describe with most significant bit first
|
||||||
|
# Whereas our internal structure is reverse for simplicity of mapping it on list index
|
||||||
|
|
||||||
|
XREGISTER = {'X0', 'X1', 'X2', 'X3', 'X4', 'X5', 'X6', 'X7', 'X8', 'X9', 'X10', 'X11', 'X12', 'X13', 'X14', 'X15', 'X16', 'X17', 'X18', 'X19', 'X20', 'X21', 'X22', 'X23', 'X24', 'X25', 'X26', 'X27', 'X28', 'X29', 'X30'}
|
||||||
|
WREGISTER = {'W0', 'W1', 'W2', 'W3', 'W4', 'W5', 'W6', 'W7', 'W8', 'W9', 'W10', 'W11', 'W12', 'W13', 'W14', 'W15', 'W16', 'W17', 'W18', 'W19', 'W20', 'W21', 'W22', 'W23', 'W24', 'W25', 'W26', 'W27', 'W28', 'W29', 'W30'}
|
||||||
|
ALL_REGISTER = XREGISTER | WREGISTER
|
||||||
|
|
||||||
|
SP = "SP"
|
||||||
|
WSP = "WSP"
|
||||||
|
|
||||||
|
ZR = "XZR"
|
||||||
|
WZR = "WZR"
|
||||||
|
# Special register name for simple_arm64 that do not setup bitness
|
||||||
|
# Bitness will depends on others registers in the instruction
|
||||||
|
ZERO = "ZERO"
|
||||||
|
|
||||||
|
SPECIAL_X31 = set((SP, WSP, ZR, WZR, ZERO))
|
||||||
|
|
||||||
|
# Argument class
|
||||||
|
class Shift(object):
|
||||||
|
"""Represent a shift parameter of an instruction.
|
||||||
|
Allow to JIT shift at instruction crafting time without string manipulation for the #XXX"""
|
||||||
|
def __init__(self, type, value):
|
||||||
|
assert isinstance(type, str)
|
||||||
|
assert isinstance(value, int)
|
||||||
|
type = type.upper()
|
||||||
|
assert type in ("LSL", "LSR", "ASR", "ROR")
|
||||||
|
self.type = type
|
||||||
|
self.value = value
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
if not isinstance(other, Shift): # Allow compare to tuple & iterable
|
||||||
|
return ((len(other) == 2) and
|
||||||
|
(self.type == other[0]) and
|
||||||
|
(self.value == other[1]))
|
||||||
|
return (self.type == other.type) and (self.value == other.value)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return """{0}(type={1}, value={2})""".format(type(self).__name__, self.type, self.value)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def parse(cls, shiftstr):
|
||||||
|
if not isinstance(shiftstr, str):
|
||||||
|
return None
|
||||||
|
if not shiftstr.count(" ") == 1:
|
||||||
|
return None
|
||||||
|
stype, svalue = shiftstr.split(" ", 1)
|
||||||
|
stype = stype.upper()
|
||||||
|
if stype not in ("LSL", "LSR", "ASR", "ROR"):
|
||||||
|
return None
|
||||||
|
if len(svalue) <= 1:
|
||||||
|
return None
|
||||||
|
if not svalue.startswith("#"):
|
||||||
|
return None
|
||||||
|
try:
|
||||||
|
intvalue = int(svalue[1:])
|
||||||
|
except ValueError:
|
||||||
|
return None
|
||||||
|
return cls(stype, intvalue)
|
||||||
|
# instruction Encoding
|
||||||
|
|
||||||
|
class InstructionEncoding(object):
|
||||||
|
# Sub classes can force 32/64 only instrs by setting this to 32 or 64
|
||||||
|
BITNESS = None
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
super(InstructionEncoding, self).__init__()
|
||||||
|
# Bits are in
|
||||||
|
# 0 1 2 3 4 ... 31
|
||||||
|
# Translation to real little-endian is done last
|
||||||
|
self.bytearray = bytearray(32)
|
||||||
|
self.bits = memoryview(self.bytearray)
|
||||||
|
|
||||||
|
self.bitness = self.BITNESS
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def is_register(self, arg, accept_sp=False):
|
||||||
|
arg = arg.upper()
|
||||||
|
return (arg in ALL_REGISTER or
|
||||||
|
(accept_sp and (arg in [SP, WSP])) or
|
||||||
|
(not accept_sp and (arg in [ZR, WZR, ZERO])))
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def is_imm(self, arg):
|
||||||
|
try:
|
||||||
|
value = int(arg)
|
||||||
|
except (ValueError, TypeError):
|
||||||
|
return False
|
||||||
|
return True # Check size max ?
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def is_shift(self, arg):
|
||||||
|
return (arg is None) or isinstance(arg, Shift) or Shift.parse(arg)
|
||||||
|
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def gen(cls, **encoding_array):
|
||||||
|
class GeneratedEncodingCls(cls):
|
||||||
|
ENCODING_VALUES = encoding_array
|
||||||
|
return GeneratedEncodingCls
|
||||||
|
|
||||||
|
# Instruction filing at instanciation
|
||||||
|
|
||||||
|
def setup_fixed_values(self):
|
||||||
|
# Setup the values registered by InstructionEncoding.gen(x=1, y=2)
|
||||||
|
for name, value in self.ENCODING_VALUES.items():
|
||||||
|
assert isinstance(value, int)
|
||||||
|
self.setup_immediat(getattr(self, name), value)
|
||||||
|
|
||||||
|
def binencode_imm(self, immediat, outsize):
|
||||||
|
binstr = "{:0{outsize}b}".format(immediat, outsize=outsize)
|
||||||
|
if len(binstr) != outsize:
|
||||||
|
raise ValueError("Could not encode immediat {0} in {1} bits. Value take {2} bits".format(immediat, outsize, len(binstr)))
|
||||||
|
|
||||||
|
binlist = [int(c) for c in reversed(binstr)]
|
||||||
|
return bytearray(binlist)
|
||||||
|
|
||||||
|
def setup_bitness(self, bitness):
|
||||||
|
assert bitness in (32, 64)
|
||||||
|
if self.bitness is None:
|
||||||
|
self.bitness = bitness
|
||||||
|
if bitness == 32:
|
||||||
|
self.sf[:] = b"\x00"
|
||||||
|
else: # bitness == 64:
|
||||||
|
self.sf[:] = b"\x01"
|
||||||
|
if self.bitness != bitness:
|
||||||
|
raise ValueError("Bitness mismatch on <{0}> encoding, instruction is alredy {1} cannot set as {2}".format(type(self).__name__, self.bitness, bitness))
|
||||||
|
|
||||||
|
def encode_register(self, register, outsize=5):
|
||||||
|
register = register.upper()
|
||||||
|
if register in SPECIAL_X31:
|
||||||
|
if register == ZERO:
|
||||||
|
pass # Special simple_arm64 value that do not setup bitness
|
||||||
|
elif register.startswith("W"):
|
||||||
|
self.setup_bitness(32)
|
||||||
|
else:
|
||||||
|
self.setup_bitness(64)
|
||||||
|
return self.binencode_imm(31, outsize)
|
||||||
|
|
||||||
|
assert register in ALL_REGISTER
|
||||||
|
if register in XREGISTER:
|
||||||
|
self.setup_bitness(64)
|
||||||
|
else:
|
||||||
|
self.setup_bitness(32)
|
||||||
|
return self.binencode_imm(int(register[1:]), outsize)
|
||||||
|
|
||||||
|
def setup_register(self, regfield, register):
|
||||||
|
encoded = self.encode_register(register)
|
||||||
|
regfield[:] = encoded
|
||||||
|
|
||||||
|
# Instruction filing at instanciation
|
||||||
|
def setup_immediat(self, immfield, value):
|
||||||
|
immsize = len(immfield)
|
||||||
|
immfield[:] = self.binencode_imm(value, immsize)
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# C4.1.93 Data Processing - Immediate
|
||||||
|
|
||||||
|
class DataProcessingImmediate(InstructionEncoding):
|
||||||
|
def __init__(self):
|
||||||
|
super(DataProcessingImmediate, self).__init__()
|
||||||
|
self.bits[26:29] = bytearray((0,0,1))
|
||||||
|
self.op0 = self.bits[29:31]
|
||||||
|
self.op1 = self.bits[22:26]
|
||||||
|
|
||||||
|
class AddSubtractImmediate(DataProcessingImmediate):
|
||||||
|
def __init__(self, argsdict):
|
||||||
|
super(AddSubtractImmediate, self).__init__()
|
||||||
|
self.sf = self.bits[31:32] # Keep it a memoryview
|
||||||
|
self.op = self.bits[30:31] # Keep it a memoryview
|
||||||
|
self.S = self.bits[29:30] # Keep it a memoryview
|
||||||
|
self.bits[23:29] = bytearray((0, 1, 0, 0, 0, 1))
|
||||||
|
self.sh = self.bits[22:23]
|
||||||
|
self.imm12 = self.bits[10:22]
|
||||||
|
self.rn = self.bits[5:10]
|
||||||
|
self.rd = self.bits[0:5]
|
||||||
|
|
||||||
|
|
||||||
|
self.setup_fixed_values()
|
||||||
|
# Change instruction based of parameter
|
||||||
|
self.setup_register(self.rd, argsdict[0])
|
||||||
|
self.setup_register(self.rn, argsdict[1])
|
||||||
|
self.setup_immediat(self.imm12, argsdict[2])
|
||||||
|
|
||||||
|
shift = Shift.parse(argsdict.get(3))
|
||||||
|
if not shift:
|
||||||
|
return
|
||||||
|
|
||||||
|
if shift not in [("LSL", 0), ("LSL", 12)]:
|
||||||
|
raise ValueError("Invalid shift for instruction: {0}".format(shift))
|
||||||
|
if shift == ("LSL", 12):
|
||||||
|
self.sh[:] = bytearray((1,))
|
||||||
|
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def accept_arg(cls, argsdict):
|
||||||
|
return (cls.is_register(argsdict[0], accept_sp=True) and
|
||||||
|
cls.is_register(argsdict[1], accept_sp=True) and
|
||||||
|
cls.is_imm(argsdict[2]) and
|
||||||
|
cls.is_shift(argsdict.get(3)))
|
||||||
|
|
||||||
|
|
||||||
|
# C4.1.93.6 Logical (immediate)
|
||||||
|
# Wtf : https://kddnewton.com/2022/08/11/aarch64-bitmask-immediates.html
|
||||||
|
|
||||||
|
class DataProcessingLogicalImmediate(DataProcessingImmediate):
|
||||||
|
def __init__(self, argsdict):
|
||||||
|
super(DataProcessingLogicalImmediate, self).__init__()
|
||||||
|
self.sf = self.bits[31:32]
|
||||||
|
self.opc = self.bits[29:31]
|
||||||
|
self.bits[23:29] = bytearray(reversed((1, 0, 0, 1, 0, 0)))
|
||||||
|
self.N = self.bits[22:23]
|
||||||
|
self.immr = self.bits[16:22]
|
||||||
|
self.imms = self.bits[10:16]
|
||||||
|
self.rn = self.bits[5:10]
|
||||||
|
self.rd = self.bits[0:5]
|
||||||
|
|
||||||
|
self.setup_fixed_values()
|
||||||
|
# Change instruction based of parameter
|
||||||
|
self.setup_register(self.rd, argsdict[0])
|
||||||
|
self.setup_register(self.rn, argsdict[1])
|
||||||
|
self.setup_bitmask_imm(self.imm12, argsdict[2])
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def accept_arg(cls, argsdict):
|
||||||
|
return (cls.is_register(argsdict[0], accept_sp=True) and
|
||||||
|
cls.is_register(argsdict[1], accept_sp=True) and
|
||||||
|
cls.is_bitmask_imm(argsdict[2]))
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def is_bitmask_imm(*args, **kwargs):
|
||||||
|
raise NotImplementedError("is_bitmask_imm")
|
||||||
|
|
||||||
|
def setup_bitmask_imm(*args, **kwargs):
|
||||||
|
raise NotImplementedError("setup_bitmask_imm")
|
||||||
|
|
||||||
|
|
||||||
|
class MovWideImmediat(DataProcessingImmediate):
|
||||||
|
def __init__(self, argsdict):
|
||||||
|
super(MovWideImmediat, self).__init__()
|
||||||
|
self.sf = self.bits[31:32]
|
||||||
|
self.opc = self.bits[29:31]
|
||||||
|
self.bits[23:29] = bytearray(reversed((1, 0, 0, 1, 0, 1)))
|
||||||
|
self.hw = self.bits[21:23]
|
||||||
|
self.imm16 = self.bits[5:21]
|
||||||
|
self.rd = self.bits[0:5]
|
||||||
|
|
||||||
|
|
||||||
|
self.setup_fixed_values()
|
||||||
|
# Change instruction based of parameter
|
||||||
|
self.setup_register(self.rd, argsdict[0])
|
||||||
|
self.setup_immediat(self.imm16, argsdict[1])
|
||||||
|
|
||||||
|
shift = Shift.parse(argsdict.get(2))
|
||||||
|
if not shift:
|
||||||
|
return
|
||||||
|
if shift.type != "LSL":
|
||||||
|
raise ValueError("Invalid shift type for {0} : {1}".format(type(self).__name__, shift.value))
|
||||||
|
if shift.value not in (0, 16 ,32, 48):
|
||||||
|
raise ValueError("Invalid shift value for {0} : {1}".format(type(self).__name__, shift.value))
|
||||||
|
if self.bitness == 32 and shift.value > 16:
|
||||||
|
raise ValueError("Invalid shift value for 32bits encoding of {0} : {1}".format(type(self).__name__, shift.value))
|
||||||
|
|
||||||
|
self.setup_immediat(self.hw, shift.value // 16)
|
||||||
|
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def accept_arg(cls, argsdict):
|
||||||
|
return (cls.is_register(argsdict[0], accept_sp=True) and
|
||||||
|
cls.is_imm(argsdict[1]) and
|
||||||
|
cls.is_shift(argsdict.get(2)))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### C4.1.94.13 Unconditional branch (register)
|
||||||
|
|
||||||
|
class UnconditionalBranchRegister(InstructionEncoding):
|
||||||
|
BITNESS = 64
|
||||||
|
|
||||||
|
def __init__(self, argsdict):
|
||||||
|
super(UnconditionalBranchRegister, self).__init__()
|
||||||
|
# Allow to fill it in the same order as the ARM manual
|
||||||
|
self.bits[25:32] = bytearray(reversed((1, 1, 0, 1, 0, 1, 1)))
|
||||||
|
self.opc = self.bits[21:25]
|
||||||
|
self.op2 = self.bits[16:21]
|
||||||
|
self.op3 = self.bits[10:16]
|
||||||
|
self.rn = self.bits[5:10]
|
||||||
|
self.op4 = self.bits[0:5]
|
||||||
|
|
||||||
|
self.setup_fixed_values()
|
||||||
|
self.setup_register(self.rn, argsdict[0])
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def accept_arg(cls, argsdict):
|
||||||
|
return (cls.is_register(argsdict[0], accept_sp=True))
|
||||||
|
|
||||||
|
|
||||||
|
class RetEncoding(UnconditionalBranchRegister.gen(opc=0b10, op2=0b11111, op3=0, op4=0)):
|
||||||
|
# Ret can accept no register and default to X30
|
||||||
|
def __init__(self, argsdict):
|
||||||
|
if not argsdict:
|
||||||
|
argsdict[0] = "X30"
|
||||||
|
super(RetEncoding, self).__init__(argsdict)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def accept_arg(cls, argsdict):
|
||||||
|
return not argsdict or cls.is_register(argsdict[0], accept_sp=True)
|
||||||
|
|
||||||
|
|
||||||
|
# C4.1.95 Data Processing – Register
|
||||||
|
|
||||||
|
class DataProcessingRegister(InstructionEncoding):
|
||||||
|
def __init__(self):
|
||||||
|
super(DataProcessingRegister, self).__init__()
|
||||||
|
self.op0 = self.bits[30:31]
|
||||||
|
self.op1 = self.bits[28:29]
|
||||||
|
self.bits[25:28] = bytearray(reversed((1, 0, 1)))
|
||||||
|
self.op2 = self.bits[21:25]
|
||||||
|
self.op3 = self.bits[10:16]
|
||||||
|
|
||||||
|
class DataProcessingLogicalShiftedRegister(DataProcessingRegister):
|
||||||
|
def __init__(self, argsdict):
|
||||||
|
super(DataProcessingLogicalShiftedRegister, self).__init__()
|
||||||
|
self.sf = self.bits[31:32]
|
||||||
|
self.opc = self.bits[29:31]
|
||||||
|
self.bits[24:29] = bytearray(reversed((0, 1, 0, 1, 0)))
|
||||||
|
self.shift = self.bits[22:24]
|
||||||
|
self.N = self.bits[21:22]
|
||||||
|
self.rm = self.bits[16:21]
|
||||||
|
self.imm6 = self.bits[10:16]
|
||||||
|
self.rn = self.bits[5:10]
|
||||||
|
self.rd = self.bits[0:5]
|
||||||
|
|
||||||
|
self.setup_fixed_values()
|
||||||
|
# Change instruction based of parameter
|
||||||
|
self.setup_register(self.rd, argsdict[0])
|
||||||
|
self.setup_register(self.rn, argsdict[1])
|
||||||
|
self.setup_register(self.rm, argsdict[2])
|
||||||
|
|
||||||
|
shift = Shift.parse(argsdict.get(3))
|
||||||
|
if not shift:
|
||||||
|
return
|
||||||
|
# Is this mapping generic ? Store ir somewhere ?
|
||||||
|
# Is the shift size logic repeatable and factorisable ?
|
||||||
|
if self.bitness == 32 and shift.value > 31:
|
||||||
|
raise ValueError("Invalid shift value for 32bits encoding of {0} : {1}".format(type(self).__name__, shift.value))
|
||||||
|
|
||||||
|
SHIFT_MAPPING = {"LSL": 0b00, "LSR": 0b01, "ASR": 0b10, "ROR": 0b11}
|
||||||
|
self.setup_immediat(self.shift, SHIFT_MAPPING[shift.type])
|
||||||
|
self.setup_immediat(self.imm6, shift.value)
|
||||||
|
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def accept_arg(cls, argsdict):
|
||||||
|
return (cls.is_register(argsdict[0]) and
|
||||||
|
cls.is_register(argsdict[1]) and
|
||||||
|
cls.is_register(argsdict[2]) and
|
||||||
|
cls.is_shift(argsdict.get(3)))
|
||||||
|
|
||||||
|
# An instruction is a Name that can have multiple encoding
|
||||||
|
# It's the class we instanciate to assemble instructions
|
||||||
|
# C6.2.270 ORR (immediate)
|
||||||
|
# C6.2.271 ORR (shifted register)
|
||||||
|
|
||||||
|
# there also seem to exist "alias instructions" like "mov"
|
||||||
|
# That just map to others instruction when specific condition are met on the params
|
||||||
|
|
||||||
|
|
||||||
|
class Instruction(object):
|
||||||
|
encoding = []
|
||||||
|
|
||||||
|
def __init__(self, *args):
|
||||||
|
argsdict = dict(enumerate(args)) # Like a list but allow arg.get(4)
|
||||||
|
for i, encodcls in enumerate(self.encoding):
|
||||||
|
# Late rewrite of GeneratedEncodingCls classname for better message error
|
||||||
|
if encodcls.__name__ == "GeneratedEncodingCls":
|
||||||
|
encodcls.__name__ = "{0}Encoding{1}".format(type(self).__name__, i)
|
||||||
|
|
||||||
|
|
||||||
|
if encodcls.accept_arg(argsdict):
|
||||||
|
self.encoded = encodcls(argsdict)
|
||||||
|
return
|
||||||
|
raise ValueError("Cannot encode <{0} {1}>:(".format(type(self).__name__, args))
|
||||||
|
|
||||||
|
def get_code(self):
|
||||||
|
intlist = list(self.encoded.bits)
|
||||||
|
if not is_py3:
|
||||||
|
intlist = [ord(x) for x in intlist]
|
||||||
|
# Our encoding to real little-endian
|
||||||
|
encoding_getter = operator.itemgetter(7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8, 23, 22, 21, 20, 19, 18, 17, 16, 31, 30, 29, 28, 27, 26, 25, 24)
|
||||||
|
dword = 0
|
||||||
|
for bit in encoding_getter(intlist):
|
||||||
|
assert bit in (0, 1), "Unexpected bite value in encoding of {0} : {1} in {2}".format(type(self).__name__, bit, intlist)
|
||||||
|
dword = (dword << 1) | bit
|
||||||
|
return struct.pack(">I", dword) # We already have handled endianess
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Fix endianned
|
||||||
|
|
||||||
|
|
||||||
|
class Add(Instruction):
|
||||||
|
encoding = [AddSubtractImmediate.gen(op=0, S=0)]
|
||||||
|
|
||||||
|
class Subs(Instruction):
|
||||||
|
encoding = [AddSubtractImmediate.gen(op=1, S=1)]
|
||||||
|
|
||||||
|
### C6.2.307 RET (page 2203) (11010110010111110000000000000000)
|
||||||
|
|
||||||
|
class Ret(Instruction):
|
||||||
|
encoding = [RetEncoding]
|
||||||
|
|
||||||
|
# C6.2.254
|
||||||
|
|
||||||
|
class Movz(Instruction):
|
||||||
|
encoding = [MovWideImmediat.gen(opc=0b10)]
|
||||||
|
|
||||||
|
class Movk(Instruction):
|
||||||
|
encoding = [MovWideImmediat.gen(opc=0b11)]
|
||||||
|
|
||||||
|
# The encoding for "mov reg, reg" :D
|
||||||
|
# C6.2.271
|
||||||
|
# Todo: Instruction like "mov" that dispatch to other instruction encoding based on more precise condition on param ?
|
||||||
|
class Orr(Instruction):
|
||||||
|
encoding = [DataProcessingLogicalShiftedRegister.gen(opc=0b01)]
|
||||||
|
|
||||||
|
|
||||||
|
# Meta Instruction that can dispatch to others Instruction/Encoding based on special case
|
||||||
|
# Ex: "mov reg1, re2" -> "orr reg1, xzr, reg2"
|
||||||
|
|
||||||
|
class Mov(Instruction): # VirtualInstruction ?
|
||||||
|
def __new__(self, *args):
|
||||||
|
argsdict = dict(enumerate(args)) # Like a list but allow arg.get(4)
|
||||||
|
if (set(argsdict) == {0, 1} and # Only 2 args
|
||||||
|
InstructionEncoding.is_register(argsdict[0]) and
|
||||||
|
InstructionEncoding.is_register(argsdict[1])):
|
||||||
|
return Orr(argsdict[0], ZERO, argsdict[1])
|
||||||
|
|
||||||
|
raise ValueError("Cannot encode <{0} {1}>:(".format(type(self).__name__, args))
|
||||||
|
|
||||||
|
|
||||||
|
class MultipleInstr(object):
|
||||||
|
INSTRUCTION_SIZE = 4
|
||||||
|
|
||||||
|
def __init__(self, init_instrs=()):
|
||||||
|
self.instrs = {}
|
||||||
|
self.labels = {}
|
||||||
|
self.expected_labels = {}
|
||||||
|
# List of all labeled jump already resolved
|
||||||
|
# Will be used for 'relocation'
|
||||||
|
self.computed_jump = []
|
||||||
|
self.size = 0
|
||||||
|
for i in init_instrs:
|
||||||
|
self += i
|
||||||
|
|
||||||
|
def get_code(self):
|
||||||
|
if self.expected_labels:
|
||||||
|
raise ValueError("Unresolved labels: {0}".format(self.expected_labels.keys()))
|
||||||
|
return b"".join([x[1].get_code() for x in sorted(self.instrs.items())])
|
||||||
|
|
||||||
|
def add_instruction(self, instruction):
|
||||||
|
# if isinstance(instruction, Label):
|
||||||
|
# return self.add_label(instruction)
|
||||||
|
# # Change DelayedJump to LabeledJump ?
|
||||||
|
# if isinstance(instruction, DelayedJump):
|
||||||
|
# return self.add_delayed_jump(instruction)
|
||||||
|
if isinstance(instruction, Instruction):
|
||||||
|
self.instrs[self.size] = instruction
|
||||||
|
self.size += self.INSTRUCTION_SIZE
|
||||||
|
return
|
||||||
|
raise ValueError("Don't know what to do with {0} of type {1}".format(instruction, type(instruction)))
|
||||||
|
|
||||||
|
def add_label(self, label):
|
||||||
|
if label.name not in self.expected_labels:
|
||||||
|
# Label that have no jump before definition
|
||||||
|
# Just registed the address of the label
|
||||||
|
self.labels[label.name] = self.size
|
||||||
|
return
|
||||||
|
# Label with jmp before definition
|
||||||
|
# Lot of stuff todo:
|
||||||
|
# Find all delayed jump that refer to this jump
|
||||||
|
# Replace them with real jump
|
||||||
|
# If size of jump < JUMP_SIZE: relocate everything we can
|
||||||
|
# Update expected_labels
|
||||||
|
for jump_to_label in self.expected_labels[label.name]:
|
||||||
|
if jump_to_label.offset in self.instrs:
|
||||||
|
raise ValueError("WTF REPLACE EXISTING INSTR...")
|
||||||
|
distance = self.size - jump_to_label.offset
|
||||||
|
real_jump = jump_to_label.type(distance)
|
||||||
|
self.instrs[jump_to_label.offset] = real_jump
|
||||||
|
self.computed_jump.append((jump_to_label.offset, self.size))
|
||||||
|
for i in range(self.JUMP_SIZE - len(real_jump.get_code())):
|
||||||
|
self.instrs[jump_to_label.offset + len(real_jump.get_code()) + i] = _NopArtifact()
|
||||||
|
del self.expected_labels[label.name]
|
||||||
|
self.labels[label.name] = self.size
|
||||||
|
if not self.expected_labels:
|
||||||
|
# No more un-resolved label (for now): time to reduce the shellcode
|
||||||
|
self._reduce_shellcode()
|
||||||
|
|
||||||
|
def add_delayed_jump(self, jump):
|
||||||
|
dst = jump.label
|
||||||
|
if dst in self.labels:
|
||||||
|
# Jump to already defined labels
|
||||||
|
# Nothing fancy: get offset of label and jump to it !
|
||||||
|
distance = self.size - self.labels[dst]
|
||||||
|
jump_instruction = jump.type(-distance)
|
||||||
|
self.computed_jump.append((self.size, self.labels[dst]))
|
||||||
|
return self.add_instruction(jump_instruction)
|
||||||
|
# Jump to undefined label
|
||||||
|
# Add label to expected ones
|
||||||
|
# Add jump info -> offset of jump | type
|
||||||
|
# Reserve space for call !
|
||||||
|
jump.offset = self.size
|
||||||
|
self.expected_labels.setdefault(dst, []).append(jump)
|
||||||
|
self.size += self.JUMP_SIZE
|
||||||
|
return
|
||||||
|
|
||||||
|
def merge_shellcode(self, other):
|
||||||
|
shared_labels = set(self.labels) & set(other.labels)
|
||||||
|
if shared_labels:
|
||||||
|
raise ValueError("Cannot merge shellcode: shared labels {0}".format(shared_labels))
|
||||||
|
for offset, instr in sorted(other.instrs.items()):
|
||||||
|
for label_name in [name for name, label_offset in other.labels.items() if label_offset == offset]:
|
||||||
|
self.add_instruction(Label(label_name))
|
||||||
|
self.add_instruction(instr)
|
||||||
|
|
||||||
|
def __iadd__(self, other):
|
||||||
|
if isinstance(other, MultipleInstr):
|
||||||
|
self.merge_shellcode(other)
|
||||||
|
elif isinstance(other, basestring):
|
||||||
|
self.assemble(other)
|
||||||
|
else:
|
||||||
|
self.add_instruction(other)
|
||||||
|
return self
|
||||||
|
|
||||||
|
def assemble(self, code):
|
||||||
|
for instr in assemble_instructions_generator(code):
|
||||||
|
self.add_instruction(instr)
|
||||||
|
|
||||||
|
|
||||||
|
def split_in_instruction(str):
|
||||||
|
for line in str.split("\n"):
|
||||||
|
if not line:
|
||||||
|
continue
|
||||||
|
for instr in line.split(";"):
|
||||||
|
if not instr:
|
||||||
|
continue
|
||||||
|
yield instr.strip()
|
||||||
|
|
||||||
|
def assemble_instructions_generator(str):
|
||||||
|
for instr in split_in_instruction(str):
|
||||||
|
data = instr.split(" ", 1)
|
||||||
|
mnemo, args_raw = data[0], data[1:]
|
||||||
|
try:
|
||||||
|
instr_object = globals()[mnemo.capitalize()]
|
||||||
|
except:
|
||||||
|
raise ValueError("Unknow mnemonic <{0}>".format(mnemo))
|
||||||
|
|
||||||
|
# if issubclass(instr_object, Raw):
|
||||||
|
# # Raw should received the raw buffer as it expect encoded hex
|
||||||
|
# # The transformation may transform 'raw 9090' (nopnop) as 0n9090
|
||||||
|
# # If other fake-instr need this : make a class attribute
|
||||||
|
# yield instr_object(*args_raw)
|
||||||
|
# continue
|
||||||
|
|
||||||
|
args = []
|
||||||
|
if args_raw:
|
||||||
|
for arg in args_raw[0].split(","):
|
||||||
|
arg = arg.strip()
|
||||||
|
try:
|
||||||
|
arg = int(arg, 0)
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
args.append(arg)
|
||||||
|
yield instr_object(*args)
|
||||||
|
|
||||||
|
def assemble(str):
|
||||||
|
"""Play test"""
|
||||||
|
shellcode = MultipleInstr()
|
||||||
|
shellcode += str
|
||||||
|
return shellcode.get_code()
|
||||||
+18
-4
@@ -3,6 +3,7 @@ import windows
|
|||||||
import windows.hooks as hooks
|
import windows.hooks as hooks
|
||||||
import windows.utils as utils
|
import windows.utils as utils
|
||||||
|
|
||||||
|
import windows.generated_def as gdef
|
||||||
from windows.generated_def.winstructs import *
|
from windows.generated_def.winstructs import *
|
||||||
from windows.utils import transform_ctypes_fields
|
from windows.utils import transform_ctypes_fields
|
||||||
import windows.remotectypes as rctypes
|
import windows.remotectypes as rctypes
|
||||||
@@ -38,9 +39,9 @@ def get_pe_bitness(baseaddr, target):
|
|||||||
# We can force bitness as the field we access are bitness-independant
|
# We can force bitness as the field we access are bitness-independant
|
||||||
pe = GetPEFile(baseaddr, target, force_bitness=32)
|
pe = GetPEFile(baseaddr, target, force_bitness=32)
|
||||||
machine = pe.get_NT_HEADER().FileHeader.Machine
|
machine = pe.get_NT_HEADER().FileHeader.Machine
|
||||||
if machine == 0x14c:
|
if machine == gdef.IMAGE_FILE_MACHINE_I386:
|
||||||
return 32
|
return 32
|
||||||
elif machine == 0x8664:
|
elif machine in (gdef.IMAGE_FILE_MACHINE_AMD64, gdef.IMAGE_FILE_MACHINE_ARM64):
|
||||||
return 64
|
return 64
|
||||||
else:
|
else:
|
||||||
raise ValueError("Unknow PE target machine <0x{0:x}>".format(machine))
|
raise ValueError("Unknow PE target machine <0x{0:x}>".format(machine))
|
||||||
@@ -108,7 +109,7 @@ class PESection(IMAGE_SECTION_HEADER):
|
|||||||
if self.target is None:
|
if self.target is None:
|
||||||
name = get_string(self.target, ctypes.addressof(self.Name))[:8]
|
name = get_string(self.target, ctypes.addressof(self.Name))[:8]
|
||||||
else:
|
else:
|
||||||
name = get_string(self.target, self._base_addr)[:8]
|
name = self.target.read_memory(self._base_addr, 8).split(b"\x00", 1)[0].decode("ascii")
|
||||||
# Decode as UTF-8 as the MS doc say ?
|
# Decode as UTF-8 as the MS doc say ?
|
||||||
return name
|
return name
|
||||||
|
|
||||||
@@ -450,4 +451,17 @@ class PEFile(object):
|
|||||||
iat_entry.name = str(name) if name else ""
|
iat_entry.name = str(name) if name else ""
|
||||||
name = get_string(self.target, self.baseaddr + import_descriptor.Name)
|
name = get_string(self.target, self.baseaddr + import_descriptor.Name)
|
||||||
res.setdefault(name.lower(), []).extend(IAT)
|
res.setdefault(name.lower(), []).extend(IAT)
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
@utils.fixedpropety
|
||||||
|
def binid(self):
|
||||||
|
"""Return the hex-string {TimeStamp}{SizeOfCode} used by PDB to identify a PE.
|
||||||
|
|
||||||
|
I do not know the official name of this value...
|
||||||
|
|
||||||
|
:type: :class:`str`
|
||||||
|
"""
|
||||||
|
nth = self.get_NT_HEADER()
|
||||||
|
timestamp = nth.FileHeader.TimeDateStamp
|
||||||
|
image_size = nth.OptionalHeader.SizeOfImage
|
||||||
|
return "{timestamp:08x}{image_size:x}".format(timestamp=timestamp, image_size=image_size)
|
||||||
@@ -62,10 +62,14 @@ def stubborn_create_instance(clsid, iid):
|
|||||||
# resolver_info.OxidInfo.containerVersion.version is part of OxidInfo.ipidRemUnknown on PPRIV_RESOLVER_INFO_LEGACY
|
# resolver_info.OxidInfo.containerVersion.version is part of OxidInfo.ipidRemUnknown on PPRIV_RESOLVER_INFO_LEGACY
|
||||||
# And this part of ipidRemUnknown is a PID
|
# And this part of ipidRemUnknown is a PID
|
||||||
# So a good value to check for > 3 :)
|
# So a good value to check for > 3 :)
|
||||||
|
# On 2019 IT IS NOT :( as it's its own struct. So I will hardcod this one.
|
||||||
# Bad alignemetn of containerVersion -> its an older version
|
# Bad alignemetn of containerVersion -> its an older version
|
||||||
if resolver_info.OxidInfo.containerVersion.version > 3:
|
dcomversionstruct = resolver_info.OxidInfo.dcomVersion
|
||||||
dcomversionstruct = resolver_info.OxidInfo.dcomVersion
|
if windows.system.build_number == 17763:
|
||||||
|
resolver_info = ctypes.cast(rpiv_infoptr, gdef.PPRIV_RESOLVER_INFO_17763)[0]
|
||||||
|
elif resolver_info.OxidInfo.containerVersion.version > 3:
|
||||||
# If 5,7 -> good alignement of dcomversion so we know its PRIV_RESOLVER_INFO_17763
|
# If 5,7 -> good alignement of dcomversion so we know its PRIV_RESOLVER_INFO_17763
|
||||||
|
# Should never happen as its now covered by the `windows.system.build_number == 17763` check
|
||||||
dcomversion = (dcomversionstruct.MajorVersion, dcomversionstruct.MinorVersion)
|
dcomversion = (dcomversionstruct.MajorVersion, dcomversionstruct.MinorVersion)
|
||||||
if dcomversion == (5, 7):
|
if dcomversion == (5, 7):
|
||||||
resolver_info = ctypes.cast(rpiv_infoptr, gdef.PPRIV_RESOLVER_INFO_17763)[0]
|
resolver_info = ctypes.cast(rpiv_infoptr, gdef.PPRIV_RESOLVER_INFO_17763)[0]
|
||||||
|
|||||||
@@ -169,7 +169,9 @@ def get_current_process_syswow_peb():
|
|||||||
|
|
||||||
class CurrentProcessReadSyswow(process.Process):
|
class CurrentProcessReadSyswow(process.Process):
|
||||||
bitness = 64
|
bitness = 64
|
||||||
|
|
||||||
def _get_handle(self):
|
def _get_handle(self):
|
||||||
|
# GetCurrentProcess() is not accepted for NtWow64ReadVirtualMemory64 :(
|
||||||
return winproxy.OpenProcess(dwProcessId=windows.current_process.pid)
|
return winproxy.OpenProcess(dwProcessId=windows.current_process.pid)
|
||||||
|
|
||||||
def read_memory(self, addr, size):
|
def read_memory(self, addr, size):
|
||||||
|
|||||||
+45
-17
@@ -36,19 +36,6 @@ def get_remote_func_addr(target, dll_name, func_name):
|
|||||||
return mod.pe.exports[func_name]
|
return mod.pe.exports[func_name]
|
||||||
|
|
||||||
|
|
||||||
def is_wow_64(hProcess):
|
|
||||||
try:
|
|
||||||
fnIsWow64Process = get_func_addr("kernel32.dll", "IsWow64Process")
|
|
||||||
except winproxy.WinproxyError:
|
|
||||||
return False
|
|
||||||
IsWow64Process = ctypes.WINFUNCTYPE(BOOL, HANDLE, ctypes.POINTER(BOOL))(fnIsWow64Process)
|
|
||||||
Wow64Process = BOOL()
|
|
||||||
res = IsWow64Process(hProcess, ctypes.byref(Wow64Process))
|
|
||||||
if res:
|
|
||||||
return bool(Wow64Process)
|
|
||||||
raise ctypes.WinError()
|
|
||||||
|
|
||||||
|
|
||||||
def create_file_from_handle(handle, mode="r"):
|
def create_file_from_handle(handle, mode="r"):
|
||||||
"""Return a Python :class:`file` around a ``Windows`` HANDLE"""
|
"""Return a Python :class:`file` around a ``Windows`` HANDLE"""
|
||||||
flags = os.O_BINARY if "b" in mode else os.O_TEXT
|
flags = os.O_BINARY if "b" in mode else os.O_TEXT
|
||||||
@@ -86,14 +73,35 @@ def create_console():
|
|||||||
sys.stderr = console_stderr
|
sys.stderr = console_stderr
|
||||||
|
|
||||||
|
|
||||||
def create_process(path, args=None, dwCreationFlags=0, show_windows=True):
|
def create_process(path, args=None, dwCreationFlags=0, show_windows=True, machine=None):
|
||||||
"""A convenient wrapper arround :func:`windows.winproxy.CreateProcessW`"""
|
"""A convenient wrapper arround :func:`windows.winproxy.CreateProcessW`
|
||||||
|
..note:
|
||||||
|
The machine param only works starting at vista and should be used on arm64 computer
|
||||||
|
"""
|
||||||
proc_info = PROCESS_INFORMATION()
|
proc_info = PROCESS_INFORMATION()
|
||||||
|
StartupInfo = None
|
||||||
lpStartupInfo = None
|
lpStartupInfo = None
|
||||||
|
|
||||||
|
if machine is not None:
|
||||||
|
buffer = ctypes.create_string_buffer(0x100)
|
||||||
|
size = gdef.DWORD64(len(buffer))
|
||||||
|
machine = gdef.WORD(machine)
|
||||||
|
windows.winproxy.InitializeProcThreadAttributeList(buffer, 1, 0, size)
|
||||||
|
windows.winproxy.UpdateProcThreadAttribute(buffer, 0, gdef.PROC_THREAD_ATTRIBUTE_MACHINE_TYPE, ctypes.addressof(machine), ctypes.sizeof(machine), None, None)
|
||||||
|
|
||||||
|
startup_infoex = gdef.STARTUPINFOEXW()
|
||||||
|
startup_infoex.StartupInfo.cb = ctypes.sizeof(gdef.STARTUPINFOEXW)
|
||||||
|
startup_infoex.lpAttributeList = ctypes.cast(buffer, gdef.PVOID)
|
||||||
|
StartupInfo = startup_infoex.StartupInfo
|
||||||
|
|
||||||
|
dwCreationFlags |= gdef.EXTENDED_STARTUPINFO_PRESENT
|
||||||
|
|
||||||
if show_windows:
|
if show_windows:
|
||||||
StartupInfo = STARTUPINFOW()
|
if StartupInfo is None:
|
||||||
StartupInfo.cb = ctypes.sizeof(StartupInfo)
|
StartupInfo = STARTUPINFOW()
|
||||||
|
StartupInfo.cb = ctypes.sizeof(StartupInfo)
|
||||||
StartupInfo.dwFlags = 0
|
StartupInfo.dwFlags = 0
|
||||||
|
if StartupInfo:
|
||||||
lpStartupInfo = ctypes.byref(StartupInfo)
|
lpStartupInfo = ctypes.byref(StartupInfo)
|
||||||
lpCommandLine = None
|
lpCommandLine = None
|
||||||
if isinstance(path, bytes):
|
if isinstance(path, bytes):
|
||||||
@@ -110,6 +118,8 @@ def create_process(path, args=None, dwCreationFlags=0, show_windows=True):
|
|||||||
dbgprint("CreateProcessW new thread handle {:#x}".format(proc_info.hThread), "HANDLE")
|
dbgprint("CreateProcessW new thread handle {:#x}".format(proc_info.hThread), "HANDLE")
|
||||||
dbgprint("Automatic close of thread handle {:#x}".format(proc_info.hThread), "HANDLE")
|
dbgprint("Automatic close of thread handle {:#x}".format(proc_info.hThread), "HANDLE")
|
||||||
windows.winproxy.CloseHandle(proc_info.hThread) # Give access to a WinThread in addition of the WinProcess ?
|
windows.winproxy.CloseHandle(proc_info.hThread) # Give access to a WinThread in addition of the WinProcess ?
|
||||||
|
if machine:
|
||||||
|
windows.winproxy.DeleteProcThreadAttributeList(buffer)
|
||||||
return windows.winobject.process.WinProcess(pid=proc_info.dwProcessId, handle=proc_info.hProcess)
|
return windows.winobject.process.WinProcess(pid=proc_info.dwProcessId, handle=proc_info.hProcess)
|
||||||
|
|
||||||
|
|
||||||
@@ -300,6 +310,16 @@ def datetime_from_systemtime(systime):
|
|||||||
microsecond=systime.wMilliseconds * 1000,
|
microsecond=systime.wMilliseconds * 1000,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
IMAGE_FILE_MACHINE_TO_PROC_ARCH = {
|
||||||
|
gdef.IMAGE_FILE_MACHINE_I386: gdef.PROCESSOR_ARCHITECTURE_INTEL,
|
||||||
|
gdef.IMAGE_FILE_MACHINE_AMD64: gdef.PROCESSOR_ARCHITECTURE_AMD64,
|
||||||
|
gdef.IMAGE_FILE_MACHINE_ARM64: gdef.PROCESSOR_ARCHITECTURE_ARM64,
|
||||||
|
gdef.IMAGE_FILE_MACHINE_UNKNOWN: gdef.PROCESSOR_ARCHITECTURE_UNKNOWN
|
||||||
|
}
|
||||||
|
|
||||||
|
def image_file_machine_to_processor_architecture(image_file_machine):
|
||||||
|
return IMAGE_FILE_MACHINE_TO_PROC_ARCH[image_file_machine]
|
||||||
|
|
||||||
class FixedInteractiveConsole(code.InteractiveConsole):
|
class FixedInteractiveConsole(code.InteractiveConsole):
|
||||||
def raw_input(self, prompt=">>>"):
|
def raw_input(self, prompt=">>>"):
|
||||||
sys.stdout.write(prompt)
|
sys.stdout.write(prompt)
|
||||||
@@ -557,6 +577,14 @@ def create_file(name, access=gdef.GENERIC_READ, share=gdef.FILE_SHARE_READ, secu
|
|||||||
# addr = windows.winproxy.MapViewOfFile(h, dwDesiredAccess=FILE_MAP_READ, dwNumberOfBytesToMap=1)
|
# addr = windows.winproxy.MapViewOfFile(h, dwDesiredAccess=FILE_MAP_READ, dwNumberOfBytesToMap=1)
|
||||||
# return addr
|
# return addr
|
||||||
|
|
||||||
|
def get_system_info(native=False):
|
||||||
|
res = gdef.SYSTEM_INFO()
|
||||||
|
if native:
|
||||||
|
windows.winproxy.GetNativeSystemInfo(res)
|
||||||
|
else:
|
||||||
|
windows.winproxy.GetSystemInfo(res)
|
||||||
|
return res
|
||||||
|
|
||||||
def decompress_buffer(buffer, comptype=gdef.COMPRESSION_FORMAT_LZNT1, uncompress_size=None):
|
def decompress_buffer(buffer, comptype=gdef.COMPRESSION_FORMAT_LZNT1, uncompress_size=None):
|
||||||
if uncompress_size is None:
|
if uncompress_size is None:
|
||||||
uncompress_size = len(buffer) * 10
|
uncompress_size = len(buffer) * 10
|
||||||
|
|||||||
@@ -377,6 +377,7 @@ class ImprovedEVT_VARIANT(gdef.EVT_VARIANT):
|
|||||||
gdef.EvtVarTypeUInt16 + gdef.EVT_VARIANT_TYPE_ARRAY : "UInt16Arr",
|
gdef.EvtVarTypeUInt16 + gdef.EVT_VARIANT_TYPE_ARRAY : "UInt16Arr",
|
||||||
gdef.EvtVarTypeUInt32 + gdef.EVT_VARIANT_TYPE_ARRAY : "UInt32Arr",
|
gdef.EvtVarTypeUInt32 + gdef.EVT_VARIANT_TYPE_ARRAY : "UInt32Arr",
|
||||||
gdef.EvtVarTypeUInt64 + gdef.EVT_VARIANT_TYPE_ARRAY : "UInt64Arr",
|
gdef.EvtVarTypeUInt64 + gdef.EVT_VARIANT_TYPE_ARRAY : "UInt64Arr",
|
||||||
|
gdef.EvtVarTypeHexInt64 + gdef.EVT_VARIANT_TYPE_ARRAY : "UInt64Arr",
|
||||||
}
|
}
|
||||||
NoneValue = None
|
NoneValue = None
|
||||||
|
|
||||||
|
|||||||
@@ -144,6 +144,8 @@ def enumerate_handles():
|
|||||||
|
|
||||||
|
|
||||||
def enumerate_handles_syswow64():
|
def enumerate_handles_syswow64():
|
||||||
|
if windows.current_process._is_x86_on_arm64:
|
||||||
|
raise NotImplementedError("Crossing heaven gate x86 -> arm64 not implemented")
|
||||||
size_needed = gdef.ULONG()
|
size_needed = gdef.ULONG()
|
||||||
# Should at least be sizeof(gdef.SYSTEM_HANDLE_INFORMATION)
|
# Should at least be sizeof(gdef.SYSTEM_HANDLE_INFORMATION)
|
||||||
tmp_buffer = windows.utils.BUFFER(gdef.SYSTEM_HANDLE_INFORMATION64)()
|
tmp_buffer = windows.utils.BUFFER(gdef.SYSTEM_HANDLE_INFORMATION64)()
|
||||||
|
|||||||
+105
-25
@@ -12,6 +12,7 @@ from collections import namedtuple
|
|||||||
import windows
|
import windows
|
||||||
import windows.native_exec.simple_x86 as x86
|
import windows.native_exec.simple_x86 as x86
|
||||||
import windows.native_exec.simple_x64 as x64
|
import windows.native_exec.simple_x64 as x64
|
||||||
|
import windows.native_exec.simple_arm64 as arm64
|
||||||
import windows.remotectypes as rctypes
|
import windows.remotectypes as rctypes
|
||||||
import windows.generated_def as gdef
|
import windows.generated_def as gdef
|
||||||
|
|
||||||
@@ -70,8 +71,24 @@ class Process(utils.AutoHandle):
|
|||||||
|
|
||||||
:type: :class:`bool`
|
:type: :class:`bool`
|
||||||
"""
|
"""
|
||||||
# return utils.is_wow_64(self.handle)
|
if not windows.winproxy.is_implemented(windows.winproxy.IsWow64Process):
|
||||||
return utils.is_wow_64(self.limited_handle)
|
return False
|
||||||
|
Wow64Process = gdef.BOOL()
|
||||||
|
windows.winproxy.IsWow64Process(self.handle, Wow64Process)
|
||||||
|
return bool(Wow64Process)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@utils.fixedproperty
|
||||||
|
def is_wow_64_2(self):
|
||||||
|
if not windows.winproxy.is_implemented(windows.winproxy.IsWow64Process2):
|
||||||
|
return None, None
|
||||||
|
processMachine = gdef.USHORT()
|
||||||
|
nativeMachine = gdef.USHORT()
|
||||||
|
windows.winproxy.IsWow64Process2(self.handle, processMachine, nativeMachine)
|
||||||
|
return (gdef.IMAGE_FILE_MACHINE_MAPPER[processMachine.value],
|
||||||
|
gdef.IMAGE_FILE_MACHINE_MAPPER[nativeMachine.value])
|
||||||
|
|
||||||
|
|
||||||
@utils.fixedproperty
|
@utils.fixedproperty
|
||||||
def bitness(self):
|
def bitness(self):
|
||||||
@@ -79,13 +96,52 @@ class Process(utils.AutoHandle):
|
|||||||
|
|
||||||
:returns: :class:`int` -- 32 or 64
|
:returns: :class:`int` -- 32 or 64
|
||||||
"""
|
"""
|
||||||
if windows.system.bitness == 32:
|
if windows.system.bitness == 32 or self.is_wow_64:
|
||||||
return 32
|
|
||||||
if self.is_wow_64:
|
|
||||||
return 32
|
return 32
|
||||||
return 64
|
return 64
|
||||||
|
|
||||||
@utils.fixedproperty
|
@utils.fixedproperty
|
||||||
|
def architecture(self):
|
||||||
|
# Syswow2 will exactly tell us the architecture
|
||||||
|
if windows.winproxy.is_implemented(windows.winproxy.IsWow64Process2):
|
||||||
|
process_machine, native_machine = self.is_wow_64_2
|
||||||
|
if process_machine != gdef.IMAGE_FILE_MACHINE_UNKNOWN:
|
||||||
|
return process_machine
|
||||||
|
|
||||||
|
if windows.system.architecture == gdef.PROCESSOR_ARCHITECTURE_ARM64:
|
||||||
|
# May be ARM64 or AMD64 as X64TA64 is not considered WOW64
|
||||||
|
# ProcessMachineTypeInfo is from build 22000
|
||||||
|
# What if not implemented ? parse target main binary PE ?
|
||||||
|
machine_archi = gdef.PROCESS_MACHINE_INFORMATION()
|
||||||
|
windows.winproxy.GetProcessInformation(self.handle, gdef.ProcessMachineTypeInfo, ctypes.byref(machine_archi), ctypes.sizeof(machine_archi))
|
||||||
|
return gdef.IMAGE_FILE_MACHINE_MAPPER[machine_archi.ProcessMachine]
|
||||||
|
|
||||||
|
# No IsWow64Process2 -> No ARM
|
||||||
|
# So its up on x86 -> x64 based on process bitness
|
||||||
|
if self.bitness == 32:
|
||||||
|
return gdef.IMAGE_FILE_MACHINE_I386
|
||||||
|
return gdef.IMAGE_FILE_MACHINE_AMD64
|
||||||
|
|
||||||
|
@utils.fixedproperty
|
||||||
|
def _is_x86_on_arm64(self):
|
||||||
|
return (windows.system.architecture == gdef.PROCESSOR_ARCHITECTURE_ARM64 and
|
||||||
|
self.architecture == gdef.IMAGE_FILE_MACHINE_I386)
|
||||||
|
|
||||||
|
@utils.fixedproperty
|
||||||
|
def _is_x86_on_x64(self):
|
||||||
|
return (windows.system.architecture == gdef.PROCESSOR_ARCHITECTURE_AMD64 and
|
||||||
|
self.architecture == gdef.IMAGE_FILE_MACHINE_I386)
|
||||||
|
|
||||||
|
@utils.fixedproperty
|
||||||
|
def _is_native_architecture(self):
|
||||||
|
return ((windows.system.architecture == gdef.PROCESSOR_ARCHITECTURE_INTEL and
|
||||||
|
self.architecture == gdef.IMAGE_FILE_MACHINE_I386) or
|
||||||
|
(windows.system.architecture == gdef.PROCESSOR_ARCHITECTURE_AMD64 and
|
||||||
|
self.architecture == gdef.IMAGE_FILE_MACHINE_AMD64) or
|
||||||
|
(windows.system.architecture == gdef.PROCESSOR_ARCHITECTURE_ARM64 and
|
||||||
|
self.architecture == gdef.IMAGE_FILE_MACHINE_ARM64))
|
||||||
|
|
||||||
|
@utils.fixedpropety
|
||||||
def limited_handle(self):
|
def limited_handle(self):
|
||||||
if windows.system.version[0] <= 5:
|
if windows.system.version[0] <= 5:
|
||||||
# Windows XP | Serveur 2003
|
# Windows XP | Serveur 2003
|
||||||
@@ -110,6 +166,8 @@ class Process(utils.AutoHandle):
|
|||||||
:type: :class:`int`
|
:type: :class:`int`
|
||||||
"""
|
"""
|
||||||
if windows.current_process.bitness == 32 and self.bitness == 64:
|
if windows.current_process.bitness == 32 and self.bitness == 64:
|
||||||
|
if windows.current_process._is_x86_on_arm64:
|
||||||
|
raise NotImplementedError("Crossing heaven gate x86 -> arm64 not implemented")
|
||||||
xtype = windows.remotectypes.transform_type_to_remote64bits(PROCESS_BASIC_INFORMATION)
|
xtype = windows.remotectypes.transform_type_to_remote64bits(PROCESS_BASIC_INFORMATION)
|
||||||
# Fuck-it <3
|
# Fuck-it <3
|
||||||
data = (ctypes.c_char * ctypes.sizeof(xtype))()
|
data = (ctypes.c_char * ctypes.sizeof(xtype))()
|
||||||
@@ -180,6 +238,8 @@ class Process(utils.AutoHandle):
|
|||||||
def virtual_protect(self, addr, size, protect, old_protect=None):
|
def virtual_protect(self, addr, size, protect, old_protect=None):
|
||||||
"""Change the access right of one or more page of the process"""
|
"""Change the access right of one or more page of the process"""
|
||||||
if windows.current_process.bitness == 32 and self.bitness == 64:
|
if windows.current_process.bitness == 32 and self.bitness == 64:
|
||||||
|
if windows.current_process._is_x86_on_arm64:
|
||||||
|
raise NotImplementedError("Crossing heaven gate x86 -> arm64 not implemented")
|
||||||
if size & 0x0fff:
|
if size & 0x0fff:
|
||||||
size = ((size >> 12) + 1) << 12
|
size = ((size >> 12) + 1) << 12
|
||||||
if old_protect is None:
|
if old_protect is None:
|
||||||
@@ -210,6 +270,8 @@ class Process(utils.AutoHandle):
|
|||||||
:rtype: :class:`~windows.generated_def.winstructs.MEMORY_BASIC_INFORMATION`
|
:rtype: :class:`~windows.generated_def.winstructs.MEMORY_BASIC_INFORMATION`
|
||||||
"""
|
"""
|
||||||
if windows.current_process.bitness == 32 and self.bitness == 64:
|
if windows.current_process.bitness == 32 and self.bitness == 64:
|
||||||
|
if windows.current_process._is_x86_on_arm64:
|
||||||
|
raise NotImplementedError("Crossing heaven gate x86 -> arm64 not implemented")
|
||||||
res = MEMORY_BASIC_INFORMATION64()
|
res = MEMORY_BASIC_INFORMATION64()
|
||||||
try:
|
try:
|
||||||
v = windows.syswow64.NtQueryVirtualMemory_32_to_64(ProcessHandle=self.handle, BaseAddress=addr, MemoryInformationClass=MemoryBasicInformation, MemoryInformation=res)
|
v = windows.syswow64.NtQueryVirtualMemory_32_to_64(ProcessHandle=self.handle, BaseAddress=addr, MemoryInformationClass=MemoryBasicInformation, MemoryInformation=res)
|
||||||
@@ -290,6 +352,8 @@ class Process(utils.AutoHandle):
|
|||||||
for i, data in enumerate(info_array):
|
for i, data in enumerate(info_array):
|
||||||
info_array[i].VirtualAddress = addresses[i]
|
info_array[i].VirtualAddress = addresses[i]
|
||||||
if windows.current_process.bitness == 32 and self.bitness == 64:
|
if windows.current_process.bitness == 32 and self.bitness == 64:
|
||||||
|
if windows.current_process._is_x86_on_arm64:
|
||||||
|
raise NotImplementedError("Crossing heaven gate x86 -> arm64 not implemented")
|
||||||
windows.syswow64.NtQueryVirtualMemory_32_to_64(self.handle, 0, MemoryWorkingSetListEx, info_array)
|
windows.syswow64.NtQueryVirtualMemory_32_to_64(self.handle, 0, MemoryWorkingSetListEx, info_array)
|
||||||
else:
|
else:
|
||||||
winproxy.QueryWorkingSetEx(self.handle, ctypes.byref(info_array), ctypes.sizeof(info_array))
|
winproxy.QueryWorkingSetEx(self.handle, ctypes.byref(info_array), ctypes.sizeof(info_array))
|
||||||
@@ -520,11 +584,12 @@ class Process(utils.AutoHandle):
|
|||||||
return [h for h in windows.system.handles if h.dwProcessId == pid]
|
return [h for h in windows.system.handles if h.dwProcessId == pid]
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
super(Process, self).__del__()
|
|
||||||
# Same logic that AutoHandle.__del__ for Process.limited_handle
|
|
||||||
# Assert that Process inherit AutoHandle
|
|
||||||
# sys.path is not None -> check if python shutdown
|
# sys.path is not None -> check if python shutdown
|
||||||
if sys.path is not None and hasattr(self, "_limited_handle") and self._limited_handle:
|
if sys.path is not None and hasattr(self, "_limited_handle") and self._limited_handle:
|
||||||
|
# Same logic that AutoHandle.__del__ for Process.limited_handle
|
||||||
|
# Assert that Process inherit AutoHandle
|
||||||
|
# Call super after check as Process could be None during destruction
|
||||||
|
super(Process, self).__del__()
|
||||||
# Prevent some bug where dbgprint might be None when __del__ is called in a closing process
|
# Prevent some bug where dbgprint might be None when __del__ is called in a closing process
|
||||||
# This line is bad -> it reopens a handle closed by 'super(Process, self).__del__()' ._.
|
# This line is bad -> it reopens a handle closed by 'super(Process, self).__del__()' ._.
|
||||||
dbgprint("Closing limited handle {0} for {1}".format(hex(self._limited_handle), self), "HANDLE") if dbgprint is not None else None
|
dbgprint("Closing limited handle {0} for {1}".format(hex(self._limited_handle), self), "HANDLE") if dbgprint is not None else None
|
||||||
@@ -570,10 +635,10 @@ class Thread(utils.AutoHandle):
|
|||||||
class CurrentThread(Thread):
|
class CurrentThread(Thread):
|
||||||
"""The current thread"""
|
"""The current thread"""
|
||||||
|
|
||||||
get_teb_code_by_bitness = {
|
get_teb_code_by_architecture = {
|
||||||
32: x86.assemble("mov eax, fs:[0x18]; ret"),
|
gdef.IMAGE_FILE_MACHINE_I386: x86.assemble("mov eax, fs:[0x18]; ret"),
|
||||||
64: x64.assemble("mov rax, gs:[0x30]; ret")
|
gdef.IMAGE_FILE_MACHINE_AMD64: x64.assemble("mov rax, gs:[0x30]; ret"),
|
||||||
|
gdef.IMAGE_FILE_MACHINE_ARM64: arm64.assemble("mov x0, x18; ret")
|
||||||
}
|
}
|
||||||
|
|
||||||
@property #It's not a fixedproperty because executing thread might change
|
@property #It's not a fixedproperty because executing thread might change
|
||||||
@@ -586,7 +651,7 @@ class CurrentThread(Thread):
|
|||||||
|
|
||||||
@property #It's not a fixedproperty because executing thread might change
|
@property #It's not a fixedproperty because executing thread might change
|
||||||
def teb_base(self):
|
def teb_base(self):
|
||||||
get_teb_base_code = self.get_teb_code_by_bitness[self.owner.bitness]
|
get_teb_base_code = self.get_teb_code_by_architecture[self.owner.architecture]
|
||||||
return self.owner.execute(get_teb_base_code)
|
return self.owner.execute(get_teb_base_code)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@@ -723,6 +788,8 @@ class CurrentProcess(Process):
|
|||||||
"""
|
"""
|
||||||
if not self.is_wow_64:
|
if not self.is_wow_64:
|
||||||
raise ValueError("Not a syswow process")
|
raise ValueError("Not a syswow process")
|
||||||
|
if windows.current_process._is_x86_on_arm64:
|
||||||
|
raise NotImplementedError("Crossing heaven gate x86 -> arm64 not implemented")
|
||||||
return windows.syswow64.get_current_process_syswow_peb()
|
return windows.syswow64.get_current_process_syswow_peb()
|
||||||
|
|
||||||
# TODO: use ctypes.string_at / ctypes.wstring_at for read_string / read_wstring ?
|
# TODO: use ctypes.string_at / ctypes.wstring_at for read_string / read_wstring ?
|
||||||
@@ -849,6 +916,8 @@ class WinThread(Thread):
|
|||||||
:type: :class:`int`
|
:type: :class:`int`
|
||||||
"""
|
"""
|
||||||
if windows.current_process.bitness == 32 and self.owner.bitness == 64:
|
if windows.current_process.bitness == 32 and self.owner.bitness == 64:
|
||||||
|
if windows.current_process._is_x86_on_arm64:
|
||||||
|
raise NotImplementedError("Crossing heaven gate x86 -> arm64 not implemented")
|
||||||
res = ULONGLONG()
|
res = ULONGLONG()
|
||||||
windows.syswow64.NtQueryInformationThread_32_to_64(self.handle, ThreadQuerySetWin32StartAddress, byref(res), ctypes.sizeof(res))
|
windows.syswow64.NtQueryInformationThread_32_to_64(self.handle, ThreadQuerySetWin32StartAddress, byref(res), ctypes.sizeof(res))
|
||||||
return res.value
|
return res.value
|
||||||
@@ -868,6 +937,9 @@ class WinThread(Thread):
|
|||||||
# - Want the TEB of a 64b process
|
# - Want the TEB of a 64b process
|
||||||
# - Want the TEB64 of a Wowprocess
|
# - Want the TEB64 of a Wowprocess
|
||||||
# It's the same code for both
|
# It's the same code for both
|
||||||
|
if windows.current_process._is_x86_on_arm64:
|
||||||
|
raise NotImplementedError("Crossing heaven gate x86 -> arm64 not implemented")
|
||||||
|
|
||||||
if windows.current_process.is_wow_64:
|
if windows.current_process.is_wow_64:
|
||||||
restype = rctypes.transform_type_to_remote64bits(THREAD_BASIC_INFORMATION)
|
restype = rctypes.transform_type_to_remote64bits(THREAD_BASIC_INFORMATION)
|
||||||
ressize = (ctypes.sizeof(restype))
|
ressize = (ctypes.sizeof(restype))
|
||||||
@@ -972,8 +1044,6 @@ class WinThread(Thread):
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _get_thread_id_manual(handle):
|
def _get_thread_id_manual(handle):
|
||||||
if windows.current_process.bitness == 32 and self.owner.bitness == 64:
|
|
||||||
raise NotImplementedError("[_get_thread_id_manual] 32 -> 64 (XP64 bits + Syswow process ?)")
|
|
||||||
res = THREAD_BASIC_INFORMATION()
|
res = THREAD_BASIC_INFORMATION()
|
||||||
windows.winproxy.NtQueryInformationThread(handle, ThreadBasicInformation, byref(res), ctypes.sizeof(res))
|
windows.winproxy.NtQueryInformationThread(handle, ThreadBasicInformation, byref(res), ctypes.sizeof(res))
|
||||||
id2 = res.ClientId.UniqueThread
|
id2 = res.ClientId.UniqueThread
|
||||||
@@ -1108,11 +1178,16 @@ class WinProcess(Process):
|
|||||||
|
|
||||||
:rtype: :class:`WinThread` or :class:`DeadThread`
|
:rtype: :class:`WinThread` or :class:`DeadThread`
|
||||||
"""
|
"""
|
||||||
|
# We are using NtCreateThreadEx as its more permissive about cross-bitness / cross-architecture
|
||||||
|
# And we can asume we known what we are doing -> So no safeguard ;)
|
||||||
|
thread_handle = HANDLE()
|
||||||
if windows.current_process.bitness == 32 and self.bitness == 64:
|
if windows.current_process.bitness == 32 and self.bitness == 64:
|
||||||
thread_handle = HANDLE()
|
if self._is_x86_on_arm64:
|
||||||
|
raise NotImplementedError("Crossing heaven gate x86 -> arm64 not implemented")
|
||||||
windows.syswow64.NtCreateThreadEx_32_to_64(ThreadHandle=byref(thread_handle) ,ProcessHandle=self.handle, lpStartAddress=addr, lpParameter=param)
|
windows.syswow64.NtCreateThreadEx_32_to_64(ThreadHandle=byref(thread_handle) ,ProcessHandle=self.handle, lpStartAddress=addr, lpParameter=param)
|
||||||
return WinThread._from_handle(thread_handle.value)
|
else:
|
||||||
return WinThread._from_handle(winproxy.CreateRemoteThread(hProcess=self.handle, lpStartAddress=addr, lpParameter=param))
|
windows.winproxy.NtCreateThreadEx(ThreadHandle=byref(thread_handle) ,ProcessHandle=self.handle, lpStartAddress=addr, lpParameter=param)
|
||||||
|
return WinThread._from_handle(thread_handle.value)
|
||||||
|
|
||||||
def load_library(self, dll_path):
|
def load_library(self, dll_path):
|
||||||
"""Load the library in remote process
|
"""Load the library in remote process
|
||||||
@@ -1148,26 +1223,27 @@ class WinProcess(Process):
|
|||||||
|
|
||||||
@utils.fixedproperty
|
@utils.fixedproperty
|
||||||
def peb_addr(self):
|
def peb_addr(self):
|
||||||
"""The address of the PEB
|
"""The address of the PEB.
|
||||||
|
|
||||||
:type: :class:`int`
|
:type: :class:`int`
|
||||||
"""
|
"""
|
||||||
if windows.current_process.bitness == 32 and self.bitness == 64:
|
if windows.current_process._is_x86_on_arm64 and not self.bitness == 32:
|
||||||
|
raise NotImplementedError("Crossing heaven gate x86 -> arm64 not implemented")
|
||||||
|
|
||||||
|
if windows.current_process.bitness == 32 and self.bitness == 64: # Intel to Intel
|
||||||
x = windows.remotectypes.transform_type_to_remote64bits(PROCESS_BASIC_INFORMATION)
|
x = windows.remotectypes.transform_type_to_remote64bits(PROCESS_BASIC_INFORMATION)
|
||||||
# Fuck-it <3
|
# Fuck-it <3
|
||||||
data = (ctypes.c_char * ctypes.sizeof(x))()
|
data = (ctypes.c_char * ctypes.sizeof(x))()
|
||||||
windows.syswow64.NtQueryInformationProcess_32_to_64(self.handle, ProcessInformation=data, ProcessInformationLength=ctypes.sizeof(x))
|
windows.syswow64.NtQueryInformationProcess_32_to_64(self.handle, gdef.ProcessBasicInformation, ProcessInformation=data)
|
||||||
peb_offset = x.PebBaseAddress.offset
|
peb_offset = x.PebBaseAddress.offset
|
||||||
peb_addr = struct.unpack("<Q", data[x.PebBaseAddress.offset: x.PebBaseAddress.offset+8])[0]
|
peb_addr = struct.unpack("<Q", data[x.PebBaseAddress.offset: x.PebBaseAddress.offset+8])[0]
|
||||||
elif windows.current_process.bitness == 64 and self.bitness == 32:
|
elif windows.current_process.bitness == 64 and self.bitness == 32:
|
||||||
information_type = 26
|
|
||||||
y = ULONGLONG()
|
y = ULONGLONG()
|
||||||
winproxy.NtQueryInformationProcess(self.handle, information_type, byref(y), sizeof(y))
|
winproxy.NtQueryInformationProcess(self.handle, gdef.ProcessWow64Information, byref(y), sizeof(y))
|
||||||
peb_addr = y.value
|
peb_addr = y.value
|
||||||
else:
|
else:
|
||||||
information_type = 0
|
|
||||||
x = PROCESS_BASIC_INFORMATION()
|
x = PROCESS_BASIC_INFORMATION()
|
||||||
winproxy.NtQueryInformationProcess(self.handle, information_type, x)
|
winproxy.NtQueryInformationProcess(self.handle, gdef.ProcessBasicInformation, x)
|
||||||
peb_addr = ctypes.cast(x.PebBaseAddress, PVOID).value
|
peb_addr = ctypes.cast(x.PebBaseAddress, PVOID).value
|
||||||
if peb_addr is None:
|
if peb_addr is None:
|
||||||
raise ValueError("Could not get peb addr of process {0}".format(self.name))
|
raise ValueError("Could not get peb addr of process {0}".format(self.name))
|
||||||
@@ -1191,6 +1267,10 @@ class WinProcess(Process):
|
|||||||
def peb_syswow_addr(self):
|
def peb_syswow_addr(self):
|
||||||
if not self.is_wow_64:
|
if not self.is_wow_64:
|
||||||
raise ValueError("Not a syswow process")
|
raise ValueError("Not a syswow process")
|
||||||
|
|
||||||
|
if windows.current_process._is_x86_on_arm64:
|
||||||
|
raise NotImplementedError("Crossing heaven gate x86 -> arm64 not implemented")
|
||||||
|
|
||||||
if windows.current_process.bitness == 64:
|
if windows.current_process.bitness == 64:
|
||||||
information_type = 0
|
information_type = 0
|
||||||
x = PROCESS_BASIC_INFORMATION()
|
x = PROCESS_BASIC_INFORMATION()
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ from windows import utils
|
|||||||
import windows.generated_def as gdef
|
import windows.generated_def as gdef
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
from windows.winobject import process
|
from windows.winobject import process
|
||||||
from windows.winobject import network
|
from windows.winobject import network
|
||||||
from windows.winobject import registry
|
from windows.winobject import registry
|
||||||
@@ -586,6 +585,24 @@ class System(object):
|
|||||||
# These are the part that do not move much between XP & Win10
|
# These are the part that do not move much between XP & Win10
|
||||||
return gdef.PFW_MINIMAL_KUSER_SHARED_DATA.from_address(gdef.MM_SHARED_USER_DATA_VA)
|
return gdef.PFW_MINIMAL_KUSER_SHARED_DATA.from_address(gdef.MM_SHARED_USER_DATA_VA)
|
||||||
|
|
||||||
|
@utils.fixedproperty
|
||||||
|
def architecture(self):
|
||||||
|
# Retrieve system processor architecture
|
||||||
|
# It's not that easy as x64-on-ARM64 will lie on most API except IsWow64Process2
|
||||||
|
# EX: GetNativeSystemInfo will returns PROCESSOR_ARCHITECTURE_AMD64
|
||||||
|
if windows.winproxy.is_implemented(windows.winproxy.IsWow64Process2):
|
||||||
|
process_machine, native_machine = windows.current_process.is_wow_64_2
|
||||||
|
try:
|
||||||
|
return utils.image_file_machine_to_processor_architecture(native_machine)
|
||||||
|
except KeyError as e:
|
||||||
|
raise ValueError("Unknown IsWow64Process2(native_machine:#x) -> {0}".format(native_machine))
|
||||||
|
|
||||||
|
# No IsWow64Process2 -> assert it cannot be ARM64 and thus GetNativeSystemInfo will not lie ?
|
||||||
|
sysinfo = gdef.SYSTEM_INFO()
|
||||||
|
windows.winproxy.GetNativeSystemInfo(sysinfo)
|
||||||
|
return gdef.PROCESSOR_ARCHITECTURE_MAPPER[sysinfo.wProcessorArchitecture]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def enumerate_processes():
|
def enumerate_processes():
|
||||||
|
|||||||
@@ -44,6 +44,8 @@ def enumerate_kernel_modules():
|
|||||||
return list(modules)
|
return list(modules)
|
||||||
|
|
||||||
def enumerate_kernel_modules_syswow64():
|
def enumerate_kernel_modules_syswow64():
|
||||||
|
if windows.current_process._is_x86_on_arm64:
|
||||||
|
raise NotImplementedError("Crossing heaven gate x86 -> arm64 not implemented")
|
||||||
cbsize = gdef.DWORD()
|
cbsize = gdef.DWORD()
|
||||||
windows.syswow64.NtQuerySystemInformation_32_to_64(gdef.SystemModuleInformation, None, 0, ctypes.addressof(cbsize))
|
windows.syswow64.NtQuerySystemInformation_32_to_64(gdef.SystemModuleInformation, None, 0, ctypes.addressof(cbsize))
|
||||||
raw_buffer = (cbsize.value * gdef.BYTE)()
|
raw_buffer = (cbsize.value * gdef.BYTE)()
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ from ..error import (fail_on_zero,
|
|||||||
no_error_check,
|
no_error_check,
|
||||||
result_is_handle,
|
result_is_handle,
|
||||||
succeed_on_zero,
|
succeed_on_zero,
|
||||||
fail_on_minus_one)
|
fail_on_minus_one,
|
||||||
|
WinproxyError)
|
||||||
|
|
||||||
|
|
||||||
class Kernel32Proxy(ApiProxy):
|
class Kernel32Proxy(ApiProxy):
|
||||||
@@ -81,6 +82,18 @@ def GetPriorityClass(hProcess):
|
|||||||
def SetPriorityClass(hProcess, dwPriorityClass):
|
def SetPriorityClass(hProcess, dwPriorityClass):
|
||||||
return SetPriorityClass.ctypes_function(hProcess, dwPriorityClass)
|
return SetPriorityClass.ctypes_function(hProcess, dwPriorityClass)
|
||||||
|
|
||||||
|
@Kernel32Proxy()
|
||||||
|
def GetProcessInformation(hProcess, ProcessInformationClass, ProcessInformation, ProcessInformationSize=None):
|
||||||
|
if ProcessInformationSize is None:
|
||||||
|
ProcessInformationSize = ctypes.sizeof(ProcessInformation)
|
||||||
|
return GetProcessInformation.ctypes_function(hProcess, ProcessInformationClass, ProcessInformation, ProcessInformationSize)
|
||||||
|
|
||||||
|
@Kernel32Proxy()
|
||||||
|
def SetProcessInformation(hProcess, ProcessInformationClass, ProcessInformation, ProcessInformationSize):
|
||||||
|
if ProcessInformationSize is None:
|
||||||
|
ProcessInformationSize = ctypes.sizeof(ProcessInformation)
|
||||||
|
return SetProcessInformation.ctypes_function(hProcess, ProcessInformationClass, ProcessInformation, ProcessInformationSize)
|
||||||
|
|
||||||
|
|
||||||
PROCESS_MITIGATION_STUCTS = (gdef.PROCESS_MITIGATION_ASLR_POLICY,
|
PROCESS_MITIGATION_STUCTS = (gdef.PROCESS_MITIGATION_ASLR_POLICY,
|
||||||
gdef.PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY,
|
gdef.PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY,
|
||||||
@@ -201,6 +214,11 @@ def CreateRemoteThread(hProcess=NeededParameter, lpThreadAttributes=None, dwStac
|
|||||||
lpStartAddress=NeededParameter, lpParameter=NeededParameter, dwCreationFlags=0, lpThreadId=None):
|
lpStartAddress=NeededParameter, lpParameter=NeededParameter, dwCreationFlags=0, lpThreadId=None):
|
||||||
return CreateRemoteThread.ctypes_function(hProcess, lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpThreadId)
|
return CreateRemoteThread.ctypes_function(hProcess, lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpThreadId)
|
||||||
|
|
||||||
|
@Kernel32Proxy()
|
||||||
|
def CreateRemoteThreadEx(hProcess, lpThreadAttributes=None, dwStackSize=0, lpStartAddress=NeededParameter, lpParameter=NeededParameter, dwCreationFlags=0, lpAttributeList=None, lpThreadId=None):
|
||||||
|
return CreateRemoteThreadEx.ctypes_function(hProcess, lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpAttributeList, lpThreadId)
|
||||||
|
|
||||||
|
|
||||||
@Kernel32Proxy()
|
@Kernel32Proxy()
|
||||||
def GetThreadContext(hThread, lpContext):
|
def GetThreadContext(hThread, lpContext):
|
||||||
# TODO: RM ME IF TEST PASS
|
# TODO: RM ME IF TEST PASS
|
||||||
@@ -407,6 +425,14 @@ def GetWindowsDirectoryW(lpBuffer, uSize=None):
|
|||||||
def GetProductInfo(dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, dwSpMinorVersion, pdwReturnedProductType):
|
def GetProductInfo(dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, dwSpMinorVersion, pdwReturnedProductType):
|
||||||
return GetProductInfo.ctypes_function(dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, dwSpMinorVersion, pdwReturnedProductType)
|
return GetProductInfo.ctypes_function(dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, dwSpMinorVersion, pdwReturnedProductType)
|
||||||
|
|
||||||
|
@Kernel32Proxy(error_check=no_error_check)
|
||||||
|
def GetNativeSystemInfo(lpSystemInfo):
|
||||||
|
return GetNativeSystemInfo.ctypes_function(lpSystemInfo)
|
||||||
|
|
||||||
|
@Kernel32Proxy(error_check=no_error_check)
|
||||||
|
def GetSystemInfo(lpSystemInfo):
|
||||||
|
return GetSystemInfo.ctypes_function(lpSystemInfo)
|
||||||
|
|
||||||
## Io
|
## Io
|
||||||
|
|
||||||
@Kernel32Proxy()
|
@Kernel32Proxy()
|
||||||
@@ -503,6 +529,41 @@ def Wow64GetThreadContext(hThread, lpContext):
|
|||||||
def Wow64SetThreadContext(hThread, lpContext):
|
def Wow64SetThreadContext(hThread, lpContext):
|
||||||
return Wow64SetThreadContext.ctypes_function(hThread, lpContext)
|
return Wow64SetThreadContext.ctypes_function(hThread, lpContext)
|
||||||
|
|
||||||
|
@Kernel32Proxy()
|
||||||
|
def IsWow64Process(hProcess, Wow64Process):
|
||||||
|
return IsWow64Process.ctypes_function(hProcess, Wow64Process)
|
||||||
|
|
||||||
|
@Kernel32Proxy()
|
||||||
|
def IsWow64Process2(hProcess, pProcessMachine, pNativeMachine):
|
||||||
|
return IsWow64Process2.ctypes_function(hProcess, pProcessMachine, pNativeMachine)
|
||||||
|
|
||||||
|
@Kernel32Proxy()
|
||||||
|
def IsWow64GuestMachineSupported(WowGuestMachine, MachineIsSupported):
|
||||||
|
return IsWow64GuestMachineSupported.ctypes_function(WowGuestMachine, MachineIsSupported)
|
||||||
|
|
||||||
|
@Kernel32Proxy()
|
||||||
|
def GetSystemWow64DirectoryA(lpBuffer, uSize):
|
||||||
|
return GetSystemWow64DirectoryA.ctypes_function(lpBuffer, uSize)
|
||||||
|
|
||||||
|
@Kernel32Proxy()
|
||||||
|
def GetSystemWow64DirectoryW(lpBuffer, uSize):
|
||||||
|
return GetSystemWow64DirectoryW.ctypes_function(lpBuffer, uSize)
|
||||||
|
|
||||||
|
@Kernel32Proxy()
|
||||||
|
def GetSystemWow64Directory2A(lpBuffer, uSize, ImageFileMachineType):
|
||||||
|
return GetSystemWow64Directory2A.ctypes_function(lpBuffer, uSize, ImageFileMachineType)
|
||||||
|
|
||||||
|
@Kernel32Proxy()
|
||||||
|
def GetSystemWow64Directory2W(lpBuffer, uSize, ImageFileMachineType):
|
||||||
|
return GetSystemWow64Directory2W.ctypes_function(lpBuffer, uSize, ImageFileMachineType)
|
||||||
|
|
||||||
|
@Kernel32Proxy()
|
||||||
|
def Wow64SetThreadDefaultGuestMachine(Machine):
|
||||||
|
return Wow64SetThreadDefaultGuestMachine.ctypes_function(Machine)
|
||||||
|
|
||||||
|
@Kernel32Proxy()
|
||||||
|
def Wow64SuspendThread(hThread):
|
||||||
|
return Wow64SuspendThread.ctypes_function(hThread)
|
||||||
|
|
||||||
|
|
||||||
## File
|
## File
|
||||||
@@ -605,12 +666,7 @@ def FindNextChangeNotification(hChangeHandle):
|
|||||||
|
|
||||||
@Kernel32Proxy()
|
@Kernel32Proxy()
|
||||||
def FindCloseChangeNotification(hChangeHandle):
|
def FindCloseChangeNotification(hChangeHandle):
|
||||||
return FindCloseChange
|
return FindCloseChangeNotification.ctypes_function(hChangeHandle)
|
||||||
Notification.ctypes_function(hChangeHandle)
|
|
||||||
|
|
||||||
@Kernel32Proxy()
|
|
||||||
def FindNextChangeNotification(hChangeHandle):
|
|
||||||
return FindNextChangeNotification.ctypes_function(hChangeHandle)
|
|
||||||
|
|
||||||
@Kernel32Proxy()
|
@Kernel32Proxy()
|
||||||
def ReadDirectoryChangesW(hDirectory, lpBuffer, nBufferLength, bWatchSubtree, dwNotifyFilter, lpBytesReturned, lpOverlapped, lpCompletionRoutine):
|
def ReadDirectoryChangesW(hDirectory, lpBuffer, nBufferLength, bWatchSubtree, dwNotifyFilter, lpBytesReturned, lpOverlapped, lpCompletionRoutine):
|
||||||
|
|||||||
@@ -148,7 +148,7 @@ def NtCreateProcessEx(ProcessHandle, DesiredAccess, ObjectAttributes=None, Paren
|
|||||||
return NtCreateProcessEx.ctypes_function(ProcessHandle, DesiredAccess, ObjectAttributes, ParentProcess, Flags, SectionHandle, DebugPort, ExceptionPort, InJob)
|
return NtCreateProcessEx.ctypes_function(ProcessHandle, DesiredAccess, ObjectAttributes, ParentProcess, Flags, SectionHandle, DebugPort, ExceptionPort, InJob)
|
||||||
|
|
||||||
@NtdllProxy()
|
@NtdllProxy()
|
||||||
def NtCreateThreadEx(ThreadHandle=None, DesiredAccess=0x1fffff, ObjectAttributes=0, ProcessHandle=NeededParameter, lpStartAddress=NeededParameter, lpParameter=NeededParameter, CreateSuspended=0, dwStackSize=0, Unknown1=0, Unknown2=0, Unknown=0):
|
def NtCreateThreadEx(ThreadHandle=None, DesiredAccess=0x1fffff, ObjectAttributes=0, ProcessHandle=NeededParameter, lpStartAddress=NeededParameter, lpParameter=NeededParameter, CreateSuspended=0, dwStackSize=0, Unknown1=0, Unknown2=0, Unknown3=0):
|
||||||
if ThreadHandle is None:
|
if ThreadHandle is None:
|
||||||
ThreadHandle = ctypes.byref(gdef.HANDLE())
|
ThreadHandle = ctypes.byref(gdef.HANDLE())
|
||||||
return NtCreateThreadEx.ctypes_function(ThreadHandle, DesiredAccess, ObjectAttributes, ProcessHandle, lpStartAddress, lpParameter, CreateSuspended, dwStackSize, Unknown1, Unknown2, Unknown3)
|
return NtCreateThreadEx.ctypes_function(ThreadHandle, DesiredAccess, ObjectAttributes, ProcessHandle, lpStartAddress, lpParameter, CreateSuspended, dwStackSize, Unknown1, Unknown2, Unknown3)
|
||||||
|
|||||||
Reference in New Issue
Block a user