четверг, 23 июня 2011 г.

Cmd: Detect 64-bit Windows

Windows 64-bit присутствует на рынке довольно давно, но несмотря на это, не перестаёт удивлять разнообразие методов (не всегда корректных) определения разрядности системы в cmd скриптах.

В качестве примера, рассмотрим популярные ответы на вопрос Detect Windows Server version 32/64-bit in CLI на сайте superuser.com:
  1. systeminfo | find /I "System type"
    
    Недостатки: Во первых, работает медленно. Во вторых, не будет работать если используется локаль отличная от английской. В третьих, необходимо дополнительно проводить разбор вывода.

  2. Arch=x86
    if exist "%ProgramFiles(x86)%" set Arch=x64
    
    Недостаток: Условие отработает некорректно если существует директория с таким именем. Редкий случай, но тем не менее возможный.

  3. reg.exe query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" | find "BuildLabEx"
    
    Недостаток: Необходим дополнительный разбор вывода.

  4. wmic OS get OSArchitecture
    
    Недостаток: Необходим дополнительный разбор вывода.

  5. set Arch=x64
    if "%PROCESSOR_ARCHITECTURE%" == "x86" ( 
        if not defined PROCESSOR_ARCHITEW6432 set Arch=x86
    )
    
    Недостатки: пока не обнаружены.
    Продолжительное время успешно использую данный метод. К тому же, при желании можно уточнить актуальную архитектуру: x86, amd64, ia64.
А какой способ используете Вы?

четверг, 16 июня 2011 г.

Cmd: reg.exe undocumented /reg switch

Задача

Из командного файла прочитать значение в реестре. В 64-х разрядной системе, в зависимости от условия читать из 32-х или 64-х битной ветки. Если используется 64-х битная версия cmd.exe, всё относительно просто: в зависимости от условия читать из HKLM\Software или HKLM\Software\Wow6432Node.

В 32-х битной версии командного интерпретатора (Post-Build Event в Visual Studio) этот способ не работает, т.к. запросы reg.exe перенаправляются подсистемой WOW64 в HKLM\Software\Wow6432Node.

Решение

Как подсказывает заголовок, reg.exe имеет недокументированный ключ /reg:. После двоеточия, без пробела, следует указать требуемую разрядность ("32" или "64"). Этот ключ работает в 32-х битной и 64-х битной версии утилиты, поэтому грамотно созданный командный файл будет корректно работать в интерпретаторе любой разрядности.

Пример использования (на всякий случай):
reg.exe query HKLM\Software\Python\PythonCore\2.6\InstallPath /ve /reg:64

Рабочая среда: Windows 7 x64

вторник, 7 июня 2011 г.

WinDbg: !error extension and locale

Проблема

WinDbg имеет весьма полезное расширение !error которое декодирует код ошибки и отображает соответствующее описание.

Но, порой, вместо описания можно увидеть ошибку <unable to get error code text> если отладка происходит в режиме пользователя:
0:000> !error 0xC000000D 1
Error code: (NTSTATUS) 0xc000000d - <unable to get error code text>
Так же, можно увидеть пустую строку или часть сообщения если запущена отладочная сессия ядра:
0: kd> !error 87
Error code: (Win32) 0x87 (135) -                              JOIN     SUBST          ,                          .
Последний вывод, кстати, наталкивает на мысль о том что проблема с локалью.

понедельник, 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 за подсказку).

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

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

Установка pykd (updated)

Начиная с версии 0.0.17, расширения pykd, был существенно переработан инсталлятор. Не смотря на то, что релиз состоялся более месяца тому, данная публикация не утратила своей актуальности.

Попав в раздел Downloads, главной страницы проекта, можно немного растеряться. Поэтому, приведу краткое описание возможных вариантов:
  • pykd-0.0.XX-python-2.6.zip - расширение без каких-либо дополнительных файлов. Для работы требуется Microsoft Visual C++ 2005 SP1 Redistributable Package и Python 2.6.
  • pykd_x86_0.0.0.XX_setup.exe - инсталлятор для 32-х битной версии WinDbg.
  • pykd_x64_0.0.0.XX_setup.exe - инсталлятор для 64-х битной версии WinDbg.
  • pykd-0.0.XX-python-2.7-vc90.zip - то же что и первый пункт, но для работы требуется Microsoft Visual C++ 2008 Redistributable Package и Python 2.7.

Расширение из архива устанавливается вручную.

Далее будет рассмотрено как это сделать с помощью инсталлятора.

Перед тем как продолжить, хочу обратить особое внимание на то что разрядность pykd, соответственно, Python, VC++ Runtime и инсталлятора должна соответствовать разрядности WinDbg. Например, Вы ставите 64-х битную версию расширения и у Вас уже стоит Python для x86. Расширение не будет работать если не установить соответствующую версию Python как предложит инсталлятор.

Возможности инсталлятора:
  • Собственно, установка расширения.
  • Установка скриптов и примеров (в директорию Мои документы\pykd).
  • Добавление пути к директории скриптов в PYTHONPATH. Что бы не вводить полный путь к нужному скрипту.
  • Добавление пути к расширению в PYTHONPATH. Для использования pykd из интерпретатора Python.
  • Проверка наличия Python-а и VC++ Runtime. При необходимости автоматическая загрузка и установка.
  • Запоминание директории установки расширения.
Возможности деинсталлятора:
  • Удаление расширения.
  • Опционально, удаление Python и VC++ Runtime.

суббота, 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.
Как правило, для сборки под несколько платформ из одного командного файла нужно создавать дополнительные скрипты, что не всегда удобно.

Решение