2016-06-03 4 views
1

Ich habe die FormatMessage-Funktion in der Windows-API verwendet, um Nachrichtenfolgen aus Systemfehlercodes zu generieren. Ich habe festgestellt, dass bei einigen Fehlercodes die vollständige Nachricht nicht erstellt wird.Warum erstellt FormatMessage nur Teilnachrichten für die Systemfehler ERROR_SYSTEM_PROCESS_TERMINATED und ERROR_UNHANDLED_EXCEPTION?

dieses Beispielprogramm als Beispiel:

int main() 
{ 
    wchar_t * buffer = nullptr; 
    FormatMessageW(
    FORMAT_MESSAGE_FROM_SYSTEM 
    | FORMAT_MESSAGE_ALLOCATE_BUFFER 
    | FORMAT_MESSAGE_IGNORE_INSERTS, 
    nullptr, 
    ERROR_SYSTEM_PROCESS_TERMINATED, 
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
    reinterpret_cast<LPWSTR>(&buffer), 
    0, 
    nullptr); 

    std::wcout << buffer << std::endl; 
    return 0; 
} 

MSDN Laut ich sollte folgendes sehen:

{Fehler Fatal System}
Die% hs Systemprozess unerwartet mit einem beendet Status von 0x% 08x (0x% 08x 0x% 08x). Das System wurde heruntergefahren.

jedoch im Beispielprogramm werde ich sehen:

{Schwere Systemfehler}
Der% hs Systemprozess unerwartet mit einem Status von

0x beendet

Ich bemerkte, dass ERROR_UNHANDLED_EXCEPTION erstellt auch nicht die vollständige Nachricht (im Vergleich zur Liste auf MSDN). Beide erwarteten Nachrichten enthalten 0x% 08 Platzhalter, aber die Nachricht endet nach 0x.

Von dem was ich sehen kann, scheinen andere Fehlermeldungen den Listen auf MSDN zu entsprechen (d. H. Das Problem scheint auf ERROR_UNHANDLED_EXCEPTION und ERROR_SYSTEM_PROCESS_TERMINATED beschränkt zu sein).


Credit engf-010 - Sie das gleiche, wenn Sie die Fehlersuche-Tool in Visual Studio verwenden (Tools - Fehlersuche). Die Fehlercodes sind 574 und 591.


Weiß jemand, warum diese Nachrichten abgeschnitten werden?

Gibt es trotzdem die vollständige Nachricht?

+0

Sie sollten immer den Rückgabewert von Systemaufrufen überprüfen! Es könnte ein wenig Licht auf Ihr Problem werfen. –

+0

@ engf-010 - Wenn ich den letzten Fehler vor 'FormatMessageW' auf 0 setze, wird' GetLastError() 'unmittelbar nach' FormatMessageW' als 0 angezeigt. – camelCase

+0

Als Randnotiz sollten Sie 'LocalFree' /' HeapFree' den Puffer verwenden zurückgegeben, wenn 'FORMAT_MESSAGE_ALLOCATE_BUFFER' verwendet wird. Auch wenn das in diesem kleinen Beispiel vielleicht nicht relevant ist. –

Antwort

2

Die Nachrichten, die Sie erwähnen (ERROR_UNHANDLED_EXCEPTION und ERROR_SYSTEM_PROCESS_TERMINATED), haben printf-artige Einfügungen (%08x). FormatMessage verwendet jedoch% 0, um eine Nachricht zu beenden.

Meine Vermutung ist, dass es eine andere Möglichkeit gibt, wo diese Nachrichten vom System mit den bereits platzierten printf-style Platzhaltern zurückgegeben werden; Diese Nachrichten sollen in ihrer rohen Form nicht von FormatMessage verarbeitet werden.

Vorausgesetzt, dass diese Nachrichten den Text (Fatal System Error) oder (Application Error) enthalten, ist es nicht verwunderlich, dass Windows diese Nachrichten speziell behandelt.

+0

Ich bin eher geneigt zu glauben, dass der Rückgabewert von [FormatMessage] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms679351.aspx) nicht heruntergespült werden sollte drains ... – IInspectable

+0

* "Da dies fatale Systemfehler sind" * - Nein, sind sie nicht. Sie sind (potentiell) fatale Prozessfehler. Nichts, um das sich das System Sorgen macht. Der Kernel zerstört die Prozessobjekte und geht weiter. Das passiert die ganze Zeit. – IInspectable

+0

@Intspectable Ich habe die Antwort aktualisiert, um anzuzeigen, dass diese Terminologie (Fataler Systemfehler) aus dem Text der Fehlermeldung stammt. – jdigital