12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- using System;
- using System.Runtime.InteropServices;
- using System.Security;
- using System.Security.Permissions;
- using Microsoft.Win32.SafeHandles;
- namespace HandyControl.Tools.Interop;
- internal sealed class SafeFileMappingHandle : SafeHandleZeroOrMinusOneIsInvalid
- {
- [SecurityCritical]
- internal SafeFileMappingHandle(IntPtr handle) : base(false)
- {
- SetHandle(handle);
- }
- [SecurityCritical, SecuritySafeCritical]
- internal SafeFileMappingHandle() : base(true)
- {
- }
- public override bool IsInvalid
- {
- [SecurityCritical, SecuritySafeCritical]
- get => handle == IntPtr.Zero;
- }
- [SecurityCritical, SecuritySafeCritical]
- protected override bool ReleaseHandle()
- {
- new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Assert();
- try
- {
- return CloseHandleNoThrow(new HandleRef(null, handle));
- }
- finally
- {
- CodeAccessPermission.RevertAssert();
- }
- }
- [SecurityCritical]
- public static bool CloseHandleNoThrow(HandleRef handle)
- {
- HandleCollector.Remove((IntPtr) handle, CommonHandles.Kernel);
- var result = InteropMethods.IntCloseHandle(handle);
- return result;
- }
- }
|