Показаны сообщения с ярлыком WDK. Показать все сообщения
Показаны сообщения с ярлыком WDK. Показать все сообщения

вторник, 6 марта 2012 г.

WDK: RTL_INIT_OBJECT_ATTRIBUTES

Недавно узнал что в WDK есть макрос RTL_INIT_OBJECT_ATTRIBUTES, позволяющий совместить объявление переменной типа OBJECT_ATTRIBUTES и её инициализацию. В сочетании с макросом RTL_CONSTANT_STRING (для объявления и инициализации переменной типа UNICODE_STRING) повышает читаемость кода.

UNICODE_STRING someUnicodeString = RTL_CONSTANT_STRING(L"\\SystemRoot");

OBJECT_ATTRIBUTES objAttr = RTL_INIT_OBJECT_ATTRIBUTES(&someUnicodeString, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE);

понедельник, 30 мая 2011 г.

Microsoft Certified Technology Specialist: Windows Internals

На днях сдал сертификационный экзамен 70-660: TS: Windows® Internals.

К экзамену не готовился. Во-первых, некогда; а, во-вторых, так даже интереснее. В итоге, набрал 783 балла из 1000 (необходимый минимум - 700).

Хочу сказать что экзамен вполне адекватен. Затрагивается масса аспектов системной разработки а так же содержится очень много вопросов практического характера. Попадались вопросы на которые затруднялся дать однозначный ответ. Выводы сделал, пробелы в знаниях восполняю по мере возможности :)

Собственно, сертификат:

четверг, 26 мая 2011 г.

WinError.exe

Кому из разработчиков не доводилось расшифровать коды ошибок WINERROR или NTSTATUS?

Для быстрого получения вменяемого описания, я, как правило, пользовался поиском в заголовочных файлах:
  • %WDKPATH%\inc\api\ntstatus.h для NTSTATUS.
  • %WDKPATH%\inc\api\WINERROR.H для WINERROR.

Но есть более простой и удобный способ - использовать WinError.exe из набора WDK. Утилита отображает название констант(ы) для указанного кода ошибки. Кроме этого, она так-же показывает соответствие между кодом ошибки WINERROR и NTSTATUS.

Пример использования (если передаваемое значение представляет собой NTSTATUS, следует указать ключ -s):
%WDKPATH%\tools\Other\i386\WinError.exe -s 0xC000000D
    87 ERROR_INVALID_PARAMETER <--> c000000d STATUS_INVALID_PARAMETER

Updated 7.06.2011

А так же можно воспользоваться расширением !error из WinDbg (спасибо Volodymyr Pikhur за подсказку).

Схожие публикации

суббота, 7 мая 2011 г.

Cmd: Backup/Clear/Restore environment variables

Публикация в первую очередь будет интересна тем, кто использует WDK/DDK для сборки чего-либо (например, драйверов). Но возможно пригодится ещё кому-то.

Проблема

При сборке из командной строки setenv.bat устанавливает переменные окружения таким образом что повторный вызов этого командного файла генерирует сообщение:
ERROR: This window already has the DDK build environment set.  Please open 
       a new window if you want to change or reset your build environment.
Как правило, для сборки под несколько платформ из одного командного файла нужно создавать дополнительные скрипты, что не всегда удобно.

Решение

пятница, 22 апреля 2011 г.

VeriSign "Signtool Error: The provided cross certificate would not be present in the certificate chain."

Проблема

Попытка подписать драйвер сертификатом от VeriSign и кросс-сертификатом от Microsoft:
%WDKPATH%\Bin\x86\signtool.exe sign /v /ac MSCV-VSClass3.cer /f cert.pfx /p password /t http://timestamp.verisign.com/scripts/timtamp.dll driver.sys
Не увенчалась успехом:
Signtool Error: The provided cross certificate would not be present in the certificate chain.
Алгоритм подписания рабочий и проверенный. Изучение базы знаний US Home > Support > Code Signing Support с ходу результата не дало.

Решение

воскресенье, 20 марта 2011 г.

Макросы с переменным количеством аргументов

Проблема

Есть набор макросов:
#define DBGPRINT(Level, Prefix, Fmt)  \
{                                     \
    if ((Level) >= gDbgLevel)    \
    {                                 \
        DbgPrint(DBGPRINT_PREFIX": %s", Prefix); \
        DbgPrint Fmt;                 \
    }                                 \
}

#define TERSE_FN(Fmt) DBGPRINT(DBG_LEVEL_TERSE, __FUNCTION__"(): ", Fmt)
Данные макросы позволяют выводить отладочную информацию в формате:
MyPrefix: FunctionName(): FormattedMessage
На первый взгляд всё нормально. Но если TERSE_FN вызывается из двух потоков:
Thread 1: TERSE_FN(("Important message with status: %x\n", status));
Thread 2: TERSE_FN(("Another important message with status: %x\n", status));
вывод может быть неконсистентным из за асинхронного использования DbgPrint:
MyPrefix: MyPrefix: Function2(): Another important message with status: 00000000
Function1(): Important message with status: 00000000
Решение