Merge pull request #3289 from BrzVlad/fix-critical-finalizer
[mono.git] / mcs / class / referencesource / mscorlib / system / security / safesecurityhandles.cs
1 // <OWNER>[....]</OWNER>
2 namespace Microsoft.Win32.SafeHandles {
3     using System;
4     using System.Runtime.CompilerServices;
5     using System.Runtime.InteropServices;
6     using System.Runtime.ConstrainedExecution;
7     using System.Runtime.Versioning;
8     using System.Security;
9
10     // Introduce this handle to replace internal SafeTokenHandle,
11     // which is mainly used to hold Windows thread or process access token
12     [SecurityCritical]
13     public sealed class SafeAccessTokenHandle : SafeHandle
14     {
15         private SafeAccessTokenHandle()
16             : base(IntPtr.Zero, true)
17         { }
18
19         // 0 is an Invalid Handle
20         public SafeAccessTokenHandle(IntPtr handle)
21             : base(IntPtr.Zero, true)
22         {
23             SetHandle(handle);
24         }
25
26         public static SafeAccessTokenHandle InvalidHandle
27         {
28             [SecurityCritical]
29             get { return new SafeAccessTokenHandle(IntPtr.Zero); }
30         }
31
32         public override bool IsInvalid
33         {
34             [SecurityCritical]
35             get { return handle == IntPtr.Zero || handle == new IntPtr(-1); }
36         }
37
38         [SecurityCritical]
39         protected override bool ReleaseHandle()
40         {
41 #if MONO
42             return true;
43 #else
44             return Win32Native.CloseHandle(handle);
45 #endif
46         }
47     }
48
49 #if !FEATURE_PAL
50     [System.Security.SecurityCritical]  // auto-generated
51     internal sealed class SafeLsaLogonProcessHandle : SafeHandleZeroOrMinusOneIsInvalid {
52         private SafeLsaLogonProcessHandle() : base (true) {}
53
54         // 0 is an Invalid Handle
55         internal SafeLsaLogonProcessHandle(IntPtr handle) : base (true) {
56             SetHandle(handle);
57         }
58
59         internal static SafeLsaLogonProcessHandle InvalidHandle {
60             get { return new SafeLsaLogonProcessHandle(IntPtr.Zero); }
61         }
62
63         [System.Security.SecurityCritical]
64         override protected bool ReleaseHandle()
65         {
66             // LsaDeregisterLogonProcess returns an NTSTATUS
67             return Win32Native.LsaDeregisterLogonProcess(handle) >= 0;
68         }
69     }
70
71     [System.Security.SecurityCritical]  // auto-generated
72     internal sealed class SafeLsaMemoryHandle : SafeBuffer {
73         private SafeLsaMemoryHandle() : base(true) {}
74
75         // 0 is an Invalid Handle
76         internal SafeLsaMemoryHandle(IntPtr handle) : base (true) {
77             SetHandle(handle);
78         }
79
80         internal static SafeLsaMemoryHandle InvalidHandle {
81             get { return new SafeLsaMemoryHandle( IntPtr.Zero ); }
82         }
83
84         [System.Security.SecurityCritical]
85         override protected bool ReleaseHandle()
86         {
87             return Win32Native.LsaFreeMemory(handle) == 0;
88         }
89     }
90
91     [System.Security.SecurityCritical]  // auto-generated
92     internal sealed class SafeLsaPolicyHandle : SafeHandleZeroOrMinusOneIsInvalid {
93         private SafeLsaPolicyHandle() : base(true) {}
94
95         // 0 is an Invalid Handle
96         internal SafeLsaPolicyHandle(IntPtr handle) : base (true) {
97             SetHandle(handle);
98         }
99
100         internal static SafeLsaPolicyHandle InvalidHandle {
101             get { return new SafeLsaPolicyHandle( IntPtr.Zero ); }
102         }
103
104         [System.Security.SecurityCritical]
105         override protected bool ReleaseHandle()
106         {
107             return Win32Native.LsaClose(handle) == 0;
108         }
109     }
110
111     [System.Security.SecurityCritical]  // auto-generated
112     internal sealed class SafeLsaReturnBufferHandle : SafeBuffer {
113         private SafeLsaReturnBufferHandle() : base (true) {}
114
115         // 0 is an Invalid Handle
116         internal SafeLsaReturnBufferHandle(IntPtr handle) : base (true) {
117             SetHandle(handle);
118         }
119
120         internal static SafeLsaReturnBufferHandle InvalidHandle {
121             get { return new SafeLsaReturnBufferHandle(IntPtr.Zero); }
122         }
123
124         [System.Security.SecurityCritical]
125         override protected bool ReleaseHandle()
126         {
127             // LsaFreeReturnBuffer returns an NTSTATUS
128             return Win32Native.LsaFreeReturnBuffer(handle) >= 0;
129         }
130     }
131
132     [System.Security.SecurityCritical]  // auto-generated
133     internal sealed class SafeProcessHandle : SafeHandleZeroOrMinusOneIsInvalid {
134         private SafeProcessHandle() : base (true) {}
135
136         // 0 is an Invalid Handle
137         internal SafeProcessHandle(IntPtr handle) : base (true) {
138             SetHandle(handle);
139         }
140
141         internal static SafeProcessHandle InvalidHandle {
142             get { return new SafeProcessHandle(IntPtr.Zero); }
143         }
144
145         [System.Security.SecurityCritical]
146         [ResourceExposure(ResourceScope.None)]
147         [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)]
148         override protected bool ReleaseHandle()
149         {
150             return Win32Native.CloseHandle(handle);
151         }
152     }
153
154     [System.Security.SecurityCritical]  // auto-generated
155     internal sealed class SafeThreadHandle : SafeHandleZeroOrMinusOneIsInvalid {
156         private SafeThreadHandle() : base (true) {}
157
158         // 0 is an Invalid Handle
159         internal SafeThreadHandle(IntPtr handle) : base (true) {
160             SetHandle(handle);
161         }
162
163         [System.Security.SecurityCritical]
164         [ResourceExposure(ResourceScope.None)]
165         [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)]
166         override protected bool ReleaseHandle()
167         {
168             return Win32Native.CloseHandle(handle);
169         }
170     }
171
172 #endif // !FEATURE_PAL
173 }