我以前在Windows764位设备驱动程序中使用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.我错过了什么?
谢谢。
问候你,大卫
发布于 2021-01-20 03:36:15
现在已经来不及帮你编程了,但你错过的是,在64位Windows7中实现KeSaveExtendedProcessorState -不是32位,也不是Windows8或更高版本-要求处理器支持扩展的处理器状态,而你的处理器不支持扩展的处理器状态。无论如何,它在掩码参数中都将XSTATE_MASK_LEGACY的两位视为无效。
对你来说错过这个的代价就是你的bug检查。不需要“多一点代码”。当然,你并不是唯一一个错过它的人。微软在文档中也遗漏了这一点,但微软为此付出的代价几乎为零。
十年后,在我评估这个函数是否值得我费心去记录的时候,我想知道是否有任何现实世界的程序员被抓住了。因此,Stack Overflow表明它最终是一个好的答案。
https://stackoverflow.com/questions/12060147
复制相似问题