2008-09-18 175 views
22

我加入了一些代碼,編譯乾淨,剛剛收到此Windows錯誤:什麼是特權指令?

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

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

我即將去一個錯誤的追捕,而我希望它是我做了一些愚蠢剛剛恰好產生這個信息。代碼乾淨地編譯,沒有錯誤或警告。 EXE文件的大小已增加到1,454,132字節,並且包含指向ODCS.lib的鏈接,但是對於Win32 API,其DEBUG打開(在Windows上的P4上運行,在  2000上)。

回答

29

要回答這個問題,特權指令是一個只能在「supervisor」(或Ring-0)模式下執行的處理器操作碼(彙編指令)。 這些類型的指令通常用於從Windows內核訪問I/O設備和受保護的數據結構。

常規程序來執行在「用戶模式」(環3),不允許對I/O裝置等直接訪問...

正如其他提到的,原因可能是一個已損壞的堆或弄亂函數指針調用。

2

我在2000年

調試C++庫不得不在它的物理I/O指令調用,在異常處理程序看到這個用Visual C++ 6.0。 如果我沒有記錯的話,它會將狀態轉儲到一個曾經用於DMA基址寄存器的I/O端口,我假定有人在微軟用於調試卡。

查找可能導致診斷代碼運行的潛在錯誤。

我在調試,回溯並讀取反彙編。在處理std::string時,這是一個例外,也許索引結束。

+0

它實際上是VC6。但不是C++,儘管大量的零終止字符串。 (我可以使用新的編譯器,但已經聽說過VC6實際上比C更快,而不是C++)。我懷疑這是一個編譯器錯誤,儘管......(我總是發現它就是其中之一 - 「我在想什麼」時刻)。 – 2008-09-18 03:08:13

7

這種事情通常發生在使用指向無效數據的函數指針時。 如果您的代碼會損壞您的返回堆棧,也會發生這種情況。追蹤這些錯誤有時會非常棘手,因爲它們通常很難再現。

4

我能想到的第一種可能性是,您可能正在使用本地數組,並且它靠近函數聲明的頂部。你的邊界檢查瘋了,覆蓋返回地址,它指向一些只允許內核執行的指令。

6

特權指令是IA-32指令,只允許在Ring-0(即內核模式)中執行。如果你在用戶空間中擊中了這個,你要麼有一個非常舊的EXE,要麼是一個損壞的二進制文件。

+0

大約10秒前我使用VC6編譯的exe文件......但它確實包含了ODBC.LIB和其他可能相當老的libs的鏈接。此應用程序不是驅動程序或服務。 – 2008-09-18 03:10:27

2

錯誤位置0x00486752對於我來說似乎真的很小,在可執行代碼通常存在的地方。我同意丹尼爾的觀點,它看起來像是一個狂野的指針。

3

正如我懷疑這是我做的事情愚蠢。我想我解決這個問題的速度是上述消息中的一些線索。感謝那些特別指出應用程序早期覆蓋堆棧的人。實際上,我在這裏找到了幾個答案,這些答案更有用,我標記爲回答問題的帖子,因爲他們提出了問題並排隊等待我去哪裏尋找答案,儘管我認爲最好總結答案。

事實證明,我剛剛添加了一個按鈕,超過了一個數組的最大大小,其中包含一些工具欄按鈕信息(位於堆棧中)。我忘記了

 
#define MAX_NUM_TOOBAR_BUTTONS (24) 

甚至存在!

2

過去15年製造的大多數處理器的CPU都有一些非常強大的特殊指令。這些特權指令保留用於操作系統內核應用程序,並且不能由用戶編寫的程序使用。

這限制了用戶編寫的程序可能對系統造成的損害,並減少了系統實際崩潰的次數。

2

在內核模式下執行時,操作系統可以不受限制地訪問內核和用戶程序的內存。

基本和限制寄存器的加載指令是特權指令。