/// <summary>
        /// Build a status from it's component parts.
        /// </summary>
        /// <param name="severity">The severity of the status code.</param>
        /// <param name="is_customer_code">Is this a customer code?</param>
        /// <param name="is_reserved">Is this a reserved code?</param>
        /// <param name="facility">The facility.</param>
        /// <param name="code">The status code.</param>
        /// <returns></returns>
        public static NtStatus BuildStatus(NtStatusSeverity severity, bool is_customer_code,
                                           bool is_reserved, NtStatusFacility facility, int code)
        {
            uint status = (uint)code |
                          ((uint)facility << 16) |
                          (is_reserved ? (1U << 28) : 0U) |
                          (is_customer_code ? (1U << 29) : 0U) |
                          ((uint)severity << 30);

            return((NtStatus)status);
        }
        /// <summary>
        /// Convert an NTSTATUS to a message description.
        /// </summary>
        /// <param name="status">The status to convert.</param>
        /// <returns>The message description, or an empty string if not found.</returns>
        public static string GetNtStatusMessage(NtStatus status)
        {
            SafeLoadLibraryHandle module = SafeLoadLibraryHandle.Null;
            uint             message_id  = (uint)status;
            NtStatusFacility facility    = status.GetFacility();

            if (facility == NtStatusFacility.FACILITY_NTWIN32 ||
                facility == NtStatusFacility.FACILITY_VISUALCPP)
            {
                module     = SafeLoadLibraryHandle.GetModuleHandleNoThrow("kernel32.dll");
                message_id = (uint)status.GetStatusCode();
            }
            else
            {
                module = SafeLoadLibraryHandle.GetModuleHandleNoThrow("ntdll.dll");
            }

            return(Win32Utils.FormatMessage(module, message_id));
        }