gpt4 book ai didi

winapi - 劫持 Windows 错误代码以从我自己的代码返回的规则是什么?

转载 作者:行者123 更新时间:2023-12-03 00:29:01 28 4
gpt4 key购买 nike

WinError.h中定义的错误代码是否可以被劫持并通过我自己的代码返回?

定义了一些通用 Win32 错误代码:

  • ERROR_FILE_NOT_FOUND:“系统找不到指定的文件。”

当找不到文件时,我当然可以将其用于我自己的目的。

然后仍然存在一些一般性错误:

  • ERROR_ACCESS_DENIED:“访问被拒绝。”

但人们普遍认为此错误是在尝试访问文件时发生的。我可能有一个 HttpGet() 函数,如果服务器返回 401,它会返回 ERROR_ACCESS_DENIED

但是有些代码被定义为用于特定目的。想象一下,如果 https 证书不是我们支持的类型,我的 HttpGet() 函数会抛出错误:

  • ERROR_IPSEC_IKE_INVALID_CERT_TYPE:“证书类型无效”

除了代码在 WinError.h 中被明确定义为属于 IPSec:

///////////////////////////////////////////////////
// //
// Start of IPSec Error codes //
// //
// 13000 to 13999 //
///////////////////////////////////////////////////

...

//
// MessageId: ERROR_IPSEC_IKE_INVALID_CERT_TYPE
//
// MessageText:
//
// Invalid certificate type
//
#define ERROR_IPSEC_IKE_INVALID_CERT_TYPE 13819L

但是错误文本正是我想要的!

我们的金融系统需要第二个用户批准交易;这意味着输入的凭据必须是与第一个人不同的用户:

  • MK_E_MUSTBOTHERUSER:“操作成功需要用户输入”

或者也许:

  • ERROR_LOGON_TYPE_NOT_GRANTED:“登录失败:用户尚未在此计算机上获得所请求的登录类型。”

我感觉到,通过 WinError 进行探索,通过它们显示的字符串挑选错误代码,并重新利用它们来指示它们不是为它们设计的错误,是Raymond的感觉。会给我一巴掌。

Windows 错误代码是免费提供的错误代码“库”吗?或者所有 Windows 错误代码都只能从 Microsoft 的代码中返回吗?

如果我要创建HRESULTS,我需要使用一些代码。如果用户可以调用 FormatMessage 那就太好了将我的 HRESULT 转换为字符串。 (特别是因为我返回的 HRESULT 可以是我自己的代码,也可以是从 Microsoft 代码返回给我的 HRESULT)。

最佳答案

当您定义自己的HRESULT代码时,建议您使用FACILITY_ITF并在此应用程序定义的代码范围内定义您的代码。是的,代码会在应用程序之间重叠,但如果您正在实现 COM 对象/接口(interface),您也可以通过 SetErrorInfo API 提供额外的描述性消息,并通过实现 ISupportErrorInfo 来指示支持。

COM+ 编程一书中的摘录更详细地解释了这一点:COM+ programming: a practical guide using Visual C++ and ATL (第 67 页)。

比这更简单,您可以使用自定义设施代码,这在不同的模块中可能有所不同,因此您可以轻松识别哪个模块是问题的根源。

如果您将 MESSAGETABLE 资源放入二进制文件中,FormatMessage API 可以解析 HRESULT 并提取各个代码的描述文本,就像常规 Windows 错误代码(应用程序仍然需要为 API 函数提供模块句柄)。

另请参阅:Creating your own HRESULT?

<小时/>

O.P.编辑:

来自微软的Open Protocol Specification of HRESULT

2.1 HRESULT

The HRESULT numbering space is vendor-extensible. Vendors can supply their own values for this field, as long as the C bit (0x20000000) is set, indicating it is a customer code.

C (1 bit): Customer. This bit specifies if the value is customer-defined or Microsoft-defined. The bit is set for customer-defined values and clear for Microsoft-defined values. <1>

<1> Section 2.1: All HRESULT values used by Microsoft have the C bit clear.

这意味着只要设置C位,我就可以编写任何我喜欢的HRESULT。实际上,这意味着我可以使用任何我喜欢的代码,例如:

E_LOGON_FAILURE = 0xA007052E;

当然这个数字不是我随意想出来的。

首先我将高位设置为1,以指示错误:

0x80000000

然后我“选择”一个错误代码,例如1326 (0x52E hex) :

0x8000052E

然后我需要选择一个设施。让我们选择,我不知道,seven :

0x8007052E

最后我设置了the Customer bit ,表明它不是 Microsoft 定义的 HRESULT:

0xA007052E

巧合的是,直到最后一步的所有内容都是 Microsoft HRESULT_FROM_WIN32 的核心。宏:

Maps a system error code to an HRESULT value.

 HRESULT HRESULT_FROM_WIN32(DWORD x);

关于winapi - 劫持 Windows 错误代码以从我自己的代码返回的规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9743749/

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