// CleanUp operations private void CleanUpPOD(IntPtr native) { Marshal.FreeCoTaskMem(Marshal.ReadIntPtr(native, newFileSymbolPathOffset)); if (IntPtr.Zero != Marshal.ReadIntPtr(native, oldFileSymbolPathArrayOffset)) { for (int i = 0; i < GetOldFileCount(native); ++i) { Marshal.FreeCoTaskMem( Marshal.ReadIntPtr( Marshal.ReadIntPtr(native, oldFileSymbolPathArrayOffset), i * Marshal.SizeOf(typeof(IntPtr)))); } Marshal.FreeCoTaskMem(Marshal.ReadIntPtr(native, oldFileSymbolPathArrayOffset)); } if (IntPtr.Zero != Marshal.ReadIntPtr(native, interleaveMapArrayOffset)) { for (int i = 0; i < GetOldFileCount(native); ++i) { Marshal.FreeCoTaskMem( Marshal.ReadIntPtr( Marshal.ReadIntPtr(native, interleaveMapArrayOffset), i * Marshal.SizeOf(typeof(IntPtr)))); } Marshal.FreeCoTaskMem(Marshal.ReadIntPtr(native, interleaveMapArrayOffset)); } PatchAPIMarshaler.ReleaseMainStruct(native); }
// Marshal operations private IntPtr MarshalPOD(PatchOptionData managed) { if (null == managed) { throw new ArgumentNullException("managed"); } IntPtr native = this.CreateMainStruct(managed.oldFileSymbolPathArray.Length); Marshal.WriteInt32(native, patchOptionDataSize); // SizeOfThisStruct WriteUInt32(native, symbolOptionFlagsOffset, (uint)managed.symbolOptionFlags); Marshal.WriteIntPtr(native, newFileSymbolPathOffset, PatchAPIMarshaler.OptionalAnsiString(managed.newFileSymbolPath)); Marshal.WriteIntPtr(native, oldFileSymbolPathArrayOffset, PatchAPIMarshaler.CreateArrayOfStringA(managed.oldFileSymbolPathArray)); WriteUInt32(native, extendedOptionFlagsOffset, managed.extendedOptionFlags); // GetFunctionPointerForDelegate() throws an ArgumentNullException if the delegate is null. if (null == managed.symLoadCallback) { Marshal.WriteIntPtr(native, symLoadCallbackOffset, IntPtr.Zero); } else { Marshal.WriteIntPtr(native, symLoadCallbackOffset, Marshal.GetFunctionPointerForDelegate(managed.symLoadCallback)); } Marshal.WriteIntPtr(native, symLoadContextOffset, managed.symLoadContext); Marshal.WriteIntPtr(native, interleaveMapArrayOffset, PatchAPIMarshaler.CreateInterleaveMap(managed.interleaveMapArray)); WriteUInt32(native, maxLzxWindowSizeOffset, managed.maxLzxWindowSize); return(native); }
private void CleanUpPOFI_A(IntPtr native) { for (int i = 0; i < GetOldFileCount(native); ++i) { PatchAPIMarshaler.CleanUpPOFI((IntPtr)((Int64)native + i * patchOldFileInfoSize)); } PatchAPIMarshaler.ReleaseMainStruct(native); }
private static void CleanUpPOFI(IntPtr native) { if (IntPtr.Zero != Marshal.ReadIntPtr(native, oldFileOffset)) { Marshal.FreeCoTaskMem(Marshal.ReadIntPtr(native, oldFileOffset)); } PatchAPIMarshaler.CleanUpPOFIH(native); }
private IntPtr MarshalPOFIW_A(PatchOldFileInfoW[] managed) { if (null == managed) { throw new ArgumentNullException("managed"); } if (0 == managed.Length) { return(IntPtr.Zero); } IntPtr native = this.CreateMainStruct(managed.Length); for (int i = 0; i < managed.Length; ++i) { PatchAPIMarshaler.MarshalPOFIW(managed[i], (IntPtr)((Int64)native + i * patchOldFileInfoSize)); } return(native); }
private static void MarshalPOFIW(PatchOldFileInfoW managed, IntPtr native) { PatchAPIMarshaler.MarshalPOFI(managed, native); Marshal.WriteIntPtr(native, oldFileOffset, PatchAPIMarshaler.OptionalUnicodeString(managed.oldFileName)); // OldFileName }