什么是特权教育?

时间:2008-09-18 02:56:26

标签: c winapi debugging odbc

我添加了一些编译干净且刚收到此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上运行)。

9 个答案:

答案 0 :(得分:33)

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

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

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

答案 1 :(得分:7)

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

答案 2 :(得分:7)

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

答案 3 :(得分:4)

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

答案 4 :(得分:4)

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

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

#define MAX_NUM_TOOBAR_BUTTONS  (24)

甚至存在!

答案 5 :(得分:2)

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

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

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

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

答案 6 :(得分:2)

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

答案 7 :(得分:2)

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

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

答案 8 :(得分:2)

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

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