125 lines
5 KiB
C#
125 lines
5 KiB
C#
// Decompiled with JetBrains decompiler
|
|
// Type: Terraria.Utilities.CrashDump
|
|
// Assembly: Terraria, Version=1.4.0.5, Culture=neutral, PublicKeyToken=null
|
|
// MVID: 67F9E73E-0A81-4937-A22C-5515CD405A83
|
|
// Assembly location: C:\Users\mikeyisbaeyt\Downloads\depotdownloader-2.4.5\depots\105601\6707058\Terraria.exe
|
|
|
|
using ReLogic.OS;
|
|
using System;
|
|
using System.Diagnostics;
|
|
using System.Globalization;
|
|
using System.IO;
|
|
using System.Runtime.InteropServices;
|
|
using System.Threading;
|
|
|
|
namespace Terraria.Utilities
|
|
{
|
|
public static class CrashDump
|
|
{
|
|
public static bool WriteException(CrashDump.Options options, string outputDirectory = ".") => CrashDump.Write(options, CrashDump.ExceptionInfo.Present, outputDirectory);
|
|
|
|
public static bool Write(CrashDump.Options options, string outputDirectory = ".") => CrashDump.Write(options, CrashDump.ExceptionInfo.None, outputDirectory);
|
|
|
|
private static string CreateDumpName()
|
|
{
|
|
DateTime localTime = DateTime.Now.ToLocalTime();
|
|
return string.Format("{0}_{1}_{2}_{3}.dmp", (object) "Terraria", (object) Main.versionNumber, (object) localTime.ToString("MM-dd-yy_HH-mm-ss-ffff", (IFormatProvider) CultureInfo.InvariantCulture), (object) Thread.CurrentThread.ManagedThreadId);
|
|
}
|
|
|
|
private static bool Write(
|
|
CrashDump.Options options,
|
|
CrashDump.ExceptionInfo exceptionInfo,
|
|
string outputDirectory)
|
|
{
|
|
if (!Platform.IsWindows)
|
|
return false;
|
|
string path = Path.Combine(outputDirectory, CrashDump.CreateDumpName());
|
|
if (!Utils.TryCreatingDirectory(outputDirectory))
|
|
return false;
|
|
using (FileStream fileStream = File.Create(path))
|
|
return CrashDump.Write((SafeHandle) fileStream.SafeFileHandle, options, exceptionInfo);
|
|
}
|
|
|
|
private static bool Write(
|
|
SafeHandle fileHandle,
|
|
CrashDump.Options options,
|
|
CrashDump.ExceptionInfo exceptionInfo)
|
|
{
|
|
if (!Platform.IsWindows)
|
|
return false;
|
|
Process currentProcess = Process.GetCurrentProcess();
|
|
IntPtr handle = currentProcess.Handle;
|
|
uint id = (uint) currentProcess.Id;
|
|
CrashDump.MiniDumpExceptionInformation expParam;
|
|
expParam.ThreadId = CrashDump.GetCurrentThreadId();
|
|
expParam.ClientPointers = false;
|
|
expParam.ExceptionPointers = IntPtr.Zero;
|
|
if (exceptionInfo == CrashDump.ExceptionInfo.Present)
|
|
expParam.ExceptionPointers = Marshal.GetExceptionPointers();
|
|
return !(expParam.ExceptionPointers == IntPtr.Zero) ? CrashDump.MiniDumpWriteDump(handle, id, fileHandle, (uint) options, ref expParam, IntPtr.Zero, IntPtr.Zero) : CrashDump.MiniDumpWriteDump(handle, id, fileHandle, (uint) options, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
|
|
}
|
|
|
|
[DllImport("dbghelp.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
|
|
private static extern bool MiniDumpWriteDump(
|
|
IntPtr hProcess,
|
|
uint processId,
|
|
SafeHandle hFile,
|
|
uint dumpType,
|
|
ref CrashDump.MiniDumpExceptionInformation expParam,
|
|
IntPtr userStreamParam,
|
|
IntPtr callbackParam);
|
|
|
|
[DllImport("dbghelp.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
|
|
private static extern bool MiniDumpWriteDump(
|
|
IntPtr hProcess,
|
|
uint processId,
|
|
SafeHandle hFile,
|
|
uint dumpType,
|
|
IntPtr expParam,
|
|
IntPtr userStreamParam,
|
|
IntPtr callbackParam);
|
|
|
|
[DllImport("kernel32.dll")]
|
|
private static extern uint GetCurrentThreadId();
|
|
|
|
[System.Flags]
|
|
public enum Options : uint
|
|
{
|
|
Normal = 0,
|
|
WithDataSegs = 1,
|
|
WithFullMemory = 2,
|
|
WithHandleData = 4,
|
|
FilterMemory = 8,
|
|
ScanMemory = 16, // 0x00000010
|
|
WithUnloadedModules = 32, // 0x00000020
|
|
WithIndirectlyReferencedMemory = 64, // 0x00000040
|
|
FilterModulePaths = 128, // 0x00000080
|
|
WithProcessThreadData = 256, // 0x00000100
|
|
WithPrivateReadWriteMemory = 512, // 0x00000200
|
|
WithoutOptionalData = 1024, // 0x00000400
|
|
WithFullMemoryInfo = 2048, // 0x00000800
|
|
WithThreadInfo = 4096, // 0x00001000
|
|
WithCodeSegs = 8192, // 0x00002000
|
|
WithoutAuxiliaryState = 16384, // 0x00004000
|
|
WithFullAuxiliaryState = 32768, // 0x00008000
|
|
WithPrivateWriteCopyMemory = 65536, // 0x00010000
|
|
IgnoreInaccessibleMemory = 131072, // 0x00020000
|
|
ValidTypeFlags = IgnoreInaccessibleMemory | WithPrivateWriteCopyMemory | WithFullAuxiliaryState | WithoutAuxiliaryState | WithCodeSegs | WithThreadInfo | WithFullMemoryInfo | WithoutOptionalData | WithPrivateReadWriteMemory | WithProcessThreadData | FilterModulePaths | WithIndirectlyReferencedMemory | WithUnloadedModules | ScanMemory | FilterMemory | WithHandleData | WithFullMemory | WithDataSegs, // 0x0003FFFF
|
|
}
|
|
|
|
private enum ExceptionInfo
|
|
{
|
|
None,
|
|
Present,
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential, Pack = 4)]
|
|
private struct MiniDumpExceptionInformation
|
|
{
|
|
public uint ThreadId;
|
|
public IntPtr ExceptionPointers;
|
|
[MarshalAs(UnmanagedType.Bool)]
|
|
public bool ClientPointers;
|
|
}
|
|
}
|
|
}
|