加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

winapi – 从我自己的代码中返回劫持Windows错误代码的规则是什

发布时间:2020-12-14 03:58:08 所属栏目:Windows 来源:网络整理
导读:WinError.h中定义的错误代码是否可以自由劫持并通过自己的代码返回? 定义了一些通用的Win32错误代码: ERROR_FILE_NOT_FOUND:“系统找不到指定的文件.” 当然,当找不到文件时,我可以将它用于我自己的目的. 然后还有一些通用错误: ERROR_ACCESS_DENIED:“
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错误代码是免费提供的错误代码“池”吗?或者只是从Microsoft的代码返回所有Windows错误代码?

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

解决方法

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

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 HRESULTs

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. 07004

07005: All 07006 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

巧合的是,直到最后一步的一切都是微软HRESULT_FROM_WIN32宏的胆量:

Maps a system error code to an HRESULT value.

06005

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读