Программирование драйверов Windows

       

Типы возвращаемых значений функций


Все функции, описываемые в языке С, либо возвращают значение определенного типа, либо не возвращают ничего (в последнем случае они описываются типом void). В переводе на новые термины, предлагаемые DKK, функции возвращают значения типа CHAR, UCHAR, SHORT, USHORT и т.п., либо описываются как VOID функции.

В дополнение к этим, знакомым и понятным типам функций в DDK добавлен тип NTSTATUS. Что означает этот новый тип?

Тип NTSTATUS несет код завершения функции и, на самом деле, является простым переопределением типа integer long, что можно увидеть, например, в файле ntdef.h, а именно:

typedef LONG NTSTATUS; typedef NTSTATUS *PNTSTATUS;

Неотрицательные значения переменных этого типа (попросту говоря, неотрицательные целые значения) относятся к кодам удачного завершения и предупреждениям, отрицательные &#8212 сигнализируют об ошибке.

Когда Диспетчер ввода/вывода вызывает одну из процедур драйвера, а она возвращает ему управление, передавая при этом код NTSTATUS, то сигнализирует ему об условиях окончания работы. Файл NTSTATUS.h содержит символьные имена для всех возможных значений кодов NTSTATUS.

Код, сообщающий об удачном завершении, носит имя STATUS_SUCCESS (кстати, равный 0). В случае, если работа завершена с ошибкой, код неудачного завершения, например, STATUS_UNEXPECTED_IO_ERROR (равный 0xC00000E9), транслируется системой в системный код ошибки и передается пользовательскому приложению, для которого работала данная процедура драйвера.

Для работы с кодами завершения NTSTATUS существуют несколько полезных макроопределений (описанных в файле ntdef.h), среди которых самым употребительным является макроопределение NT_SUCCESS(). При употреблении в логических выражениях, оно позволяет проверять, означает ли анализируемый код удачное завершение работы, например:

NTSTATUS Status = IoConnectInterrupt(); if( !NT_SUCCESS(Status) ) { &#60обработка ошибки&#62 }



Содержание раздела