什么是特权教育?

我添加了一些编译干净,刚收到此Windows错误的代码:

--------------------------- (MonTel Administrator) 2.12.7: MtAdmin.exe - Application Error --------------------------- The exception Privileged instruction. (0xc0000096) occurred in the application at location 0x00486752. 

我即将继续寻找一个bug,我期待它是一件愚蠢的事情,我已经完成了这件事,恰好产生了这个消息。 代码编译干净,没有错误或警告。 EXE文件的大小已增长到1,454,132字节并包含指向ODCS.lib链接,但它是纯粹的C到Win32 API,DEBUG打开(在Windows 2000上的P4上运行)。

为了回答这个问题,特权指令是处理器操作码(汇编指令),它只能在“管理员”(或Ring-0)模式下执行。 这些类型的指令往往用于从Windows内核访问I / O设备和受保护的数据结构。

常规程序以“用户模式”(Ring-3)执行,不允许直接访问I / O设备等…

正如其他人提到的,原因可能是损坏的堆栈或混乱的函数指针调用。

当使用指向无效数据的函数指针时,通常会发生这种情况。 如果您的代码会破坏您的返回堆栈,也会发生这种情况。 跟踪这些错误有时候很难处理,因为它们通常难以重现。

特权指令是IA-32指令,只允许在Ring-0(即内核模式)中执行。 如果你在用户空间中遇到这种情况,你要么得到了一个非常旧的EXE,要么是一个损坏的二进制文件。

我能想到的第一个概率是,你可能正在使用一个本地数组,它接近函数声明的顶部。 你的边界检查变得疯狂并覆盖了返回地址,它指向一些只允许内核执行的指令。

我怀疑这是愚蠢的事情。 我认为由于上述消息中的评论中的一些线索,我的解决速度提高了两倍。 感谢那些特别指出应用程序早期覆盖堆栈的人。 我实际上发现这里的几个答案更有用的是我已经标记为回答问题的post,因为他们已经知道并将我排在哪里,但我觉得最好总结答案。

事实certificate,我刚刚添加了一个超过数组最大大小的按钮,其中包含一些工具栏按钮信息(位于堆栈中)。 我忘了那个

 #define MAX_NUM_TOOBAR_BUTTONS(24)

甚至存在!

在可执行代码通常存在之前,错误位置0x00486752对我来说似乎很小。 我同意丹尼尔,它看起来像是一个狂野的指针。

我在2000年用Visual c ++ 6.0看到了这个。

调试C ++库在exception处理程序中调用了物理I / O指令。 如果我没记错的话,那就是转储状态到以前用于DMA基址寄存器的I / O端口,我假设有人在微软用于调试卡。

查找可能导致诊断代码运行的潜在错误情况。

我正在调试,回溯并阅读反汇编。 这是处理std::string时的一个例外,可能是在结尾处索引。

过去15年制造的大多数处理器的CPU都有一些非常强大的特殊指令。 这些特权指令是为操作系统内核应用程序保留的,不能由用户编写的程序使用。

这限制了用户编写的程序可能对系统造成的损害,并减少了系统实际崩溃的次数。

在内核模式下执行时,操作系统可以无限制地访问内核和用户程序的内存。

基本和限制寄存器的加载指令是特权指令。