Last active
September 27, 2015 04:06
-
-
Save secabstraction/508bfd6c0c0809e6d657 to your computer and use it in GitHub Desktop.
Trace the threads of a process, "mini-dbg" RDI detection
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function Get-ProcessTrace { | |
<# | |
.SYNOPSIS | |
Walks thread stacks of specified process(es) to help identify dll injection. | |
.DESCRIPTION | |
This commandlet uses Windows Remote Management to trace the threads of specified process(es) of remote machines. | |
.PARAMETER ComputerName | |
Specify the hostname or IP address of a remote computer to retrieve data from. | |
.PARAMETER Name | |
Specify name of process who's threads should be walked. | |
.PARAMETER ID | |
Specify process Id of process who's threads should be walked. | |
.PARAMETER CSV | |
Specify path to output file, output is formatted as comma separated values. | |
.EXAMPLE | |
The following example traces the threads of all processes named svchost on the local computer and writes the output to a csv file. | |
PS C:\> Get-ProcessTrace -Name svchost -CSV C:\pathto\output.csv | |
.EXAMPLE | |
The following example traces the threads of all processes named svchost on Server01 and writes the output to the PowerShell console as a table. | |
PS C:\> Get-ProcessTrace -ComputerName Server01 -Name svchost | Format-Table | |
.NOTES | |
Version: 0.1 | |
Author : Jesse Davis (@secabstraction) | |
.INPUTS | |
.OUTPUTS | |
.LINK | |
#> | |
[CmdLetBinding()] | |
Param( | |
[Parameter(Position = 0, ValueFromPipeline = $true)] | |
[String[]]$ComputerName, | |
[Parameter(ParameterSetName = 'Name')] | |
[ValidateNotNullOrEmpty()] | |
[String]$Name = '', | |
[Parameter(ParameterSetName = 'Id')] | |
[ValidateNotNullOrEmpty()] | |
[Int]$Id = -1, | |
[Parameter()] | |
[ValidateNotNullOrEmpty()] | |
[String]$CSV | |
) | |
if($PSBoundParameters['CSV']) { $OutputFilePath = (Resolve-Path (Split-Path -Path $CSV -Parent)).Path + '\' + (Split-Path -Path $CSV -Leaf) } | |
$ScriptTime = [Diagnostics.Stopwatch]::StartNew() | |
$ScriptBlock = { | |
Param ( | |
[Parameter()] | |
[String]$Name, | |
[Parameter()] | |
[Int]$Id | |
) | |
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { | |
Write-Warning "This script should be ran with administrative priviliges." | |
} | |
$Domain = [AppDomain]::CurrentDomain | |
$DynAssembly = New-Object -TypeName System.Reflection.AssemblyName -ArgumentList ('PowerWalker') | |
$AssemblyBuilder = $Domain.DefineDynamicAssembly($DynAssembly, [Reflection.Emit.AssemblyBuilderAccess]::Run) | |
$ModuleBuilder = $AssemblyBuilder.DefineDynamicModule('InMemoryModule', $false) | |
$ConstructorInfo = [Runtime.InteropServices.MarshalAsAttribute].GetConstructors()[0] | |
#region STRUCTS | |
#region ENUM ProcessorArch | |
$TypeBuilder = $ModuleBuilder.DefineEnum('ProcessorArch', 'Public', [UInt16]) | |
[void]$TypeBuilder.DefineLiteral('PROCESSOR_ARCHITECTURE_INTEL', [UInt16] 0) | |
[void]$TypeBuilder.DefineLiteral('PROCESSOR_ARCHITECTURE_MIPS', [UInt16] 0x01) | |
[void]$TypeBuilder.DefineLiteral('PROCESSOR_ARCHITECTURE_ALPHA', [UInt16] 0x02) | |
[void]$TypeBuilder.DefineLiteral('PROCESSOR_ARCHITECTURE_PPC', [UInt16] 0x03) | |
[void]$TypeBuilder.DefineLiteral('PROCESSOR_ARCHITECTURE_SHX', [UInt16] 0x04) | |
[void]$TypeBuilder.DefineLiteral('PROCESSOR_ARCHITECTURE_ARM', [UInt16] 0x05) | |
[void]$TypeBuilder.DefineLiteral('PROCESSOR_ARCHITECTURE_IA64', [UInt16] 0x06) | |
[void]$TypeBuilder.DefineLiteral('PROCESSOR_ARCHITECTURE_ALPHA64', [UInt16] 0x07) | |
[void]$TypeBuilder.DefineLiteral('PROCESSOR_ARCHITECTURE_AMD64', [UInt16] 0x09) | |
[void]$TypeBuilder.DefineLiteral('PROCESSOR_ARCHITECTURE_UNKNOWN', [UInt16] 0xFFFF) | |
$Global:ProcessorArch = $TypeBuilder.CreateType() | |
#endregion ENUM ProcessorArch | |
#region SYSTEM_INFO | |
$Attributes = 'AutoLayout, AnsiClass, Class, Public, SequentialLayout, Sealed, BeforeFieldInit' | |
$TypeBuilder = $ModuleBuilder.DefineType('SYSTEM_INFO', $Attributes, [ValueType]) | |
[void]$TypeBuilder.DefineField('ProcessorArchitecture', $ProcessorArch, 'Public') | |
[void]$TypeBuilder.DefineField('Reserved', [Int16], 'Public') | |
[void]$TypeBuilder.DefineField('PageSize', [Int32], 'Public') | |
[void]$TypeBuilder.DefineField('MinimumApplicationAddress', [IntPtr], 'Public') | |
[void]$TypeBuilder.DefineField('MaximumApplicationAddress', [IntPtr], 'Public') | |
[void]$TypeBuilder.DefineField('ActiveProcessorMask', [IntPtr], 'Public') | |
[void]$TypeBuilder.DefineField('NumberOfProcessors', [Int32], 'Public') | |
[void]$TypeBuilder.DefineField('ProcessorType', [Int32], 'Public') | |
[void]$TypeBuilder.DefineField('AllocationGranularity', [Int32], 'Public') | |
[void]$TypeBuilder.DefineField('ProcessorLevel', [Int16], 'Public') | |
[void]$TypeBuilder.DefineField('ProcessorRevision', [Int16], 'Public') | |
$Global:SYSTEM_INFO = $TypeBuilder.CreateType() | |
#endregion SYSTEM_INFO | |
#region MODULE_INFO | |
$Attributes = 'AutoLayout, AnsiClass, Class, Public, SequentialLayout, Sealed, BeforeFieldInit' | |
$TypeBuilder = $ModuleBuilder.DefineType('MODULE_INFO', $Attributes, [ValueType], 12) | |
[void]$TypeBuilder.DefineField('lpBaseOfDll', [IntPtr], 'Public') | |
[void]$TypeBuilder.DefineField('SizeOfImage', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('EntryPoint', [IntPtr], 'Public') | |
$Global:MODULE_INFO = $TypeBuilder.CreateType() | |
#endregion MODULE_INFO | |
#region KDHELP | |
$Attributes = 'AutoLayout, AnsiClass, Class, Public, SequentialLayout, Sealed, BeforeFieldInit' | |
$TypeBuilder = $ModuleBuilder.DefineType('KDHELP', $Attributes, [ValueType]) | |
[void]$TypeBuilder.DefineField('Thread', [UInt64], 'Public') | |
[void]$TypeBuilder.DefineField('ThCallbackStack', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('ThCallbackBStore', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('NextCallback', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('FramePointer', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('KiCallUserMode', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('KeUserCallbackDispatcher', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('SystemRangeStart', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('KiUserExceptionDispatcher', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('StackBase', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('StackLimit', [UInt32], 'Public') | |
$ReservedField = $TypeBuilder.DefineField('Reserved', [UInt64[]], 'Public') | |
$FieldArray = @([Runtime.InteropServices.MarshalAsAttribute].GetField('SizeConst')) | |
$ConstructorValue = [Runtime.InteropServices.UnmanagedType]::ByValArray | |
$AttribBuilder = New-Object -TypeName System.Reflection.Emit.CustomAttributeBuilder -ArgumentList ($ConstructorInfo, $ConstructorValue, $FieldArray, @([Int32] 5)) | |
[void]$ReservedField.SetCustomAttribute($AttribBuilder) | |
$KDHELP = $TypeBuilder.CreateType() | |
#endregion KDHELP | |
#region ADDRESS64 | |
$Attributes = 'AutoLayout, AnsiClass, Class, Public, SequentialLayout, Sealed, BeforeFieldInit' | |
$TypeBuilder = $ModuleBuilder.DefineType('ADDRESS64', $Attributes, [ValueType]) | |
[void]$TypeBuilder.DefineField('Offset', [UInt64], 'Public') | |
[void]$TypeBuilder.DefineField('Segment', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('Mode', [UInt32], 'Public') | |
$Global:ADDRESS64 = $TypeBuilder.CreateType() | |
#endregion ADDRESS64 | |
#region STACKFRAME64 | |
$Attributes = 'AutoLayout, AnsiClass, Class, Public, SequentialLayout, Sealed, BeforeFieldInit' | |
$TypeBuilder = $ModuleBuilder.DefineType('STACKFRAME64', $Attributes, [ValueType]) | |
[void]$TypeBuilder.DefineField('AddrPC', $ADDRESS64, 'Public') | |
[void]$TypeBuilder.DefineField('AddrReturn', $ADDRESS64, 'Public') | |
[void]$TypeBuilder.DefineField('AddrFrame', $ADDRESS64, 'Public') | |
[void]$TypeBuilder.DefineField('AddrStack', $ADDRESS64, 'Public') | |
[void]$TypeBuilder.DefineField('AddrBStore', $ADDRESS64, 'Public') | |
[void]$TypeBuilder.DefineField('FuncTableEntry', [IntPtr], 'Public') | |
[void]$TypeBuilder.DefineField('Offset', [UInt64], 'Public') | |
$ParamsField = $TypeBuilder.DefineField('Params', [UInt64[]], 'Public') | |
$AttribBuilder = New-Object -TypeName System.Reflection.Emit.CustomAttributeBuilder -ArgumentList ($ConstructorInfo, $ConstructorValue, $FieldArray, @([Int32] 4)) | |
[void]$ParamsField.SetCustomAttribute($AttribBuilder) | |
[void]$TypeBuilder.DefineField('Far', [Bool], 'Public') | |
[void]$TypeBuilder.DefineField('Virtual', [Bool], 'Public') | |
$ReservedField = $TypeBuilder.DefineField('Reserved', [UInt64[]], 'Public') | |
$AttribBuilder = New-Object -TypeName System.Reflection.Emit.CustomAttributeBuilder -ArgumentList ($ConstructorInfo, $ConstructorValue, $FieldArray, @([Int32] 3)) | |
[void]$ReservedField.SetCustomAttribute($AttribBuilder) | |
[void]$TypeBuilder.DefineField('KdHelp', $KDHELP, 'Public') | |
$Global:STACKFRAME64 = $TypeBuilder.CreateType() | |
#endregion STACKFRAME64 | |
#region IMAGEHLP_SYMBOLW64 | |
$Attributes = 'AutoLayout, AnsiClass, Class, Public, SequentialLayout, Sealed, BeforeFieldInit' | |
$TypeBuilder = $ModuleBuilder.DefineType('IMAGEHLP_SYMBOLW64', $Attributes, [ValueType]) | |
[void]$TypeBuilder.DefineField('SizeOfStruct', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('Address', [UInt64], 'Public') | |
[void]$TypeBuilder.DefineField('Size', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('Flags', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('MaxNameLength', [UInt32], 'Public') | |
$NameField = $TypeBuilder.DefineField('Name', [Char[]], 'Public') | |
$AttribBuilder = New-Object -TypeName System.Reflection.Emit.CustomAttributeBuilder -ArgumentList ($ConstructorInfo, $ConstructorValue, $FieldArray, @([Int32] 33)) | |
[void]$NameField.SetCustomAttribute($AttribBuilder) | |
$Global:IMAGEHLP_SYMBOLW64 = $TypeBuilder.CreateType() | |
#endregion IMAGEHLP_SYMBOLW64 | |
#region FLOAT128 | |
$Attributes = 'AutoLayout, AnsiClass, Class, Public, SequentialLayout, Sealed, BeforeFieldInit' | |
$TypeBuilder = $ModuleBuilder.DefineType('FLOAT128', $Attributes, [ValueType]) | |
[void]$TypeBuilder.DefineField('LowPart', [Int64], 'Public') | |
[void]$TypeBuilder.DefineField('HighPart', [Int64], 'Public') | |
$FLOAT128 = $TypeBuilder.CreateType() | |
#endregion FLOAT128 | |
#region FLOATING_SAVE_AREA | |
$Attributes = 'AutoLayout, AnsiClass, Class, Public, SequentialLayout, Sealed, BeforeFieldInit' | |
$TypeBuilder = $ModuleBuilder.DefineType('FLOATING_SAVE_AREA', $Attributes, [ValueType]) | |
[void]$TypeBuilder.DefineField('ControlWord', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('StatusWord', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('TagWord', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('ErrorOffset', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('ErrorSelector', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('DataOffset', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('DataSelector', [UInt32], 'Public') | |
$RegisterAreaField = $TypeBuilder.DefineField('RegisterArea', [Byte[]], 'Public') | |
$AttribBuilder = New-Object -TypeName System.Reflection.Emit.CustomAttributeBuilder -ArgumentList ($ConstructorInfo, $ConstructorValue, $FieldArray, @([Int32] 80)) | |
[void]$RegisterAreaField.SetCustomAttribute($AttribBuilder) | |
[void]$TypeBuilder.DefineField('Cr0NpxState', [UInt32], 'Public') | |
$FLOATING_SAVE_AREA = $TypeBuilder.CreateType() | |
#endregion FLOATING_SAVE_AREA | |
#region X86_CONTEXT | |
$Attributes = 'AutoLayout, AnsiClass, Class, Public, SequentialLayout, Sealed, BeforeFieldInit' | |
$TypeBuilder = $ModuleBuilder.DefineType('X86_CONTEXT', $Attributes, [ValueType]) | |
[void]$TypeBuilder.DefineField('ContextFlags', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('Dr0', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('Dr1', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('Dr2', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('Dr3', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('Dr6', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('Dr7', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('FloatSave', $FLOATING_SAVE_AREA, 'Public') | |
[void]$TypeBuilder.DefineField('SegGs', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('SegFs', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('SegEs', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('SegDs', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('Edi', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('Esi', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('Ebx', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('Edx', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('Ecx', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('Eax', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('Ebp', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('Eip', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('SegCs', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('EFlags', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('Esp', [UInt32], 'Public') | |
[void]$TypeBuilder.DefineField('SegSs', [UInt32], 'Public') | |
$ExtendedRegistersField = $TypeBuilder.DefineField('ExtendedRegisters', [Byte[]], 'Public') | |
$AttribBuilder = New-Object -TypeName System.Reflection.Emit.CustomAttributeBuilder -ArgumentList ($ConstructorInfo, $ConstructorValue, $FieldArray, @([Int32] 512)) | |
[void]$ExtendedRegistersField.SetCustomAttribute($AttribBuilder) | |
$Global:X86_CONTEXT = $TypeBuilder.CreateType() | |
#endregion X86_CONTEXT | |
#region AMD64_CONTEXT | |
$Attributes = 'AutoLayout, AnsiClass, Class, Public, ExplicitLayout, Sealed, BeforeFieldInit' | |
$TypeBuilder = $ModuleBuilder.DefineType('AMD64_CONTEXT', $Attributes, [ValueType]) | |
($TypeBuilder.DefineField('P1Home', [UInt64], 'Public')).SetOffset(0x0) | |
($TypeBuilder.DefineField('P2Home', [UInt64], 'Public')).SetOffset(0x8) | |
($TypeBuilder.DefineField('P3Home', [UInt64], 'Public')).SetOffset(0x10) | |
($TypeBuilder.DefineField('P4Home', [UInt64], 'Public')).SetOffset(0x18) | |
($TypeBuilder.DefineField('P5Home', [UInt64], 'Public')).SetOffset(0x20) | |
($TypeBuilder.DefineField('P6Home', [UInt64], 'Public')).SetOffset(0x28) | |
($TypeBuilder.DefineField('ContextFlags', [UInt32], 'Public')).SetOffset(0x30) | |
($TypeBuilder.DefineField('MxCsr', [UInt32], 'Public')).SetOffset(0x34) | |
($TypeBuilder.DefineField('SegCs', [UInt16], 'Public')).SetOffset(0x38) | |
($TypeBuilder.DefineField('SegDs', [UInt16], 'Public')).SetOffset(0x3a) | |
($TypeBuilder.DefineField('SegEs', [UInt16], 'Public')).SetOffset(0x3c) | |
($TypeBuilder.DefineField('SegFs', [UInt16], 'Public')).SetOffset(0x3e) | |
($TypeBuilder.DefineField('SegGs', [UInt16], 'Public')).SetOffset(0x40) | |
($TypeBuilder.DefineField('SegSs', [UInt16], 'Public')).SetOffset(0x42) | |
($TypeBuilder.DefineField('EFlags', [UInt32], 'Public')).SetOffset(0x44) | |
($TypeBuilder.DefineField('Dr0', [UInt64], 'Public')).SetOffset(0x48) | |
($TypeBuilder.DefineField('Dr1', [UInt64], 'Public')).SetOffset(0x50) | |
($TypeBuilder.DefineField('Dr2', [UInt64], 'Public')).SetOffset(0x58) | |
($TypeBuilder.DefineField('Dr3', [UInt64], 'Public')).SetOffset(0x60) | |
($TypeBuilder.DefineField('Dr6', [UInt64], 'Public')).SetOffset(0x68) | |
($TypeBuilder.DefineField('Dr7', [UInt64], 'Public')).SetOffset(0x70) | |
($TypeBuilder.DefineField('Rax', [UInt64], 'Public')).SetOffset(0x78) | |
($TypeBuilder.DefineField('Rcx', [UInt64], 'Public')).SetOffset(0x80) | |
($TypeBuilder.DefineField('Rdx', [UInt64], 'Public')).SetOffset(0x88) | |
($TypeBuilder.DefineField('Rbx', [UInt64], 'Public')).SetOffset(0x90) | |
($TypeBuilder.DefineField('Rsp', [UInt64], 'Public')).SetOffset(0x98) | |
($TypeBuilder.DefineField('Rbp', [UInt64], 'Public')).SetOffset(0xa0) | |
($TypeBuilder.DefineField('Rsi', [UInt64], 'Public')).SetOffset(0xa8) | |
($TypeBuilder.DefineField('Rdi', [UInt64], 'Public')).SetOffset(0xb0) | |
($TypeBuilder.DefineField('R8', [UInt64], 'Public')).SetOffset(0xa8) | |
($TypeBuilder.DefineField('R9', [UInt64], 'Public')).SetOffset(0xc0) | |
($TypeBuilder.DefineField('R10', [UInt64], 'Public')).SetOffset(0xc8) | |
($TypeBuilder.DefineField('R11', [UInt64], 'Public')).SetOffset(0xd0) | |
($TypeBuilder.DefineField('R12', [UInt64], 'Public')).SetOffset(0xd8) | |
($TypeBuilder.DefineField('R13', [UInt64], 'Public')).SetOffset(0xe0) | |
($TypeBuilder.DefineField('R14', [UInt64], 'Public')).SetOffset(0xe8) | |
($TypeBuilder.DefineField('R15', [UInt64], 'Public')).SetOffset(0xf0) | |
($TypeBuilder.DefineField('Rip', [UInt64], 'Public')).SetOffset(0xf8) | |
($TypeBuilder.DefineField('FltSave', [UInt64], 'Public')).SetOffset(0x100) | |
($TypeBuilder.DefineField('Legacy', [UInt64], 'Public')).SetOffset(0x120) | |
($TypeBuilder.DefineField('Xmm0', [UInt64], 'Public')).SetOffset(0x1a0) | |
($TypeBuilder.DefineField('Xmm1', [UInt64], 'Public')).SetOffset(0x1b0) | |
($TypeBuilder.DefineField('Xmm2', [UInt64], 'Public')).SetOffset(0x1c0) | |
($TypeBuilder.DefineField('Xmm3', [UInt64], 'Public')).SetOffset(0x1d0) | |
($TypeBuilder.DefineField('Xmm4', [UInt64], 'Public')).SetOffset(0x1e0) | |
($TypeBuilder.DefineField('Xmm5', [UInt64], 'Public')).SetOffset(0x1f0) | |
($TypeBuilder.DefineField('Xmm6', [UInt64], 'Public')).SetOffset(0x200) | |
($TypeBuilder.DefineField('Xmm7', [UInt64], 'Public')).SetOffset(0x210) | |
($TypeBuilder.DefineField('Xmm8', [UInt64], 'Public')).SetOffset(0x220) | |
($TypeBuilder.DefineField('Xmm9', [UInt64], 'Public')).SetOffset(0x230) | |
($TypeBuilder.DefineField('Xmm10', [UInt64], 'Public')).SetOffset(0x240) | |
($TypeBuilder.DefineField('Xmm11', [UInt64], 'Public')).SetOffset(0x250) | |
($TypeBuilder.DefineField('Xmm12', [UInt64], 'Public')).SetOffset(0x260) | |
($TypeBuilder.DefineField('Xmm13', [UInt64], 'Public')).SetOffset(0x270) | |
($TypeBuilder.DefineField('Xmm14', [UInt64], 'Public')).SetOffset(0x280) | |
($TypeBuilder.DefineField('Xmm15', [UInt64], 'Public')).SetOffset(0x290) | |
($TypeBuilder.DefineField('VectorRegister', [UInt64], 'Public')).SetOffset(0x300) | |
($TypeBuilder.DefineField('VectorControl', [UInt64], 'Public')).SetOffset(0x4a0) | |
($TypeBuilder.DefineField('DebugControl', [UInt64], 'Public')).SetOffset(0x4a8) | |
($TypeBuilder.DefineField('LastBranchToRip', [UInt64], 'Public')).SetOffset(0x4b0) | |
($TypeBuilder.DefineField('LastBranchFromRip', [UInt64], 'Public')).SetOffset(0x4b8) | |
($TypeBuilder.DefineField('LastExceptionToRip', [UInt64], 'Public')).SetOffset(0x4c0) | |
($TypeBuilder.DefineField('LastExceptionFromRip', [UInt64], 'Public')).SetOffset(0x4c8) | |
$Global:AMD64_CONTEXT = $TypeBuilder.CreateType() | |
#endregion AMD64_CONTEXT | |
#region IA64_CONTEXT | |
$Attributes = 'AutoLayout, AnsiClass, Class, Public, ExplicitLayout, Sealed, BeforeFieldInit' | |
$TypeBuilder = $ModuleBuilder.DefineType('IA64_CONTEXT', $Attributes, [ValueType]) | |
($TypeBuilder.DefineField('ContextFlags', [UInt64], 'Public')).SetOffset(0x0) | |
($TypeBuilder.DefineField('DbI0', [UInt64], 'Public')).SetOffset(0x010) | |
($TypeBuilder.DefineField('DbI1', [UInt64], 'Public')).SetOffset(0x018) | |
($TypeBuilder.DefineField('DbI2', [UInt64], 'Public')).SetOffset(0x020) | |
($TypeBuilder.DefineField('DbI3', [UInt64], 'Public')).SetOffset(0x028) | |
($TypeBuilder.DefineField('DbI4', [UInt64], 'Public')).SetOffset(0x030) | |
($TypeBuilder.DefineField('DbI5', [UInt64], 'Public')).SetOffset(0x038) | |
($TypeBuilder.DefineField('DbI6', [UInt64], 'Public')).SetOffset(0x040) | |
($TypeBuilder.DefineField('DbI7', [UInt64], 'Public')).SetOffset(0x048) | |
($TypeBuilder.DefineField('DbD0', [UInt64], 'Public')).SetOffset(0x050) | |
($TypeBuilder.DefineField('DbD1', [UInt64], 'Public')).SetOffset(0x058) | |
($TypeBuilder.DefineField('DbD2', [UInt64], 'Public')).SetOffset(0x060) | |
($TypeBuilder.DefineField('DbD3', [UInt64], 'Public')).SetOffset(0x068) | |
($TypeBuilder.DefineField('DbD4', [UInt64], 'Public')).SetOffset(0x070) | |
($TypeBuilder.DefineField('DbD5', [UInt64], 'Public')).SetOffset(0x078) | |
($TypeBuilder.DefineField('DbD6', [UInt64], 'Public')).SetOffset(0x080) | |
($TypeBuilder.DefineField('DbD7', [UInt64], 'Public')).SetOffset(0x088) | |
($TypeBuilder.DefineField('FltS0', $FLOAT128, 'Public')).SetOffset(0x090) | |
($TypeBuilder.DefineField('FltS1', $FLOAT128, 'Public')).SetOffset(0x0a0) | |
($TypeBuilder.DefineField('FltS2', $FLOAT128, 'Public')).SetOffset(0x0b0) | |
($TypeBuilder.DefineField('FltS3', $FLOAT128, 'Public')).SetOffset(0x0c0) | |
($TypeBuilder.DefineField('FltT0', $FLOAT128, 'Public')).SetOffset(0x0d0) | |
($TypeBuilder.DefineField('FltT1', $FLOAT128, 'Public')).SetOffset(0x0e0) | |
($TypeBuilder.DefineField('FltT2', $FLOAT128, 'Public')).SetOffset(0x0f0) | |
($TypeBuilder.DefineField('FltT3', $FLOAT128, 'Public')).SetOffset(0x100) | |
($TypeBuilder.DefineField('FltT4', $FLOAT128, 'Public')).SetOffset(0x110) | |
($TypeBuilder.DefineField('FltT5', $FLOAT128, 'Public')).SetOffset(0x120) | |
($TypeBuilder.DefineField('FltT6', $FLOAT128, 'Public')).SetOffset(0x130) | |
($TypeBuilder.DefineField('FltT7', $FLOAT128, 'Public')).SetOffset(0x140) | |
($TypeBuilder.DefineField('FltT8', $FLOAT128, 'Public')).SetOffset(0x150) | |
($TypeBuilder.DefineField('FltT9', $FLOAT128, 'Public')).SetOffset(0x160) | |
($TypeBuilder.DefineField('FltS4', $FLOAT128, 'Public')).SetOffset(0x170) | |
($TypeBuilder.DefineField('FltS5', $FLOAT128, 'Public')).SetOffset(0x180) | |
($TypeBuilder.DefineField('FltS6', $FLOAT128, 'Public')).SetOffset(0x190) | |
($TypeBuilder.DefineField('FltS7', $FLOAT128, 'Public')).SetOffset(0x1a0) | |
($TypeBuilder.DefineField('FltS8', $FLOAT128, 'Public')).SetOffset(0x1b0) | |
($TypeBuilder.DefineField('FltS9', $FLOAT128, 'Public')).SetOffset(0x1c0) | |
($TypeBuilder.DefineField('FltS10', $FLOAT128, 'Public')).SetOffset(0x1d0) | |
($TypeBuilder.DefineField('FltS11', $FLOAT128, 'Public')).SetOffset(0x1e0) | |
($TypeBuilder.DefineField('FltS12', $FLOAT128, 'Public')).SetOffset(0x1f0) | |
($TypeBuilder.DefineField('FltS13', $FLOAT128, 'Public')).SetOffset(0x200) | |
($TypeBuilder.DefineField('FltS14', $FLOAT128, 'Public')).SetOffset(0x210) | |
($TypeBuilder.DefineField('FltS15', $FLOAT128, 'Public')).SetOffset(0x220) | |
($TypeBuilder.DefineField('FltS16', $FLOAT128, 'Public')).SetOffset(0x230) | |
($TypeBuilder.DefineField('FltS17', $FLOAT128, 'Public')).SetOffset(0x240) | |
($TypeBuilder.DefineField('FltS18', $FLOAT128, 'Public')).SetOffset(0x250) | |
($TypeBuilder.DefineField('FltS19', $FLOAT128, 'Public')).SetOffset(0x260) | |
($TypeBuilder.DefineField('FltF32', $FLOAT128, 'Public')).SetOffset(0x270) | |
($TypeBuilder.DefineField('FltF33', $FLOAT128, 'Public')).SetOffset(0x280) | |
($TypeBuilder.DefineField('FltF34', $FLOAT128, 'Public')).SetOffset(0x290) | |
($TypeBuilder.DefineField('FltF35', $FLOAT128, 'Public')).SetOffset(0x2a0) | |
($TypeBuilder.DefineField('FltF36', $FLOAT128, 'Public')).SetOffset(0x2b0) | |
($TypeBuilder.DefineField('FltF37', $FLOAT128, 'Public')).SetOffset(0x2c0) | |
($TypeBuilder.DefineField('FltF38', $FLOAT128, 'Public')).SetOffset(0x2d0) | |
($TypeBuilder.DefineField('FltF39', $FLOAT128, 'Public')).SetOffset(0x2e0) | |
($TypeBuilder.DefineField('FltF40', $FLOAT128, 'Public')).SetOffset(0x2f0) | |
($TypeBuilder.DefineField('FltF41', $FLOAT128, 'Public')).SetOffset(0x300) | |
($TypeBuilder.DefineField('FltF42', $FLOAT128, 'Public')).SetOffset(0x310) | |
($TypeBuilder.DefineField('FltF43', $FLOAT128, 'Public')).SetOffset(0x320) | |
($TypeBuilder.DefineField('FltF44', $FLOAT128, 'Public')).SetOffset(0x330) | |
($TypeBuilder.DefineField('FltF45', $FLOAT128, 'Public')).SetOffset(0x340) | |
($TypeBuilder.DefineField('FltF46', $FLOAT128, 'Public')).SetOffset(0x350) | |
($TypeBuilder.DefineField('FltF47', $FLOAT128, 'Public')).SetOffset(0x360) | |
($TypeBuilder.DefineField('FltF48', $FLOAT128, 'Public')).SetOffset(0x370) | |
($TypeBuilder.DefineField('FltF49', $FLOAT128, 'Public')).SetOffset(0x380) | |
($TypeBuilder.DefineField('FltF50', $FLOAT128, 'Public')).SetOffset(0x390) | |
($TypeBuilder.DefineField('FltF51', $FLOAT128, 'Public')).SetOffset(0x3a0) | |
($TypeBuilder.DefineField('FltF52', $FLOAT128, 'Public')).SetOffset(0x3b0) | |
($TypeBuilder.DefineField('FltF53', $FLOAT128, 'Public')).SetOffset(0x3c0) | |
($TypeBuilder.DefineField('FltF54', $FLOAT128, 'Public')).SetOffset(0x3d0) | |
($TypeBuilder.DefineField('FltF55', $FLOAT128, 'Public')).SetOffset(0x3e0) | |
($TypeBuilder.DefineField('FltF56', $FLOAT128, 'Public')).SetOffset(0x3f0) | |
($TypeBuilder.DefineField('FltF57', $FLOAT128, 'Public')).SetOffset(0x400) | |
($TypeBuilder.DefineField('FltF58', $FLOAT128, 'Public')).SetOffset(0x410) | |
($TypeBuilder.DefineField('FltF59', $FLOAT128, 'Public')).SetOffset(0x420) | |
($TypeBuilder.DefineField('FltF60', $FLOAT128, 'Public')).SetOffset(0x430) | |
($TypeBuilder.DefineField('FltF61', $FLOAT128, 'Public')).SetOffset(0x440) | |
($TypeBuilder.DefineField('FltF62', $FLOAT128, 'Public')).SetOffset(0x450) | |
($TypeBuilder.DefineField('FltF63', $FLOAT128, 'Public')).SetOffset(0x460) | |
($TypeBuilder.DefineField('FltF64', $FLOAT128, 'Public')).SetOffset(0x470) | |
($TypeBuilder.DefineField('FltF65', $FLOAT128, 'Public')).SetOffset(0x480) | |
($TypeBuilder.DefineField('FltF66', $FLOAT128, 'Public')).SetOffset(0x490) | |
($TypeBuilder.DefineField('FltF67', $FLOAT128, 'Public')).SetOffset(0x4a0) | |
($TypeBuilder.DefineField('FltF68', $FLOAT128, 'Public')).SetOffset(0x4b0) | |
($TypeBuilder.DefineField('FltF69', $FLOAT128, 'Public')).SetOffset(0x4c0) | |
($TypeBuilder.DefineField('FltF70', $FLOAT128, 'Public')).SetOffset(0x4d0) | |
($TypeBuilder.DefineField('FltF71', $FLOAT128, 'Public')).SetOffset(0x4e0) | |
($TypeBuilder.DefineField('FltF72', $FLOAT128, 'Public')).SetOffset(0x4f0) | |
($TypeBuilder.DefineField('FltF73', $FLOAT128, 'Public')).SetOffset(0x500) | |
($TypeBuilder.DefineField('FltF74', $FLOAT128, 'Public')).SetOffset(0x510) | |
($TypeBuilder.DefineField('FltF75', $FLOAT128, 'Public')).SetOffset(0x520) | |
($TypeBuilder.DefineField('FltF76', $FLOAT128, 'Public')).SetOffset(0x530) | |
($TypeBuilder.DefineField('FltF77', $FLOAT128, 'Public')).SetOffset(0x540) | |
($TypeBuilder.DefineField('FltF78', $FLOAT128, 'Public')).SetOffset(0x550) | |
($TypeBuilder.DefineField('FltF79', $FLOAT128, 'Public')).SetOffset(0x560) | |
($TypeBuilder.DefineField('FltF80', $FLOAT128, 'Public')).SetOffset(0x570) | |
($TypeBuilder.DefineField('FltF81', $FLOAT128, 'Public')).SetOffset(0x580) | |
($TypeBuilder.DefineField('FltF82', $FLOAT128, 'Public')).SetOffset(0x590) | |
($TypeBuilder.DefineField('FltF83', $FLOAT128, 'Public')).SetOffset(0x5a0) | |
($TypeBuilder.DefineField('FltF84', $FLOAT128, 'Public')).SetOffset(0x5b0) | |
($TypeBuilder.DefineField('FltF85', $FLOAT128, 'Public')).SetOffset(0x5c0) | |
($TypeBuilder.DefineField('FltF86', $FLOAT128, 'Public')).SetOffset(0x5d0) | |
($TypeBuilder.DefineField('FltF87', $FLOAT128, 'Public')).SetOffset(0x5e0) | |
($TypeBuilder.DefineField('FltF88', $FLOAT128, 'Public')).SetOffset(0x5f0) | |
($TypeBuilder.DefineField('FltF89', $FLOAT128, 'Public')).SetOffset(0x600) | |
($TypeBuilder.DefineField('FltF90', $FLOAT128, 'Public')).SetOffset(0x610) | |
($TypeBuilder.DefineField('FltF91', $FLOAT128, 'Public')).SetOffset(0x620) | |
($TypeBuilder.DefineField('FltF92', $FLOAT128, 'Public')).SetOffset(0x630) | |
($TypeBuilder.DefineField('FltF93', $FLOAT128, 'Public')).SetOffset(0x640) | |
($TypeBuilder.DefineField('FltF94', $FLOAT128, 'Public')).SetOffset(0x650) | |
($TypeBuilder.DefineField('FltF95', $FLOAT128, 'Public')).SetOffset(0x660) | |
($TypeBuilder.DefineField('FltF96', $FLOAT128, 'Public')).SetOffset(0x670) | |
($TypeBuilder.DefineField('FltF97', $FLOAT128, 'Public')).SetOffset(0x680) | |
($TypeBuilder.DefineField('FltF98', $FLOAT128, 'Public')).SetOffset(0x690) | |
($TypeBuilder.DefineField('FltF99', $FLOAT128, 'Public')).SetOffset(0x6a0) | |
($TypeBuilder.DefineField('FltF100', $FLOAT128, 'Public')).SetOffset(0x6b0) | |
($TypeBuilder.DefineField('FltF101', $FLOAT128, 'Public')).SetOffset(0x6c0) | |
($TypeBuilder.DefineField('FltF102', $FLOAT128, 'Public')).SetOffset(0x6d0) | |
($TypeBuilder.DefineField('FltF103', $FLOAT128, 'Public')).SetOffset(0x6e0) | |
($TypeBuilder.DefineField('FltF104', $FLOAT128, 'Public')).SetOffset(0x6f0) | |
($TypeBuilder.DefineField('FltF105', $FLOAT128, 'Public')).SetOffset(0x700) | |
($TypeBuilder.DefineField('FltF106', $FLOAT128, 'Public')).SetOffset(0x710) | |
($TypeBuilder.DefineField('FltF107', $FLOAT128, 'Public')).SetOffset(0x720) | |
($TypeBuilder.DefineField('FltF108', $FLOAT128, 'Public')).SetOffset(0x730) | |
($TypeBuilder.DefineField('FltF109', $FLOAT128, 'Public')).SetOffset(0x740) | |
($TypeBuilder.DefineField('FltF110', $FLOAT128, 'Public')).SetOffset(0x750) | |
($TypeBuilder.DefineField('FltF111', $FLOAT128, 'Public')).SetOffset(0x760) | |
($TypeBuilder.DefineField('FltF112', $FLOAT128, 'Public')).SetOffset(0x770) | |
($TypeBuilder.DefineField('FltF113', $FLOAT128, 'Public')).SetOffset(0x780) | |
($TypeBuilder.DefineField('FltF114', $FLOAT128, 'Public')).SetOffset(0x790) | |
($TypeBuilder.DefineField('FltF115', $FLOAT128, 'Public')).SetOffset(0x7a0) | |
($TypeBuilder.DefineField('FltF116', $FLOAT128, 'Public')).SetOffset(0x7b0) | |
($TypeBuilder.DefineField('FltF117', $FLOAT128, 'Public')).SetOffset(0x7c0) | |
($TypeBuilder.DefineField('FltF118', $FLOAT128, 'Public')).SetOffset(0x7d0) | |
($TypeBuilder.DefineField('FltF119', $FLOAT128, 'Public')).SetOffset(0x7e0) | |
($TypeBuilder.DefineField('FltF120', $FLOAT128, 'Public')).SetOffset(0x7f0) | |
($TypeBuilder.DefineField('FltF121', $FLOAT128, 'Public')).SetOffset(0x800) | |
($TypeBuilder.DefineField('FltF122', $FLOAT128, 'Public')).SetOffset(0x810) | |
($TypeBuilder.DefineField('FltF123', $FLOAT128, 'Public')).SetOffset(0x820) | |
($TypeBuilder.DefineField('FltF124', $FLOAT128, 'Public')).SetOffset(0x830) | |
($TypeBuilder.DefineField('FltF125', $FLOAT128, 'Public')).SetOffset(0x840) | |
($TypeBuilder.DefineField('FltF126', $FLOAT128, 'Public')).SetOffset(0x850) | |
($TypeBuilder.DefineField('FltF127', $FLOAT128, 'Public')).SetOffset(0x860) | |
($TypeBuilder.DefineField('StFPSR', [UInt64], 'Public')).SetOffset(0x870) | |
($TypeBuilder.DefineField('IntGp', [UInt64], 'Public')).SetOffset(0x870) | |
($TypeBuilder.DefineField('IntT0', [UInt64], 'Public')).SetOffset(0x880) | |
($TypeBuilder.DefineField('IntT1', [UInt64], 'Public')).SetOffset(0x888) | |
($TypeBuilder.DefineField('IntS0', [UInt64], 'Public')).SetOffset(0x890) | |
($TypeBuilder.DefineField('IntS1', [UInt64], 'Public')).SetOffset(0x898) | |
($TypeBuilder.DefineField('IntS2', [UInt64], 'Public')).SetOffset(0x8a0) | |
($TypeBuilder.DefineField('IntS3', [UInt64], 'Public')).SetOffset(0x8a8) | |
($TypeBuilder.DefineField('IntV0', [UInt64], 'Public')).SetOffset(0x8b0) | |
($TypeBuilder.DefineField('IntT2', [UInt64], 'Public')).SetOffset(0x8b8) | |
($TypeBuilder.DefineField('IntT3', [UInt64], 'Public')).SetOffset(0x8c0) | |
($TypeBuilder.DefineField('IntT4', [UInt64], 'Public')).SetOffset(0x8c8) | |
($TypeBuilder.DefineField('IntSp', [UInt64], 'Public')).SetOffset(0x8d0) | |
($TypeBuilder.DefineField('IntTeb', [UInt64], 'Public')).SetOffset(0x8d8) | |
($TypeBuilder.DefineField('IntT5', [UInt64], 'Public')).SetOffset(0x8e0) | |
($TypeBuilder.DefineField('IntT6', [UInt64], 'Public')).SetOffset(0x8e8) | |
($TypeBuilder.DefineField('IntT7', [UInt64], 'Public')).SetOffset(0x8f0) | |
($TypeBuilder.DefineField('IntT8', [UInt64], 'Public')).SetOffset(0x8f8) | |
($TypeBuilder.DefineField('IntT9', [UInt64], 'Public')).SetOffset(0x900) | |
($TypeBuilder.DefineField('IntT10', [UInt64], 'Public')).SetOffset(0x908) | |
($TypeBuilder.DefineField('IntT11', [UInt64], 'Public')).SetOffset(0x910) | |
($TypeBuilder.DefineField('IntT12', [UInt64], 'Public')).SetOffset(0x918) | |
($TypeBuilder.DefineField('IntT13', [UInt64], 'Public')).SetOffset(0x920) | |
($TypeBuilder.DefineField('IntT14', [UInt64], 'Public')).SetOffset(0x928) | |
($TypeBuilder.DefineField('IntT15', [UInt64], 'Public')).SetOffset(0x930) | |
($TypeBuilder.DefineField('IntT16', [UInt64], 'Public')).SetOffset(0x938) | |
($TypeBuilder.DefineField('IntT17', [UInt64], 'Public')).SetOffset(0x940) | |
($TypeBuilder.DefineField('IntT18', [UInt64], 'Public')).SetOffset(0x948) | |
($TypeBuilder.DefineField('IntT19', [UInt64], 'Public')).SetOffset(0x950) | |
($TypeBuilder.DefineField('IntT20', [UInt64], 'Public')).SetOffset(0x958) | |
($TypeBuilder.DefineField('IntT21', [UInt64], 'Public')).SetOffset(0x960) | |
($TypeBuilder.DefineField('IntT22', [UInt64], 'Public')).SetOffset(0x968) | |
($TypeBuilder.DefineField('IntNats', [UInt64], 'Public')).SetOffset(0x970) | |
($TypeBuilder.DefineField('Preds', [UInt64], 'Public')).SetOffset(0x978) | |
($TypeBuilder.DefineField('BrRp', [UInt64], 'Public')).SetOffset(0x980) | |
($TypeBuilder.DefineField('BrS0', [UInt64], 'Public')).SetOffset(0x988) | |
($TypeBuilder.DefineField('BrS1', [UInt64], 'Public')).SetOffset(0x990) | |
($TypeBuilder.DefineField('BrS2', [UInt64], 'Public')).SetOffset(0x998) | |
($TypeBuilder.DefineField('BrS3', [UInt64], 'Public')).SetOffset(0x9a0) | |
($TypeBuilder.DefineField('BrS4', [UInt64], 'Public')).SetOffset(0x9a8) | |
($TypeBuilder.DefineField('BrT0', [UInt64], 'Public')).SetOffset(0x9b0) | |
($TypeBuilder.DefineField('BrT1', [UInt64], 'Public')).SetOffset(0x9b8) | |
($TypeBuilder.DefineField('ApUNAT', [UInt64], 'Public')).SetOffset(0x9c0) | |
($TypeBuilder.DefineField('ApLC', [UInt64], 'Public')).SetOffset(0x9c8) | |
($TypeBuilder.DefineField('ApEC', [UInt64], 'Public')).SetOffset(0x9d0) | |
($TypeBuilder.DefineField('ApCCV', [UInt64], 'Public')).SetOffset(0x9d8) | |
($TypeBuilder.DefineField('ApDCR', [UInt64], 'Public')).SetOffset(0x9e0) | |
($TypeBuilder.DefineField('RsPFS', [UInt64], 'Public')).SetOffset(0x9e8) | |
($TypeBuilder.DefineField('RsBSP', [UInt64], 'Public')).SetOffset(0x9f0) | |
($TypeBuilder.DefineField('RsBSPSTORE', [UInt64], 'Public')).SetOffset(0x9f8) | |
($TypeBuilder.DefineField('RsRSC', [UInt64], 'Public')).SetOffset(0xa00) | |
($TypeBuilder.DefineField('RsRNAT', [UInt64], 'Public')).SetOffset(0xa08) | |
($TypeBuilder.DefineField('StIPSR', [UInt64], 'Public')).SetOffset(0xa10) | |
($TypeBuilder.DefineField('StIIP', [UInt64], 'Public')).SetOffset(0xa18) | |
($TypeBuilder.DefineField('StIFS', [UInt64], 'Public')).SetOffset(0xa20) | |
($TypeBuilder.DefineField('StFCR', [UInt64], 'Public')).SetOffset(0xa28) | |
($TypeBuilder.DefineField('Eflag', [UInt64], 'Public')).SetOffset(0xa30) | |
($TypeBuilder.DefineField('SegCSD', [UInt64], 'Public')).SetOffset(0xa38) | |
($TypeBuilder.DefineField('SegSSD', [UInt64], 'Public')).SetOffset(0xa40) | |
($TypeBuilder.DefineField('Cflag', [UInt64], 'Public')).SetOffset(0xa48) | |
($TypeBuilder.DefineField('StFSR', [UInt64], 'Public')).SetOffset(0xa50) | |
($TypeBuilder.DefineField('StFIR', [UInt64], 'Public')).SetOffset(0xa58) | |
($TypeBuilder.DefineField('StFDR', [UInt64], 'Public')).SetOffset(0xa60) | |
($TypeBuilder.DefineField('UNUSEDPACK', [UInt64], 'Public')).SetOffset(0xa68) | |
$Global:IA64_CONTEXT = $TypeBuilder.CreateType() | |
#endregion IA64_CONTEXT | |
#endregion STRUCTS | |
function local:func { | |
# A helper function used to reduce typing while defining function prototypes for Add-Win32Type. by @mattifestation | |
Param ( | |
[Parameter(Position = 0, Mandatory = $true)] | |
[String]$DllName, | |
[Parameter(Position = 1, Mandatory = $true)] | |
[string]$FunctionName, | |
[Parameter(Position = 2, Mandatory = $true)] | |
[Type]$ReturnType, | |
[Parameter(Position = 3)] | |
[Type[]]$ParameterTypes, | |
[Parameter(Position = 4)] | |
[Runtime.InteropServices.CallingConvention]$NativeCallingConvention, | |
[Parameter(Position = 5)] | |
[Runtime.InteropServices.CharSet]$Charset, | |
[Parameter()] | |
[Switch]$SetLastError | |
) | |
$Properties = @{ | |
DllName = $DllName | |
FunctionName = $FunctionName | |
ReturnType = $ReturnType | |
} | |
if ($ParameterTypes) { $Properties['ParameterTypes'] = $ParameterTypes } | |
if ($NativeCallingConvention) { $Properties['NativeCallingConvention'] = $NativeCallingConvention } | |
if ($Charset) { $Properties['Charset'] = $Charset } | |
if ($SetLastError) { $Properties['SetLastError'] = $SetLastError } | |
New-Object -TypeName PSObject -Property $Properties | |
} | |
function local:Add-Win32Type { | |
# A helper function used to reduce typing while defining function prototypes for Add-Win32Type. by @mattifestation | |
[OutputType([Hashtable])] | |
Param( | |
[Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)] | |
[String]$DllName, | |
[Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)] | |
[String]$FunctionName, | |
[Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)] | |
[Type]$ReturnType, | |
[Parameter(ValueFromPipelineByPropertyName = $true)] | |
[Type[]]$ParameterTypes, | |
[Parameter(ValueFromPipelineByPropertyName = $true)] | |
[Runtime.InteropServices.CallingConvention]$NativeCallingConvention = [Runtime.InteropServices.CallingConvention]::StdCall, | |
[Parameter(ValueFromPipelineByPropertyName = $true)] | |
[Runtime.InteropServices.CharSet]$Charset = [Runtime.InteropServices.CharSet]::Auto, | |
[Parameter(ValueFromPipelineByPropertyName = $true)] | |
[Switch]$SetLastError, | |
[Parameter(Mandatory = $true)] | |
[ValidateScript({($_ -is [Reflection.Emit.ModuleBuilder]) -or ($_ -is [Reflection.Assembly])})]$Module, | |
[ValidateNotNull()] | |
[String]$Namespace = '' | |
) | |
BEGIN { $TypeHash = @{} } | |
PROCESS { | |
if ($Module -is [Reflection.Assembly]) | |
{ | |
if ($Namespace) | |
{ | |
$TypeHash[$DllName] = $Module.GetType("$Namespace.$DllName") | |
} | |
else | |
{ | |
$TypeHash[$DllName] = $Module.GetType($DllName) | |
} | |
} | |
else # Define one type for each DLL | |
{ | |
if (!$TypeHash.ContainsKey($DllName)) | |
{ | |
if ($Namespace) | |
{ | |
$TypeHash[$DllName] = $Module.DefineType("$Namespace.$DllName", 'Public,BeforeFieldInit') | |
} | |
else | |
{ | |
$TypeHash[$DllName] = $Module.DefineType($DllName, 'Public,BeforeFieldInit') | |
} | |
} | |
$Method = $TypeHash[$DllName].DefineMethod($FunctionName, 'Public,Static,PinvokeImpl', $ReturnType, $ParameterTypes) | |
# Make each ByRef parameter an Out parameter | |
$i = 1 | |
foreach($Parameter in $ParameterTypes) | |
{ | |
if ($Parameter.IsByRef) | |
{ | |
[void]$Method.DefineParameter($i, 'Out', $null) | |
} | |
$i++ | |
} | |
$DllImport = [Runtime.InteropServices.DllImportAttribute] | |
$SetLastErrorField = $DllImport.GetField('SetLastError') | |
$CallingConventionField = $DllImport.GetField('CallingConvention') | |
$CharsetField = $DllImport.GetField('CharSet') | |
if ($SetLastError) | |
{ | |
$SLEValue = $true | |
} | |
else | |
{ | |
$SLEValue = $false | |
} | |
# Equivalent to C# version of [DllImport(DllName)] | |
$Constructor = [Runtime.InteropServices.DllImportAttribute].GetConstructor([String]) | |
$DllImportAttribute = New-Object -TypeName Reflection.Emit.CustomAttributeBuilder -ArgumentList ($Constructor, $DllName, [Reflection.PropertyInfo[]] @(), [Object[]] @(), [Reflection.FieldInfo[]] @($SetLastErrorField, $CallingConventionField, $CharsetField), [Object[]] @($SLEValue, ([Runtime.InteropServices.CallingConvention] $NativeCallingConvention), ([Runtime.InteropServices.CharSet] $Charset))) | |
$Method.SetCustomAttribute($DllImportAttribute) | |
} | |
} | |
END { | |
if ($Module -is [Reflection.Assembly]) | |
{ | |
return $TypeHash | |
} | |
$ReturnTypes = @{} | |
foreach ($Key in $TypeHash.Keys) | |
{ | |
$Type = $TypeHash[$Key].CreateType() | |
$ReturnTypes[$Key] = $Type | |
} | |
return $ReturnTypes | |
} | |
} | |
function local:Get-DelegateType { | |
Param ( | |
[OutputType([Type])] | |
[Parameter( Position = 0)] | |
[Type[]]$Parameters = (New-Object -TypeName Type[] -ArgumentList (0)), | |
[Parameter( Position = 1 )] | |
[Type]$ReturnType = [Void] | |
) | |
$Domain = [AppDomain]::CurrentDomain | |
$DynAssembly = New-Object -TypeName System.Reflection.AssemblyName -ArgumentList ('ReflectedDelegate') | |
$AssemblyBuilder = $Domain.DefineDynamicAssembly($DynAssembly, [Reflection.Emit.AssemblyBuilderAccess]::Run) | |
$ModuleBuilder = $AssemblyBuilder.DefineDynamicModule('InMemoryModule', $false) | |
$TypeBuilder = $ModuleBuilder.DefineType('MyDelegateType', 'Class, Public, Sealed, AnsiClass, AutoClass', [MulticastDelegate]) | |
$ConstructorBuilder = $TypeBuilder.DefineConstructor('RTSpecialName, HideBySig, Public', [Reflection.CallingConventions]::Standard, $Parameters) | |
$ConstructorBuilder.SetImplementationFlags('Runtime, Managed') | |
$MethodBuilder = $TypeBuilder.DefineMethod('Invoke', 'Public, HideBySig, NewSlot, Virtual', $ReturnType, $Parameters) | |
$MethodBuilder.SetImplementationFlags('Runtime, Managed') | |
$TypeBuilder.CreateType() | |
} | |
$FunctionDefinitions = @( | |
#Kernel32 | |
(func kernel32 OpenProcess ([IntPtr]) @([Int32], [Bool], [Int32]) -SetLastError), | |
(func kernel32 OpenThread ([IntPtr]) @([Int32], [Bool], [Int32]) -SetLastError), | |
(func kernel32 CloseHandle ([Bool]) @([IntPtr]) -SetLastError), | |
(func kernel32 Wow64SuspendThread ([UInt32]) @([IntPtr]) -SetLastError), | |
(func kernel32 SuspendThread ([UInt32]) @([IntPtr]) -SetLastError), | |
(func kernel32 ResumeThread ([UInt32]) @([IntPtr]) -SetLastError), | |
(func kernel32 Wow64GetThreadContext ([Bool]) @([IntPtr], [IntPtr]) -SetLastError), | |
(func kernel32 GetThreadContext ([Bool]) @([IntPtr], [IntPtr]) -SetLastError), | |
(func kernel32 GetSystemInfo ([Void]) @($SYSTEM_INFO.MakeByRefType()) -SetLastError), | |
(func kernel32 IsWow64Process ([Bool]) @([IntPtr], [Bool].MakeByRefType()) -SetLastError), | |
#Psapi | |
(func psapi EnumProcessModulesEx ([Bool]) @([IntPtr], [IntPtr].MakeArrayType(), [UInt32], [UInt32].MakeByRefType(), [Int32]) -SetLastError), | |
(func psapi GetModuleInformation ([Bool]) @([IntPtr], [IntPtr], $MODULE_INFO.MakeByRefType(), [UInt32]) -SetLastError), | |
(func psapi GetModuleBaseNameW ([UInt32]) @([IntPtr], [IntPtr], [Text.StringBuilder], [Int32]) -Charset Unicode -SetLastError), | |
(func psapi GetModuleFileNameExW ([UInt32]) @([IntPtr], [IntPtr], [Text.StringBuilder], [Int32]) -Charset Unicode -SetLastError), | |
(func psapi GetMappedFileNameW ([UInt32]) @([IntPtr], [IntPtr], [Text.StringBuilder], [Int32]) -Charset Unicode -SetLastError), | |
#DbgHelp | |
(func dbghelp SymInitialize ([Bool]) @([IntPtr], [String], [Bool]) -SetLastError), | |
(func dbghelp SymCleanup ([Bool]) @([IntPtr]) -SetLastError), | |
(func dbghelp SymFunctionTableAccess64 ([IntPtr]) @([IntPtr], [UInt64]) -SetLastError), | |
(func dbghelp SymGetModuleBase64 ([UInt64]) @([IntPtr], [UInt64]) -SetLastError), | |
(func dbghelp SymGetSymFromAddr64 ([Bool]) @([IntPtr], [UInt64], [UInt64], [IntPtr]) -SetLastError), | |
(func dbghelp SymLoadModuleEx ([UInt64]) @([IntPtr], [IntPtr], [String], [String], [IntPtr], [Int32], [IntPtr], [Int32]) -SetLastError), | |
(func dbghelp StackWalk64 ([Bool]) @([UInt32], [IntPtr], [IntPtr], [IntPtr], [IntPtr], [MulticastDelegate], [MulticastDelegate], [MulticastDelegate], [MulticastDelegate])) | |
) | |
$Types = $FunctionDefinitions | Add-Win32Type -Module $ModuleBuilder -Namespace 'Win32' | |
$Global:Kernel32 = $Types['kernel32'] | |
$Global:Psapi = $Types['psapi'] | |
$Global:Dbghelp = $Types['dbghelp'] | |
function local:Trace-Thread { | |
Param ( | |
[Parameter()] | |
[IntPtr]$ProcessHandle, | |
[Parameter()] | |
[Int]$ThreadId, | |
[Parameter()] | |
[Int]$ProcessId | |
) | |
# Get Thread handle | |
if (($hThread = $Kernel32::OpenThread(0x1F03FF, $false, $ThreadId)) -eq 0) { | |
Write-Error "Unable to open handle for thread $ThreadId." | |
return | |
} | |
#region HELPERS | |
function local:Get-SystemInfo { | |
$SystemInfo = [Activator]::CreateInstance($SYSTEM_INFO) | |
[void]$Kernel32::GetSystemInfo([ref]$SystemInfo) | |
Write-Output -InputObject $SystemInfo | |
} | |
function local:Import-ModuleSymbols { | |
Param ( | |
[Parameter(Mandatory = $true)] | |
[IntPtr]$ProcessHandle | |
) | |
#Initialize parameters for EPM | |
$cbNeeded = 0 | |
if (!$Psapi::EnumProcessModulesEx($ProcessHandle, $null, 0, [ref]$cbNeeded, 3)) { | |
Write-Error 'Failed to get buffer size for module handles.' | |
return | |
} | |
$ArraySize = $cbNeeded / [IntPtr]::Size | |
$hModules = New-Object -TypeName IntPtr[] -ArgumentList $ArraySize | |
$cb = $cbNeeded | |
if (!$Psapi::EnumProcessModulesEx($ProcessHandle, $hModules, $cb, [ref]$cbNeeded, 3)) { | |
Write-Error 'Failed to get module handles for process.' | |
return | |
} | |
for ($i = 0; $i -lt $ArraySize; $i++) | |
{ | |
$ModInfo = [Activator]::CreateInstance($MODULE_INFO) | |
$lpFileName = New-Object Text.StringBuilder(256) | |
$lpModuleBaseName = New-Object Text.StringBuilder(32) | |
if (!$Psapi::GetModuleFileNameExW($ProcessHandle, $hModules[$i], $lpFileName, $lpFileName.Capacity)) { | |
Write-Error 'Failed to get module file name.' | |
continue | |
} | |
if (!$Psapi::GetModuleBaseNameW($ProcessHandle, $hModules[$i], $lpModuleBaseName, $lpModuleBaseName.Capacity)) { | |
Write-Error "Failed to get module base name for $($lpFileName.ToString())." | |
continue | |
} | |
if (!$Psapi::GetModuleInformation($ProcessHandle, $hModules[$i], [ref]$ModInfo, [Runtime.InteropServices.Marshal]::SizeOf($ModInfo))) { | |
Write-Error "Failed to get module information for module $($lpModuleBaseName.ToString())." | |
continue | |
} | |
[void]$Dbghelp::SymLoadModuleEx($ProcessHandle, [IntPtr]::Zero, $lpFileName.ToString(), $lpModuleBaseName.ToString(), $ModInfo.lpBaseOfDll, [Int32]$ModInfo.SizeOfImage, [IntPtr]::Zero, 0) | |
} | |
Remove-Variable hModules | |
} | |
function local:Convert-UIntToInt { | |
Param( | |
[Parameter(Position = 0, Mandatory = $true)] | |
[UInt64]$Value | |
) | |
[Byte[]]$ValueBytes = [BitConverter]::GetBytes($Value) | |
return ([BitConverter]::ToInt64($ValueBytes, 0)) | |
} | |
function local:Initialize-Stackframe { | |
Param ( | |
[Parameter(Mandatory = $true)] | |
$OffsetPC, | |
[Parameter(Mandatory = $true)] | |
$OffsetFrame, | |
[Parameter(Mandatory = $true)] | |
$OffsetStack, | |
[Parameter()] | |
$OffsetBStore | |
) | |
$StackFrame = [Activator]::CreateInstance($STACKFRAME64) | |
$Addr64 = [Activator]::CreateInstance($ADDRESS64) | |
$Addr64.Mode = 0x03 # Flat | |
$Addr64.Offset = $OffsetPC | |
$StackFrame.AddrPC = $Addr64 | |
$Addr64.Offset = $OffsetFrame | |
$StackFrame.AddrFrame = $Addr64 | |
$Addr64.Offset = $OffsetStack | |
$StackFrame.AddrStack = $Addr64 | |
$Addr64.Offset = $OffsetBStore | |
$StackFrame.AddrBStore = $Addr64 | |
Write-Output -InputObject $StackFrame | |
} | |
function local:Get-SymbolFromAddress { | |
Param ( | |
[Parameter(Mandatory = $true)] | |
[IntPtr]$ProcessHandle, | |
[Parameter(Mandatory = $true)] | |
$Address | |
) | |
# Initialize params for SymGetSymFromAddr64 | |
$Symbol = [Activator]::CreateInstance($IMAGEHLP_SYMBOLW64) | |
$Symbol.SizeOfStruct = [Runtime.InteropServices.Marshal]::SizeOf($Symbol) | |
$Symbol.MaxNameLength = 32 | |
$lpSymbol = [Runtime.InteropServices.Marshal]::AllocHGlobal($Symbol.SizeOfStruct) | |
[Runtime.InteropServices.Marshal]::StructureToPtr($Symbol, $lpSymbol, $false) | |
[void]$Dbghelp::SymGetSymFromAddr64($ProcessHandle, $Address, 0, $lpSymbol) | |
$Symbol = [Runtime.InteropServices.Marshal]::PtrToStructure($lpSymbol, [Type]$IMAGEHLP_SYMBOLW64) | |
[Runtime.InteropServices.Marshal]::FreeHGlobal($lpSymbol) | |
Write-Output -InputObject $Symbol | |
} | |
#endregion HELPERS | |
$SymFunctionTableAccess64Delegate = Get-DelegateType @([IntPtr], [UInt64]) ([IntPtr]) | |
$Action = { | |
Param([IntPtr]$ProcessHandle, [UInt64]$AddrBase) $Dbghelp::SymFunctionTableAccess64($ProcessHandle, $AddrBase) | |
} | |
$FunctionTableAccess = $Action -as $SymFunctionTableAccess64Delegate | |
$SymGetModuleBase64Delegate = Get-DelegateType @([IntPtr], [UInt64]) ([UInt64]) | |
$Action = { | |
Param([IntPtr]$ProcessHandle, [UInt64]$Address) $Dbghelp::SymGetModuleBase64($ProcessHandle, $Address) | |
} | |
$GetModuleBase = $Action -as $SymGetModuleBase64Delegate | |
# Initialize some things | |
$lpContextRecord = [IntPtr]::Zero | |
$StackFrame = [Activator]::CreateInstance($STACKFRAME64) | |
$ImageType = 0 | |
$Wow64 = $false | |
$SystemInfo = Get-SystemInfo | |
# If not x86 processor, check for Wow64 (x86) process | |
if ($SystemInfo.ProcessorArchitecture -ne 0) { | |
if (!$Kernel32::IsWow64Process($ProcessHandle, [ref]$Wow64)) { Write-Error 'IsWow64Process failure.' } | |
} | |
if ($Wow64) | |
{ | |
$ImageType = 0x014C # I386/x86 | |
Import-ModuleSymbols -ProcessHandle $ProcessHandle | |
# Initialize x86 context in memory | |
$ContextRecord = [Activator]::CreateInstance($X86_CONTEXT) | |
$ContextRecord.ContextFlags = 0x1003F #All | |
$lpContextRecord = [Runtime.InteropServices.Marshal]::AllocHGlobal([Runtime.InteropServices.Marshal]::SizeOf($ContextRecord)) | |
[Runtime.InteropServices.Marshal]::StructureToPtr($ContextRecord, $lpContextRecord, $false) | |
if ($Kernel32::Wow64SuspendThread($hThread) -eq -1) { Write-Error "Unable to suspend thread $ThreadId." } | |
if (!$Kernel32::Wow64GetThreadContext($hThread, $lpContextRecord)) { Write-Error "Unable tof get context of thread $ThreadId." } | |
$ContextRecord = [Runtime.InteropServices.Marshal]::PtrToStructure($lpContextRecord, [Type]$X86_CONTEXT) | |
$StackFrame = Initialize-Stackframe $ContextRecord.Eip $ContextRecord.Esp $ContextRecord.Ebp $null | |
} | |
# If x86 processor | |
elseif ($SystemInfo.ProcessorArchitecture -eq 0) | |
{ | |
$ImageType = 0x014C # I386/x86 | |
Import-ModuleSymbols -ProcessHandle $ProcessHandle | |
# Initialize x86 context in memory | |
$ContextRecord = [Activator]::CreateInstance($X86_CONTEXT) | |
$ContextRecord.ContextFlags = 0x1003F #All | |
$lpContextRecord = [Runtime.InteropServices.Marshal]::AllocHGlobal([Runtime.InteropServices.Marshal]::SizeOf($ContextRecord)) | |
[Runtime.InteropServices.Marshal]::StructureToPtr($ContextRecord, $lpContextRecord, $false) | |
if ($Kernel32::SuspendThread($hThread) -eq -1) { Write-Error "Unable to suspend thread $ThreadId." } | |
if (!$Kernel32::GetThreadContext($hThread, $lpContextRecord)) { Write-Error "Unable tof get context of thread $ThreadId." } | |
$ContextRecord = [Runtime.InteropServices.Marshal]::PtrToStructure($lpContextRecord, [Type]$X86_CONTEXT) | |
$StackFrame = Initialize-Stackframe $ContextRecord.Eip $ContextRecord.Esp $ContextRecord.Ebp $null | |
} | |
# If AMD64 processor | |
elseif ($SystemInfo.ProcessorArchitecture -eq 9) | |
{ | |
$ImageType = 0x8664 # AMD64, interesting that MSFT chose the hex 8664 i.e. x86_64 for this constant... | |
Import-ModuleSymbols -ProcessHandle $ProcessHandle | |
#Initialize AMD64 context in memory | |
$ContextRecord = [Activator]::CreateInstance($AMD64_CONTEXT) | |
$ContextRecord.ContextFlags = 0x10003B #All | |
$lpContextRecord = [Runtime.InteropServices.Marshal]::AllocHGlobal([Runtime.InteropServices.Marshal]::SizeOf($ContextRecord)) | |
[Runtime.InteropServices.Marshal]::StructureToPtr($ContextRecord, $lpContextRecord, $false) | |
if ($Kernel32::SuspendThread($hThread) -eq -1) { Write-Error "Unable to suspend thread $ThreadId." } | |
if (!$Kernel32::GetThreadContext($hThread, $lpContextRecord)) { Write-Error "Unable tof get context of thread $ThreadId." } | |
$ContextRecord = [Runtime.InteropServices.Marshal]::PtrToStructure($lpContextRecord, [Type]$AMD64_CONTEXT) | |
$StackFrame = Initialize-Stackframe $ContextRecord.Rip $ContextRecord.Rsp $ContextRecord.Rsp $null | |
} | |
#If IA64 processor | |
elseif ($SystemInfo.ProcessorArchitecture -eq 6) | |
{ | |
$ImageType = 0x0200 # IA64 | |
Import-ModuleSymbols -ProcessHandle $ProcessHandle | |
#Initialize IA64 context in memory | |
$ContextRecord = [Activator]::CreateInstance($IA64_CONTEXT) | |
$ContextRecord.ContextFlags = 0x8003D #All | |
$lpContextRecord = [Runtime.InteropServices.Marshal]::AllocHGlobal([Runtime.InteropServices.Marshal]::SizeOf($ContextRecord)) | |
[Runtime.InteropServices.Marshal]::StructureToPtr($ContextRecord, $lpContextRecord, $false) | |
if ($Kernel32::SuspendThread($hThread) -eq -1) { Write-Error "Unable to suspend thread $ThreadId." } | |
if (!$Kernel32::GetThreadContext($hThread, $lpContextRecord)) { Write-Error "Unable tof get context of thread $ThreadId." } | |
$ContextRecord = [Runtime.InteropServices.Marshal]::PtrToStructure($lpContextRecord, [Type]$IA64_CONTEXT) | |
$StackFrame = Initialize-Stackframe $ContextRecord.StIIP $ContextRecord.IntSp $ContextRecord.RsBSP $ContextRecord.IntSp | |
} | |
$SystemInfo = $null | |
# Marshal Stackframe to pointer | |
$lpStackFrame = [Runtime.InteropServices.Marshal]::AllocHGlobal([Runtime.InteropServices.Marshal]::SizeOf($StackFrame)) | |
[Runtime.InteropServices.Marshal]::StructureToPtr($StackFrame, $lpStackFrame, $false) | |
# Walk the Stack | |
do { | |
# Get Stackframe | |
if (!$Dbghelp::StackWalk64($ImageType, $ProcessHandle, $hThread, $lpStackFrame, $lpContextRecord, $null, $FunctionTableAccess, $GetModuleBase, $null)) { | |
Write-Error "Unable to get stackframe for thread $ThreadId." | |
} | |
$StackFrame = [Runtime.InteropServices.Marshal]::PtrToStructure($lpStackFrame, [Type]$STACKFRAME64) | |
$MappedFile = New-Object Text.StringBuilder(256) | |
[void]$Psapi::GetMappedFileNameW($ProcessHandle, [IntPtr](Convert-UIntToInt $StackFrame.AddrPC.Offset), $MappedFile, $MappedFile.Capacity) | |
$Symbol = Get-SymbolFromAddress -ProcessHandle $ProcessHandle -Address $StackFrame.AddrPC.Offset | |
$SymbolName = (([String]$Symbol.Name).Replace(' ','')).TrimEnd([Byte]0) | |
$Properties = @{ | |
ProcessId = $ProcessId | |
ThreadId = $ThreadId | |
AddrPC = $StackFrame.AddrPC.Offset | |
AddrReturn = $StackFrame.AddrReturn.Offset | |
Symbol = $SymbolName | |
MappedFile = $MappedFile | |
} | |
New-Object -TypeName PSObject -Property $Properties | |
} until ($StackFrame.AddrReturn.Offset -eq 0) # End of stack reached | |
# Cleanup | |
[Runtime.InteropServices.Marshal]::FreeHGlobal($lpStackFrame) | |
[Runtime.InteropServices.Marshal]::FreeHGlobal($lpContextRecord) | |
if ($Kernel32::ResumeThread($hThread) -eq -1) { Write-Error "Unable to resume thread $ThreadId." } | |
if (!$Kernel32::CloseHandle.Invoke($hThread)) { Write-Error "Unable to close handle for thread $ThreadId." } | |
} | |
if ($Name -ne '') | |
{ | |
foreach ($Process in (Get-Process -Name $Name)) | |
{ | |
if (($ProcessHandle = $Kernel32::OpenProcess(0x1F0FFF, $false, $Process.Id)) -eq 0) { | |
Write-Error -Message "Unable to open handle for process $($Process.Id)... Moving on." | |
continue | |
} | |
if (!$Dbghelp::SymInitialize($ProcessHandle, $null, $false)) { | |
Write-Error "Unable to initialize symbol handler for process $($Process.Id).... Quitting." | |
if (!$Kernel32::CloseHandle.Invoke($ProcessHandle)) { Write-Error "Unable to close handle for process $($Process.Id)." } | |
break | |
} | |
$Process.Threads | ForEach-Object -Process { Trace-Thread -ProcessHandle $ProcessHandle -ThreadId $_.Id -ProcessId $Process.Id } | |
if (!$Dbghelp::SymCleanup($ProcessHandle)) { Write-Error "Unable to cleanup symbol resources for process $($Process.Id)." } | |
if (!$Kernel32::CloseHandle.Invoke($ProcessHandle)) { Write-Error "Unable to close handle for process $($Process.Id)." } | |
[GC]::Collect() | |
} | |
} | |
elseif ($Id -ne -1) | |
{ | |
$Process = Get-Process -Id $Id | |
if (($ProcessHandle = $Kernel32::OpenProcess(0x1F0FFF, $false, $Process.Id)) -eq 0) { | |
Write-Error -Message "Unable to open handle for process $($Process.Id)... Quitting." | |
break | |
} | |
if (!$Dbghelp::SymInitialize($ProcessHandle, $null, $false)) { | |
Write-Error "Unable to initialize symbol handler for process $($Process.Id).... Quitting." | |
if (!$Kernel32::CloseHandle.Invoke($ProcessHandle)) { Write-Error "Unable to close handle for process $($Process.Id)." } | |
break | |
} | |
$Process.Threads | ForEach-Object -Process { Trace-Thread -ProcessHandle $ProcessHandle -ThreadId $_.Id -ProcessId $Process.Id } | |
if (!$Dbghelp::SymCleanup($ProcessHandle)) { Write-Error "Unable to cleanup symbol resources for process $($Process.Id)." } | |
if (!$Kernel32::CloseHandle.Invoke($ProcessHandle)) { Write-Error "Unable to close handle for process $($Process.Id)." } | |
[GC]::Collect() | |
} | |
}# End of ScriptBlock | |
if ($PSBoundParameters['ComputerName']) { $ReturnedObjects = Invoke-Command -ComputerName $ComputerName -ScriptBlock $RemoteScriptBlock -ArgumentList @($Name, $Id) } | |
else { $ReturnedObjects = Invoke-Command -ScriptBlock $ScriptBlock -ArgumentList @($Name, $Id) } | |
if($ReturnedObjects) { | |
if($PSBoundParameters['CSV']) { $ReturnedObjects | Export-Csv -Path $OutputFilePath -Append -NoTypeInformation -ErrorAction SilentlyContinue } | |
else { Write-Output -InputObject $ReturnedObjects } | |
} | |
[GC]::Collect() | |
$ScriptTime.Stop() | |
Write-Verbose -Message "Done, execution time: $($ScriptTime.Elapsed)" | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment