private static unsafe void FreePropVariant(IntPtr buffer, int valueOffset) { // two contigous PROPVARIANT structures that need to be freed // the second should only be freed if different from the first Debug.Assert(0 == (sizeof(PROPVARIANT) % 8), "unexpected PROPVARIANT size mutiplier"); Debug.Assert(0 == valueOffset % 8, "unexpected unaligned ptr offset"); IntPtr currentHandle = ADP.IntPtrOffset(buffer, valueOffset); IntPtr originalHandle = ADP.IntPtrOffset(buffer, valueOffset + sizeof(PROPVARIANT)); bool different = NativeOledbWrapper.MemoryCompare(currentHandle, originalHandle, sizeof(PROPVARIANT)); RuntimeHelpers.PrepareConstrainedRegions(); try { } finally { // always clear the first structure Interop.Ole32.PropVariantClear(currentHandle); if (different) { // second structure different from the first Interop.Ole32.PropVariantClear(originalHandle); } else { // second structure same as the first, just clear the field SafeNativeMethods.ZeroMemory(originalHandle, sizeof(PROPVARIANT)); } } }
private static void FreeVariant(IntPtr buffer, int valueOffset) { IntPtr ptr2 = ADP.IntPtrOffset(buffer, valueOffset); IntPtr ptr = ADP.IntPtrOffset(buffer, valueOffset + ODB.SizeOf_Variant); bool flag = NativeOledbWrapper.MemoryCompare(ptr2, ptr, ODB.SizeOf_Variant); RuntimeHelpers.PrepareConstrainedRegions(); try { } finally { SafeNativeMethods.VariantClear(ptr2); if (flag) { SafeNativeMethods.VariantClear(ptr); } else { SafeNativeMethods.ZeroMemory(ptr, (IntPtr)ODB.SizeOf_Variant); } } }