gpt4 book ai didi

c# - 如何将特定的 NTSTATUS 值转换为 Hresult?

转载 作者:行者123 更新时间:2023-11-30 13:26:22 26 4
gpt4 key购买 nike

我知道在出现特定错误时我会得到 NTSTATUS,但我得到的是 hresult,而不是来自 pinvoke 的 ntstatus。那么具体如何转换NTSTATUS HResult 的值(value)。

我试过没有成功:

class Program
{
private const int FacilityNtBit = 0x10000000;

//#define STATUS_DUPLICATE_OBJECTID ((NTSTATUS)0xC000022AL)
private const int STATUS_DUPLICATE_OBJECTID = unchecked((int) (0xC000022A));

// HResult that is returned for the STATUS_DUPLICATE_OBJECTID
private const int CorrectHrStatusDuplicateObjectid = -2147019886;

static void Main(string[] args)
{
int res = HRESULT_FROM_NT(STATUS_DUPLICATE_OBJECTID);
Debug.Assert(res == CorrectHrStatusDuplicateObjectid, "Must be the same");
}

private static int HRESULT_FROM_NT(int ntStatus)
{
//#define HRESULT_FROM_NT(x) ((HRESULT) ((x) | FACILITY_NT_BIT))
return ntStatus | FacilityNtBit;
}
}

最佳答案

你拥有的NTSTATUS

  • 0xC000022A:STATUS_DUPLICATE_OBJECTID - 尝试将 ID 插入索引失败,因为该 ID 已在索引中。 )

    • 严重性:1(1=失败)
    • 保留:1 (1=NTSTATUS)
    • 客户:0(0=微软定义)
    • N:0(0=不是 NTSTATUS HRESULT)
    • 预留:0
    • 设施:0
    • 代码:554

你想要的HRESULT

  • 0x80071392:

    • 严重性:1(1=失败)
    • R 保留:0
    • 客户:0(0=微软定义)
    • N:0(0=不是 NTSTATUS HRESULT)
    • X 预留:0
    • 设施:7(FACILITY_WIN32 - 此区域保留用于将未修饰的错误代码映射到 HRESULT。)
    • 代码:5010(ERROR_OBJECT_ALREADY_EXISTS - 对象已存在。)

表示同一个错误的多种方式

问题是同一个错误有多种表示形式:

  • NTSTATUS:0xC000022A
  • Win32:5010
  • HRESULT:0xD000022A (将 NSTATUS 转换为 HRESULT)
  • HRESULT:0x80071392 (将 Win32 错误转换为 HRESULT)

enter image description here

并非所有 NTSTATUS 代码都可以转换为 Win32。在这种情况下,尝试通过 RtlNtstatusToDosError 会给您错误代码 ERROR_MR_MID_NOT_FOUND:

The system cannot find message text for message number 0x%1 in the message file for %2.

这就是为什么最好保留真正的错误消息。

获取错误信息

我认为遇到的真正问题是如何将 NTSTATUS 转换为可以显示给用户的错误消息。为此,您需要 Microsoft 知识库文章:

KB259693 - How to translate NTSTATUS error codes to message strings

Most Kernel Mode API functions return NTSTATUS values. To translate these status values to messages by using the FormatMessage API function, you must reference the NtDLL.dll module in the parameter list.

void DisplayError(DWORD NTStatusMessage)
{
LPVOID lpMessageBuffer;
HMODULE Hand = LoadLibrary("NTDLL.DLL");

FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_FROM_HMODULE,
Hand,
Err,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMessageBuffer,
0,
NULL );

// Now display the string.

// Free the buffer allocated by the system.
LocalFree( lpMessageBuffer );
FreeLibrary(Hand);
}

关于c# - 如何将特定的 NTSTATUS 值转换为 Hresult?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25566234/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com