关于NtRaiseHardError的ULONG数组后续成员设置的技术咨询
关于NtRaiseHardError函数参数数组后续成员的设置说明
NtRaiseHardError的pArguments参数本质是一个ULONG_PTR类型的数组,它的成员类型和用途完全配合你传入的消息字符串(第一个成员指向的UNICODE_STRING)里的格式化占位符,同时需要通过UnicodeStringParameterMask参数做类型标记:
- 数组的第一个成员是指向显示消息的
UNICODE_STRING指针,这部分你已经清楚。 - 后续成员的类型取决于消息字符串中的占位符:
- 如果消息里用了数值占位符(比如
%lu、%d),对应位置的数组成员传入DWORD/ULONG类型的数值即可。 - 如果消息里用了字符串占位符(比如
%s),对应位置的数组成员传入UNICODE_STRING*或者WCHAR*(内核模式推荐用UNICODE_STRING,用户模式下宽字符串指针也可兼容)。
- 如果消息里用了数值占位符(比如
另外必须注意UnicodeStringParameterMask这个参数:它是一个位掩码,从第0位开始,每一位对应pArguments数组的一个成员。如果某一位设为1,说明对应位置的成员是UNICODE_STRING*;设为0则表示是数值类型(ULONG_PTR)。比如你的消息字符串是L"错误代码:%lu,提示信息:%s",那么pArguments数组的结构是:
- 指向该消息
UNICODE_STRING的指针 - 错误代码(DWORD类型)
- 指向提示信息
UNICODE_STRING的指针
对应的UnicodeStringParameterMask就需要设为0b101(即十进制的5),标记第0位和第2位是字符串类型。
附函数定义参考:
NTSTATUS NtRaiseHardError( NTSTATUS ErrorStatus, ULONG NumberOfParameters, ULONG UnicodeStringParameterMask, PULONG_PTR pArguments, ULONG ResponseOption, PULONG Response );
内容的提问来源于stack exchange,提问作者adffwef
相关产品推荐
相关产品推荐

