Довольно давно используем библиотеку 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).
