/// <summary> /// Get the security descriptor for a resource. /// </summary> /// <param name="handle">The handle to the resource.</param> /// <param name="type">The type of the resource.</param> /// <param name="security_information">The security information to get.</param> /// <param name="throw_on_error">True to throw on error.</param> /// <returns>The security descriptor.</returns> public static NtResult <SecurityDescriptor> GetSecurityInfo( SafeHandle handle, SeObjectType type, SecurityInformation security_information, bool throw_on_error) { using (var result = Win32NativeMethods.GetSecurityInfo(handle, type, security_information, null, null, null, null, out SafeLocalAllocBuffer sd).MapDosErrorToStatus().CreateResult(throw_on_error, () => sd)) { if (!result.IsSuccess) { return(result.Cast <SecurityDescriptor>()); } NtType sd_type = null; if (handle is SafeKernelObjectHandle kernel_handle) { sd_type = NtType.GetTypeByName(kernel_handle.NtTypeName, false); } return(SecurityDescriptor.Parse(result.Result, sd_type ?? GetNativeType(type), throw_on_error)); } }