Обработка ошибок/Коды состояния

23 января 2012

Вспомогательные функции режима ядра (а также Ваш код) обозначают успешное или неудачное завершение операции, возвращая код состояния вызывающей стороне. Значение NTSTATUS представляет собой 32-разрядное целое, состоящее из нескольких полей. Старшие 2 бита обозначают степень «серьезности» состояния — успешное завершение, передача информации, предупреждение или ошибка.

Смысл флага клиента объясняется далее. Код подсистемы указывает, от какого системного компонента исходит сообщение; в сущности, он позволяет разделить группы разработчиков в отношении присваивания числовых кодов ошибкам. Остаток кода состояния - 16 разрядов - описывает конкретное состояние.

Всегда проверяйте коды состояния, возвращаемые функциями. Если старший бит кода состояния равен 0, любые из остальных битов могут быть установлены, а код является признаком успеха А это означает, что для проверки успешного завершения операции никогда не следует сравнивать код с 0 — вместо этого воспользуйтесь макросом NT_SUCCESS:

NTSTATUS status = SomeFunction (…);

if (!NT SUCCESS(status))

{

// Обработка ошибки

}

Программист должен не только проверять коды состояния, полученные от вызываемых функций, но и возвращать коды тем функциям, которые обращаются к его коду. Если при выполнении функции возникают проблемы, часто требуется вернуть соответствующий код состояния; иногда его значение совпадает с тем кодом, который был получен вами при вызове другой функции. Конечно, ошибки при вызове функций должны приводить к возврату кода ошибки. Иногда ошибку можно просто игнорировать.

Для определения причины неудачи можно вызвать функцию GetLastError. Если неудача обозначается кодом состояния с установленным флагом клиента, GetLastError вернет именно этот код состояния. Если же флаг клиента в коде состояния равен 0 (это относится ко всем стандартным кодам состояния, определяемым Microsoft), GetLastError возвращает значение из файла WINERROR.H, входящего в Platform SDK. Соответствие между возвращаемыми значениями GetLastError и кодами состояния ядра документировано в статье Knowledge Base Q113996, «Mapping NT Status Error Codes to Win32 Error Codes».

Рейтинг@Mail.ru