diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 816f484..d76111b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -41,6 +41,26 @@ jobs: export PATH="$IQTA_TOOLS/mingw1310_64/bin:$PATH" cmake --build build + - name: Install WDK NuGet + shell: pwsh + run: | + nuget install Microsoft.Windows.WDK.x64 -OutputDirectory wdk_pkg + $ntddk = Get-ChildItem wdk_pkg -Recurse -Filter "ntddk.h" | + Where-Object { $_.DirectoryName -like "*km*" } | + Select-Object -First 1 + if (!$ntddk) { throw "ntddk.h not found in WDK NuGet package" } + $kmDir = $ntddk.DirectoryName + $incRoot = Split-Path $kmDir -Parent + Write-Host "WDK include root: $incRoot" + echo "WDK_INC_ROOT=$incRoot" >> $env:GITHUB_ENV + $ntos = Get-ChildItem wdk_pkg -Recurse -Filter "ntoskrnl.lib" | + Where-Object { $_.DirectoryName -like "*x64*" } | + Select-Object -First 1 + if (!$ntos) { throw "ntoskrnl.lib not found in WDK NuGet package" } + $libRoot = Split-Path (Split-Path $ntos.DirectoryName -Parent) -Parent + Write-Host "WDK lib root: $libRoot" + echo "WDK_LIB_ROOT=$libRoot" >> $env:GITHUB_ENV + - name: Build kernel driver shell: cmd run: call plugins\KernelMemory\driver\build_driver.bat diff --git a/plugins/KernelMemory/driver/build_driver.bat b/plugins/KernelMemory/driver/build_driver.bat index 17ad279..e6f322f 100644 --- a/plugins/KernelMemory/driver/build_driver.bat +++ b/plugins/KernelMemory/driver/build_driver.bat @@ -1,36 +1,43 @@ @echo off setlocal enabledelayedexpansion -:: ── Auto-detect MSVC ── -set "VSBASE=C:\Program Files\Microsoft Visual Studio\2022" -set MSVC= -for %%E in (Enterprise Professional Community BuildTools) do ( - if exist "!VSBASE!\%%E\VC\Tools\MSVC" ( - for /f "delims=" %%V in ('dir /b /ad /o-n "!VSBASE!\%%E\VC\Tools\MSVC" 2^>nul') do ( - if not defined MSVC set "MSVC=!VSBASE!\%%E\VC\Tools\MSVC\%%V" +:: ── Auto-detect MSVC (override with MSVC env var) ── +if not defined MSVC ( + set "VSBASE=C:\Program Files\Microsoft Visual Studio\2022" + for %%E in (Enterprise Professional Community BuildTools) do ( + if exist "!VSBASE!\%%E\VC\Tools\MSVC" ( + for /f "delims=" %%V in ('dir /b /ad /o-n "!VSBASE!\%%E\VC\Tools\MSVC" 2^>nul') do ( + if not defined MSVC set "MSVC=!VSBASE!\%%E\VC\Tools\MSVC\%%V" + ) ) ) ) if not defined MSVC ( - echo ERROR: Could not find MSVC toolchain under !VSBASE! + echo ERROR: Could not find MSVC toolchain exit /b 1 ) -:: ── Auto-detect WDK ── -set "WDK=C:\Program Files (x86)\Windows Kits\10" -set WDKVER= -for /f "delims=" %%V in ('dir /b /ad /o-n "!WDK!\Include" 2^>nul') do ( - if exist "!WDK!\Include\%%V\km\ntddk.h" ( - if not defined WDKVER set "WDKVER=%%V" +:: ── Auto-detect WDK (override with WDK_INC_ROOT and WDK_LIB_ROOT env vars) ── +if not defined WDK_INC_ROOT ( + set "WDK=C:\Program Files (x86)\Windows Kits\10" + set WDKVER= + for /f "delims=" %%V in ('dir /b /ad /o-n "!WDK!\Include" 2^>nul') do ( + if exist "!WDK!\Include\%%V\km\ntddk.h" ( + if not defined WDKVER set "WDKVER=%%V" + ) ) -) -if not defined WDKVER ( - echo ERROR: Could not find WDK headers under !WDK!\Include - exit /b 1 + if not defined WDKVER ( + echo ERROR: Could not find WDK headers under !WDK!\Include + echo Set WDK_INC_ROOT and WDK_LIB_ROOT environment variables to override. + exit /b 1 + ) + set "WDK_INC_ROOT=!WDK!\Include\!WDKVER!" + set "WDK_LIB_ROOT=!WDK!\Lib\!WDKVER!" ) -echo Using MSVC: %MSVC% -echo Using WDK: %WDK% (%WDKVER%) +echo Using MSVC: %MSVC% +echo Using WDK inc: %WDK_INC_ROOT% +echo Using WDK lib: %WDK_LIB_ROOT% set "CL_EXE=%MSVC%\bin\Hostx64\x64\cl.exe" set "LINK_EXE=%MSVC%\bin\Hostx64\x64\link.exe" @@ -44,9 +51,9 @@ echo === Compiling rcxdrv.c === "%CL_EXE%" /nologo /c /Zi /W4 /WX- /O2 /GS- ^ /D "NDEBUG" /D "_AMD64_" /D "AMD64" /D "_WIN64" /D "KERNEL" ^ /D "NTDDI_VERSION=0x0A000000" ^ - /I "%WDK%\Include\%WDKVER%\km" ^ - /I "%WDK%\Include\%WDKVER%\km\crt" ^ - /I "%WDK%\Include\%WDKVER%\shared" ^ + /I "%WDK_INC_ROOT%\km" ^ + /I "%WDK_INC_ROOT%\km\crt" ^ + /I "%WDK_INC_ROOT%\shared" ^ /kernel ^ /Fo"%OUTDIR%\rcxdrv.obj" ^ "%SRCDIR%rcxdrv.c" @@ -66,9 +73,9 @@ echo === Linking rcxdrv.sys === /PDBALTPATH:rcxdrv.pdb ^ /PDB:"%OUTDIR%\rcxdrv.pdb" ^ "%OUTDIR%\rcxdrv.obj" ^ - "%WDK%\Lib\%WDKVER%\km\x64\ntoskrnl.lib" ^ - "%WDK%\Lib\%WDKVER%\km\x64\hal.lib" ^ - "%WDK%\Lib\%WDKVER%\km\x64\BufferOverflowK.lib" ^ + "%WDK_LIB_ROOT%\km\x64\ntoskrnl.lib" ^ + "%WDK_LIB_ROOT%\km\x64\hal.lib" ^ + "%WDK_LIB_ROOT%\km\x64\BufferOverflowK.lib" ^ "%MSVC%\lib\x64\libcmt.lib" if errorlevel 1 goto :fail