Перейти к содержимому
www.mytechnote.ru
Меню
  • Администрирование
    • Скрипты
  • Оборудование
    • Обзоры
    • Инструкции
  • Прочее
  • Русский
    • English
    • Русский
Меню

Проблема при использовании библиотеки PassFiltEx на старых процессорах

Довольно давно используем библиотеку PassFiltEx у одного из наших заказчиков для того, чтобы избегать использования пользователями простых паролей (библиотека сверяет пароли с черными списками).

Недавно потребовалось выполнить её обновление, и столкнулись с проблемой — на одном из контроллеров домена, после обновления библиотеки система уходила в циклическую перезагрузку. После отката библиотеки из WinPE, в логах было обнаружено следующее

The process wininit.exe has initiated the restart of computer DC01 on behalf of user for the following reason: No title for this reason could be found Reason Code: 0x50006 Shutdown Type: restart Comment: The system process ‘C:\Windows\system32\lsass.exe’ terminated unexpectedly with status code -1073741795. The system will now shut down and restart.

Ошибка -1073741795 – это STATUS_ILLEGAL_INSTRUCTION.

Дальнейший анализ показал, что автор по скомпилировал библиотеку так, что она в обязательном порядке использует инструкции AVX/AVX2. После её компиляции вручную, с указанием соответствующих ключей, проблема на старых системах не возникла.

Команда для компиляции:

clang -target x86_64-pc-windows-msvc -shared -o .\bin\release\%PROJECTNAME%.dll *.c -Wall -Wextra -Wformat -O3 -D_WIN64 -march=x86-64 -mno-avx -mno-avx2 -mno-avx512f -mprefer-vector-width=128 -fms-runtime-lib=static -lkernel32 -Wl,%PROJECTNAME%.res

Запускать её нужно из x64 native tools command prompt for VC.

К слову, посмотреть требуемые инструкции можно командой (также из командной строки разработчика нужно запускать):

dumpbin /disasm passfiltex.dll > disasm.txt

В выводе нужно обращать внимание на регистры ymm1, ymm2 и инструкции начинающиеся на v (vmovdqa, vmovaps, vpxor, vpaddq).

Соответственно, на машине должны быть установлены соответствующие инструменты (Visual Studio, в нём поддержка C++, средства cmake, C++ clang, MSVC и т.п.  точный набор не скажу, смотрите по ситуации, чуть что ИИ в помощь.

Обновлённый полный скрипт для компиляции:

@echo off
REM ====================================
REM  Build script for PassFiltEx  
REM  Joseph Ryan Ries 2025         
REM ====================================
set "PROJECTNAME=PassFiltEx"
set "RCEXE="C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x64\rc.exe""
set "INCPATH1="C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\um""
set "INCPATH2="C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\shared""

%RCEXE% /nologo /r /i %INCPATH1% /i %INCPATH2%  %PROJECTNAME%.rc
if "%~1"=="" goto no_args
if "%~1"=="debug" goto debug_build
if "%~1"=="release" goto release_build
:no_args
echo Must specify either debug or release!
exit
:debug_build 
if not exist .\bin\ mkdir .\bin
if not exist .\bin\debug\ mkdir .\bin\debug
clang -shared -o .\bin\debug\%PROJECTNAME%.dll *.c -Wall -Wextra -Wformat -march=x86-64-v3 -O0 -g3 -D_DEBUG -D_WIN64 -Wl,%PROJECTNAME%.res
if %ERRORLEVEL% neq 0 goto build_fail
echo Debug build succeeded.
exit
:release_build
if not exist .\bin\ mkdir .\bin
if not exist .\bin\release\ mkdir .\bin\release
REM Оригинальная команда
REM clang -target x86_64-pc-windows-msvc -shared -o .\bin\release\%PROJECTNAME%.dll *.c -Wall -Wextra -Wformat -march=x86-64-v3 -O3 -D_WIN64 -Wl,%PROJECTNAME%.res

REM Измененная команда! Запускать из x64 native tools command prompt for VC
clang -target x86_64-pc-windows-msvc -shared -o .\bin\release\%PROJECTNAME%.dll *.c -Wall -Wextra -Wformat -O3 -D_WIN64 -march=x86-64 -mno-avx -mno-avx2 -mno-avx512f -mprefer-vector-width=128 -fms-runtime-lib=static -lkernel32 -Wl,%PROJECTNAME%.res

if %ERRORLEVEL% neq 0 goto build_fail
echo Release build succeeded.
exit
:build_fail
echo **** BUILD FAILURE ****
exit %ERRORLEVEL%

И на всякий случай, скомпилированная таким образом библиотека (версия 1.6.3.0).

Опубликовано в 13.03.202613.03.2026 от sanglyb

Навигация по записям

← Как удалить вложения из старых событий календаря в Exchange с помощью скрипта
Исправление ошибки SrsResources.dll после обновления SSRS для SCCM →

Добавить комментарий Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Подписывайтесь

Youtube
vk
telegram
github
twitter
rss
  • Форум
  • Об авторе
  • Поддержать автора

Популярные записи

Новые записи

  • Как расширить LVM раздел в Linux
  • Исправление ошибки SrsResources.dll после обновления SSRS для SCCM
  • Проблема при использовании библиотеки PassFiltEx на старых процессорах
  • Как удалить вложения из старых событий календаря в Exchange с помощью скрипта
  • Как скачать и установить Office 2024 LTSC

Архивы

  • 2026 (3)
  • 2025 (5)
  • 2024 (7)
  • 2023 (6)
  • 2022 (5)
  • 2021 (25)
  • 2020 (34)
  • 2019 (39)
  • 2018 (78)
  • 2017 (56)
  • 2016 (77)
  • 2015 (9)
© 2015-2026 www.mytechnote.ru
Использование материалов сайта возможно только с разрешения владельца или обязательна индексируемая, прямая, передающая вес ссылка на материал.