一、NTSTATUS介紹
NTSTATUS是Windows操作系統內核自身使用的一組狀態碼,它主要用於標示系統內部發生的各種錯誤和警告信息,以及判斷一些操作的執行情況等。NTSTATUS由四個字節組成,每個字節表示一個不同的信息,包括消息等級、消息源、消息類型和消息代碼。
NTSTATUS定義在winnt.h頭文件中,定義格式為0x12345678,其中每個數字代表狀態碼不同的部分。Windows內核使用NTSTATUS值將錯誤和狀態信息傳遞給應用程序和其他內核組件,華麗大氣、上檔次,因此NTSTATUS不僅僅是開發人員面對的問題,對系統管理員和維護工程師來說也是非常重要的。
二、NTSTATUS查詢
在進行系統調試和日誌分析時,NTSTATUS查詢非常有用。Windows SDK內附帶了一個工具Err.exe,可以根據錯誤代碼返回對應的錯誤信息。只需要在命令行窗口中輸入“Err 錯誤代碼”即可顯示錯誤信息。對於經常使用的錯誤代碼,可以將其添加到自定義批處理文件中,方便快捷地進行查詢。
Err c0000005
該命令將會返回如下信息:
# for hex 0xc0000005 / decimal -1073741819 : STATUS_ACCESS_VIOLATION ntstatus.h # Access violation. <==是我們能從返回值判斷到的異常名稱 # 1 matches found for <00000005>
除此之外,大量的開發文檔也會提供NTSTATUS碼列表,例如MSDN網站提供的NTSTATUS文檔,這些資料對於開發人員能夠做到事半功倍,非常有價值。
三、NTSTATUS錯誤碼
NTSTATUS錯誤碼是非常常見的系統錯誤碼,包含了系統的大多數錯誤信息。下面選取一些常見的NTSTATUS錯誤碼做簡單介紹:
1、0xc0000005 ACCESS_VIOLATION
ACCESS_VIOLATION指的是程序試圖讀取或者寫入一個沒有權限的地址,當程序訪問內存地址錯誤時,系統將會返回該錯誤碼。通常出現在訪問非法內存地址的情況下,例如空指針處理等。
2、0xC00000FD STACK_OVERFLOW
STACK_OVERFLOW表示程序的調用棧已經超過了設定的棧大小,當棧空間被耗盡時,系統將會返回該錯誤碼。棧溢出通常是由於遞歸或者線程創建等問題引發的。
3、0xC0000139 ENTRY_POINT_NOT_FOUND
ENTRY_POINT_NOT_FOUND表示程序試圖調用一個不存在的函數或者DLL,當動態鏈接庫導出的函數名錯誤或丟失時,系統將會返回該錯誤碼。
四、NTSTATUS error
在使用NTSTATUS進行開發時,常常遇到由NTSTATUS error引起的錯誤,通常需要進行一些解決方法的查找和分析。
1、錯誤分析
發生NTSTATUS error的原因非常多樣化,可能是程序代碼錯誤、系統配置錯誤、環境錯誤等。由於Windows內核使用增量式更新的方式進行更新,因此某些標準API在不同版本的Windows下表現可能不盡相同,也容易造成NTSTATUS error出現。
2、解決方法
解決NTSTATUS error可以採用如下方式:
1)調整API參數
看看錯誤信息是否指向了API調用的問題,如果確實是API提供的問題,需要重新編碼並根據Windows版本調整API參數。
2)更新驅動程序
若是驅動程序相關問題,需要查找並安裝最新版本的驅動程序。
3)使用其他API或庫
如果發現某API或庫很難解決NTSTATUS error問題,可以考慮使用其他API或庫代替。
五、NTSTATUS Login Failure怎麼解決
NTSTATUS Login Failure(登錄失敗)通常是由於賬戶密碼錯誤、權限設置不正確或者域控制器故障等因素引起的。下面提供一些常見的解決方法:
1、檢查賬戶和密碼
首先需要檢查用戶名和密碼是否正確,檢查賬戶是否受到了鎖定控制。如果賬戶密碼被鎖定需要等待一段時間後再進行登錄。
2、檢查權限設置
確保有關用戶的組和權限設置正確。必要時可以嘗試更改用戶組和權限等操作.
3、檢查域控制器
如果是與域相關的登錄問題,需要檢查域控制器是否正常運行、網絡連接是否暢通等原因,可以嘗試重新設置域控制器或者更改域的設置等操作。
代碼示例
下面是一個NTSystem調用中的例子,該函數使用ZwClose()搭配NTSTATUS返回值來實現對象的關閉。
NTSTATUS
NTAPI
NtClose(
IN HANDLE Handle
)
{
return ZwClose(Handle);
}
NTSTATUS
NTAPI
ZwClose(
IN HANDLE Handle
)
{
OBJECT_ATTRIBUTES ObjectAttributes;
InitializeObjectAttributes(
&ObjectAttributes,
NULL,
OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
NULL,
NULL);
return ObCloseHandle(
Handle,
&ObjectAttributes
);
}
總結
NTSTATUS狀態碼在Windows內核開發中非常重要,對於開發人員、系統管理員和維護工程師都有着重要的意義。通過了解NTSTATUS碼的定義、查詢方式以及一些常見的錯誤和解決方法,可以幫助我們更好地理解和解決系統問題。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/295728.html
微信掃一掃
支付寶掃一掃