title: Call MiniDumpWriteDump with callback
body: <p>I want to use the MiniDumpWriteDump function to create some custom dump files (mainly, i want to export a dump file that contains the minimum amount of information for the thread callstacks), but i am having difficulties defining the structures that need to be passed as a parameter to the callback function</p>
  
  <pre><code>[StructLayout(LayoutKind.Explicit)]
  internal struct MINIDUMP_CALLBACK_OUTPUT
  {
      [FieldOffset(0)]
      public ulong ModuleWriteFlags;
      [FieldOffset(0)]
      public ulong ThreadWriteFlags;
  }
  
  public struct MINIDUMP_CALLBACK_INFORMATION
      {
          public IntPtr CallbackRoutine;
          public IntPtr CallbackParam;
      }
  
  public delegate bool MINIDUMP_CALLBACK_ROUTINE(
          IntPtr CallBackParam, 
          MINIDUMP_CALLBACK_INPUT input, 
          MINIDUMP_CALLBACK_OUTPUT output);
  
  [DllImport("dbghelp.dll")]
  public static extern bool MiniDumpWriteDump(IntPtr hProcess, Int32 ProcessId, IntPtr hFile, int DumpType,
      IntPtr ExceptionParam, IntPtr UserStreamParam, IntPtr CallStackParam);
  </code></pre>
  
  <p>And the call looks like this:</p>
  
  <pre><code>MINIDUMP_CALLBACK_INFORMATION mci;
  MINIDUMP_CALLBACK_ROUTINE r = new MINIDUMP_CALLBACK_ROUTINE(MyCallback);
  GC.KeepAlive(r);
  mci.CallbackRoutine = Marshal.GetFunctionPointerForDelegate(r);
  mci.CallbackParam = IntPtr.Zero;    
  IntPtr structPointer = Marshal.AllocHGlobal(Marshal.SizeOf(mci));    
  Marshal.StructureToPtr(mci, structPointer, true);    
  MiniDumpWriteDump(process[0].Handle, process[0].Id,
                          fs.SafeFileHandle.DangerousGetHandle(),
                          (int)MINIDUMP_TYPE.MiniDumpNormal,
                          Marshal.GetExceptionPointers(),
                          IntPtr.Zero,
                          structPointer);
  
  Marshal.FreeHGlobal(structPointer);
  </code></pre>
  
  <p>So my question is how to define MINIDUMP_CALLBACK_INPUT:</p>
  
  <p>The definition of the structures in C that pose problems are:</p>
  
  <pre><code>typedef struct _MINIDUMP_CALLBACK_INPUT 
  {
      ULONG                       ProcessId;
      HANDLE                      ProcessHandle;
      ULONG                       CallbackType;
      union 
      {
          MINIDUMP_THREAD_CALLBACK        Thread;
          MINIDUMP_THREAD_EX_CALLBACK     ThreadEx;
          MINIDUMP_MODULE_CALLBACK        Module;
          MINIDUMP_INCLUDE_THREAD_CALLBACK IncludeThread;
          MINIDUMP_INCLUDE_MODULE_CALLBACK IncludeModule;
      } u;
  } MINIDUMP_CALLBACK_INPUT
  
  typedef struct _MINIDUMP_MODULE_CALLBACK 
  {
      PWCHAR                      FullPath;
      ULONGLONG                   BaseOfImage;
      ULONG                       SizeOfImage;
      ULONG                       CheckSum;
      ULONG                       TimeDateStamp;
      VS_FIXEDFILEINFO            VersionInfo;
      PVOID                       CvRecord;
      ULONG                       SizeOfCvRecord;
      PVOID                       MiscRecord;
      ULONG                       SizeOfMiscRecord;
  } MINIDUMP_MODULE_CALLBACK
  </code></pre>