C 什么是特权指令?

C 什么是特权指令?,c,winapi,debugging,odbc,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 0x004867

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

---------------------------
(MonTel Administrator) 2.12.7: MtAdmin.exe - Application Error
---------------------------
The exception Privileged instruction.

 (0xc0000096) occurred in the application at location 0x00486752.

我将要进行一次虫子搜索,我希望我所做的一些愚蠢的事情恰好产生了这个信息。代码编译干净,没有错误或警告。EXE文件的大小已经增长到1454132字节,包括到“代码> ODCS.LIB < /C>”的链接,但是它在Win32 API上是纯C的,在Debug上运行(在Windows2000上运行P4)。

< P>我在2000年用Visual C++ 6看到了这个。

调试C++库在异常处理程序中调用物理I/O指令。 如果我没记错的话,它是将状态转储到一个I/O端口,该端口过去用于DMA基本寄存器,我想微软的某个人正在使用它作为调试器卡

查找可能导致诊断代码运行的潜在错误条件


我正在调试、回溯和阅读DISS程序集。处理
std::string
时出现异常,可能是在结尾处建立索引。

这种情况通常发生在使用指向无效数据的函数指针时。
如果您有破坏返回堆栈的代码,也可能发生这种情况。有时要追踪这些类型的bug可能会非常棘手,因为它们通常很难重现。

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

特权指令是只允许在环0(即内核模式)下执行的IA-32指令。如果您在用户空间中遇到此问题,则可能是一个非常旧的EXE,或者是一个已损坏的二进制文件。

我觉得错误位置0x00486752非常小,在可执行代码通常存在的位置之前。我同意Daniel的观点,它看起来像是指向我的一个疯狂的指针。

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

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


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

因为我怀疑这是我做的傻事。我想我解决这个问题的速度快了一倍,因为上面信息中的评论中有一些线索。感谢那些特别是那些在应用程序早期指向某个内容覆盖堆栈的人。事实上,我发现这里有几个答案比我标记为回答问题的帖子更有用,因为他们把我排在队列里,告诉我该去哪里找,尽管我认为这是对答案的最好总结

事实证明,我刚刚添加了一个按钮,该按钮超过了保存某些工具栏按钮信息(位于堆栈上)的数组的最大大小。我忘了

#define MAX_NUM_TOOBAR_BUTTONS (24) #定义最大数量按钮(24)
甚至存在

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


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

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


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

实际上是VC6。但不是C++,虽然很多零结尾的字符串。(我可以使用新的编译器,但有传言说VC6对于C来说实际上更快,而不是C++)。我怀疑这是一个编译器错误,虽然。。。(我总是发现这是一个“我当时在想什么”的时刻)。大约10秒前我用VC6编译的exe。。。。但is确实包含指向ODBC.LIB和其他可能非常旧的LIB的链接。此应用程序不是驱动程序或服务。