3

我之前在 Windows 7 64 位的设备驱动程序中使用KeSaveExtendedProcessorState / KeRestoreExtendedProcessorState来保存和恢复扩展的处理器状态,我得到了 KeSaveExtendedProcessorState 的 BSOD,你能帮忙吗?

我使用 RtlGetEnabledExtendedFeatures ((ULONG64)(-1)) 来获取启用的扩展功能(返回值为 0x3),并将其用作KeSaveExtendedProcessorState的第一个参数,并使用MmAllocateContiguousMemory (sizeof(XSTATE_SAVE), highAddress) 和 highAddress = 0xbfffffff 分配用于保存扩展状态的非分页内存,并在 KeSaveExtendedProcessorState 之前将 IRQL 提升到 DISPATCH_LEVEL。我收到以下消息的 BSOD:

0: kd> !analyze -v
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

INVALID_EXTENDED_PROCESSOR_STATE (131)
Invalid combination of parameters was detected while saving or restoring
extended processor state.
Arguments:
Arg1: 0000000000000000, Invalid feature mask was passed or extended processor state is
                not enabled.
Arg2: 0000000000800000, Nonzero if extended state is enabled.
Arg3: 0000000000000003, The low 32 bits of the feature mask.
Arg4: 0000000000000000, The high 32 bits of the feature mask.

我错过了什么?

谢谢。

问候,大卫

4

1 回答 1

1

现在帮助您进行编程为时已晚,但您错过的是 KeSaveExtendedProcessorState 在 64 位 Windows 7(不是 32 位和 Windows 8 及更高版本)中的实现要求处理器支持扩展处理器状态,而您的处理器不支持. 无论如何,它认为 XSTATE_MASK_LEGACY 的两个位在 Mask 参数中都是无效的。

你错过这个的代价就是你的错误检查。不需要“多一点代码”。当然,你并不是唯一一个错过它的人。微软在文档中也错过了它,但对微软来说,这个代价几乎没有。

十年后,在我评估这个函数是否值得我费力记录下来时,我想知道是否有任何现实世界的程序员被抓住了。因此,堆栈溢出是否表明它最终有利于答案。

于 2021-01-19T19:36:14.687 回答