C 什么是特权指令?
我添加了一些编译干净的代码,刚刚收到此Windows错误: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
---------------------------
(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的链接。此应用程序不是驱动程序或服务。