SafeFileMappingHandle.cs 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. using System;
  2. using System.Runtime.InteropServices;
  3. using System.Security;
  4. using System.Security.Permissions;
  5. using Microsoft.Win32.SafeHandles;
  6. namespace HandyControl.Tools.Interop;
  7. internal sealed class SafeFileMappingHandle : SafeHandleZeroOrMinusOneIsInvalid
  8. {
  9. [SecurityCritical]
  10. internal SafeFileMappingHandle(IntPtr handle) : base(false)
  11. {
  12. SetHandle(handle);
  13. }
  14. [SecurityCritical, SecuritySafeCritical]
  15. internal SafeFileMappingHandle() : base(true)
  16. {
  17. }
  18. public override bool IsInvalid
  19. {
  20. [SecurityCritical, SecuritySafeCritical]
  21. get => handle == IntPtr.Zero;
  22. }
  23. [SecurityCritical, SecuritySafeCritical]
  24. protected override bool ReleaseHandle()
  25. {
  26. new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Assert();
  27. try
  28. {
  29. return CloseHandleNoThrow(new HandleRef(null, handle));
  30. }
  31. finally
  32. {
  33. CodeAccessPermission.RevertAssert();
  34. }
  35. }
  36. [SecurityCritical]
  37. public static bool CloseHandleNoThrow(HandleRef handle)
  38. {
  39. HandleCollector.Remove((IntPtr) handle, CommonHandles.Kernel);
  40. var result = InteropMethods.IntCloseHandle(handle);
  41. return result;
  42. }
  43. }