2014-02-13 24 views
0

在我的C++ Windows應用程序中,收到在重疊I/O操作失敗後使用GetLastError()看起來無效的系統錯誤代碼。接收到無效的Windows系統錯誤代碼

// Code 
DWORD errorCode = GetLastError(); 
loggerInt1(LOGERROR, "failed getIoResult, errorCode %d", (int)errorCode); 

// Log file 
failed getIoResult, errorCode -1073741781 
failed getIoResult, errorCode -1073741781 
failed getIoResult, errorCode -1073741781 
//... many more times at different time points 

errorCode是一個DWORD,它是一個無符號長整型,我將它轉換爲int。但是Windows系統錯誤代碼只能在0到15999之間,並且在int內。

-1073741781在32位系統(我的)上是C000 002B,在64位系統上是FFFF FFFF C000 002B。解釋爲無符號長的它是3,221,225,515(32位)或一些奇怪的巨大數字(64位)。無論哪種方式,它都遠遠超出了Windows系統錯誤的0-15999範圍。

這怎麼可能?爲什麼我得到這樣一個錯誤代碼有一個理智的理由嗎?

+1

什麼是失敗的API?請記住,如果以前的API調用沒有失敗,那麼'GetLastError'返回的值是不確定的。 –

回答

2

0xC000002B是NTSTATUS代碼,它解析爲STATUS_PARITY_ERROR

沒有合同協議,這裏存儲的值是一個標準的Win32錯誤代碼。爲GetLastError文檔依稀意味着這樣的:

由函數返回的錯誤碼是不是Windows API 說明書的一部分,並且可以由操作系統或設備驅動程序而變化。出於這個原因,我們無法提供的,可以通過各功能

標準的錯誤代碼是有據可查的返回錯誤代碼的完整列表,所以上面的語句將沒有多大意義,如果所有可能的結果是開始瞭解。

請注意,某些WINAPI也可以返回HRESULT值。

+0

我知道用戶應用程序可以執行SetLastError(),但絕對不是我的代碼。所以它必須來自操作系統或驅動程序代碼。任何關於如何從GetOverlappedResult()系統調用發出這樣的錯誤的想法?我想將問題隔離到操作系統或驅動程序。謝謝。 –

+0

考慮到這是一個奇偶校驗錯誤,它可能來自正在討論的硬件設備的驅動程序。 –

相關問題