585 lines
22 KiB
CMake
585 lines
22 KiB
CMake
include_guard(GLOBAL)
|
|
include(${CMAKE_CURRENT_LIST_DIR}/global.cmake)
|
|
|
|
include(${CMAKE_CURRENT_LIST_DIR}/log.cmake)
|
|
|
|
function(find_exe_recursive OUT_VAR SEARCH_ROOT EXE_NAME)
|
|
file(GLOB_RECURSE ${OUT_VAR}_CANDIDATES
|
|
LIST_DIRECTORIES false
|
|
"${SEARCH_ROOT}/${EXE_NAME}"
|
|
"${SEARCH_ROOT}/*/${EXE_NAME}"
|
|
)
|
|
|
|
if(NOT ${OUT_VAR}_CANDIDATES)
|
|
wdk_fatal("${CMAKE_CURRENT_FUNCTION}" "${EXE_NAME} not found under: ${SEARCH_ROOT}")
|
|
endif()
|
|
|
|
# 保证候选顺序稳定
|
|
list(SORT ${OUT_VAR}_CANDIDATES)
|
|
|
|
set(${OUT_VAR} "")
|
|
|
|
|
|
# ARGN 是可选的优先关键词列表
|
|
# 例如:x64 10.0.19041.0/x64 bin/10.0.19041.0/x64
|
|
foreach(keyword IN LISTS ARGN)
|
|
foreach(candidate IN LISTS ${OUT_VAR}_CANDIDATES)
|
|
string(FIND "${candidate}" "${keyword}" keyword_pos)
|
|
|
|
if(NOT keyword_pos EQUAL -1)
|
|
set(${OUT_VAR} "${candidate}")
|
|
break()
|
|
endif()
|
|
endforeach()
|
|
|
|
if(${OUT_VAR})
|
|
break()
|
|
endif()
|
|
endforeach()
|
|
|
|
# 如果没有任何关键词命中,就拿第一个
|
|
if(NOT ${OUT_VAR})
|
|
list(GET ${OUT_VAR}_CANDIDATES 0 ${OUT_VAR})
|
|
endif()
|
|
|
|
set(${OUT_VAR} "${${OUT_VAR}}" PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
|
|
# legacy Driver 不参与 PnP 管理、不绑定设备、通常用 sc create 启动的驱动
|
|
# PnP Driver 由系统自动加载、绑定到设备、受 PnP 管理的驱动 必须写 INF
|
|
# Filter Driver 不直接控制设备,而是“挂在别人上面”拦截请求
|
|
|
|
# D:\wyc\Environment\win10_driver\Program Files\Windows Kits\10
|
|
# D:\wyc\Environment\win10_driver\Program Files\Windows Kits\10\bin\10.0.19041.0\x86\Inf2Cat.exe
|
|
# D:\wyc\Environment\win10_driver\Program Files\Windows Kits\10\bin\10.0.19041.0\x64\signtool.exe
|
|
# D:\wyc\Environment\win10_driver\Program Files\Windows Kits\10\Include\10.0.19041.0\km\ntddk.h
|
|
|
|
|
|
# cmd ver Microsoft Windows [Version 10.0.19045.5371]
|
|
|
|
# 同时获取两个版本
|
|
# $cv=Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion";$b=[int]$cv.CurrentBuild;if($b -ge 10240){$winver='0x0A00'}elseif($b -ge 9600){$winver='0x0603'}elseif($b -ge 9200){$winver='0x0602'}elseif($b -ge 7600){$winver='0x0601'}else{$winver='UNKNOWN'};if($b -ge 19041){$ntddi='0x0A000008'}elseif($b -ge 18362){$ntddi='0x0A000007'}elseif($b -ge 17763){$ntddi='0x0A000006'}elseif($b -ge 17134){$ntddi='0x0A000005'}elseif($b -ge 16299){$ntddi='0x0A000004'}elseif($b -ge 15063){$ntddi='0x0A000003'}elseif($b -ge 14393){$ntddi='0x0A000002'}elseif($b -ge 10586){$ntddi='0x0A000001'}elseif($b -ge 10240){$ntddi='0x0A000000'}elseif($b -ge 9600){$ntddi='0x06030000'}elseif($b -ge 9200){$ntddi='0x06020000'}elseif($b -ge 7600){$ntddi='0x06010000'}else{$ntddi='UNKNOWN'};"_WIN32_WINNT=$winver";"WDK_NTDDI_VERSION=$ntddi"
|
|
|
|
|
|
# wmic datafile where name="C:\\Windows\\System32\\drivers\\Wdf01000.sys" get Version
|
|
# wmic datafile where name="C:\\Windows\\System32\\drivers\\WdfLdr.sys" get Version
|
|
|
|
# Version
|
|
# 1.31.19041.3758
|
|
# 1.31 是wdf版本号 19041.3758是windows文件版本号
|
|
|
|
|
|
# https://learn.microsoft.com/en-us/windows-hardware/drivers/wdf/kmdf-version-history kmdf版本支持范围文档
|
|
function(_wdk_attach_root version_identifier _target root kmdf_version)
|
|
wdk_require_target("_wdk_attach_root" "${_target}")
|
|
wdk_init_target_state("${_target}" output_dir "${CMAKE_BINARY_DIR}/windows_driver/${_target}")
|
|
wdk_get_target_state(output_dir "${_target}")
|
|
wdk_init_target_state("${_target}" script_dir "${output_dir}/wdk_scripts")
|
|
wdk_init_target_log_defaults("${_target}")
|
|
|
|
if("${version_identifier}" STREQUAL "")
|
|
wdk_get_target_state(version_identifier "${_target}")
|
|
if("${version_identifier}" STREQUAL "")
|
|
set(version_identifier "${WVI_WINDOWS_10_VB_X64}")
|
|
endif()
|
|
endif()
|
|
|
|
if("${root}" STREQUAL "")
|
|
wdk_get_target_state(root "${_target}")
|
|
endif()
|
|
|
|
wvi_select_winver("${version_identifier}" WDK_WINVER)
|
|
wvi_select_ntddi_version("${version_identifier}" WDK_NTDDI_VERSION)
|
|
if("${kmdf_version}" STREQUAL "")
|
|
wdk_get_target_state(kmdf_version "${_target}")
|
|
if("${kmdf_version}" STREQUAL "")
|
|
wvi_select_kmdf_version("${version_identifier}" kmdf_version)
|
|
endif()
|
|
endif()
|
|
|
|
get_property(_rely_domain_ TARGET ${_target} PROPERTY _rely_domain_)
|
|
wdk_log_status("${_target}" "========== WDK attach target: ${_target} ==========")
|
|
|
|
#
|
|
# 找 ntddk.h
|
|
#
|
|
file(GLOB_RECURSE WDK_NTDDK_FILES "${root}/*/ntddk.h")
|
|
|
|
if(WDK_NTDDK_FILES)
|
|
if(NOT CMAKE_VERSION VERSION_LESS 3.18.0)
|
|
list(SORT WDK_NTDDK_FILES COMPARE NATURAL)
|
|
endif()
|
|
|
|
list(GET WDK_NTDDK_FILES -1 WDK_LATEST_NTDDK_FILE)
|
|
endif()
|
|
|
|
if(NOT WDK_LATEST_NTDDK_FILE)
|
|
wdk_fatal("${CMAKE_CURRENT_FUNCTION}" "_wdk_attach_root: ntddk.h not found under '${root}'")
|
|
endif()
|
|
|
|
#
|
|
# 从 ntddk.h 推导:
|
|
# WDK_ROOT
|
|
# WDK_INC_VERSION
|
|
# WDK_LIB_VERSION
|
|
#
|
|
# 示例:
|
|
# D:/wyc/Environment/win10_driver/Program Files/Windows Kits/10/Include/10.0.19041.0/km/ntddk.h
|
|
#
|
|
get_filename_component(_wdk_km_dir "${WDK_LATEST_NTDDK_FILE}" DIRECTORY)
|
|
get_filename_component(_wdk_inc_ver_dir "${_wdk_km_dir}" DIRECTORY)
|
|
get_filename_component(WDK_VERSION "${_wdk_inc_ver_dir}" NAME)
|
|
get_filename_component(_wdk_include_dir "${_wdk_inc_ver_dir}" DIRECTORY)
|
|
get_filename_component(WDK_ROOT "${_wdk_include_dir}" DIRECTORY)
|
|
|
|
set(WDK_INC_VERSION "${WDK_VERSION}")
|
|
set(WDK_LIB_VERSION "${WDK_VERSION}")
|
|
|
|
if(NOT WDK_ROOT)
|
|
wdk_fatal("${CMAKE_CURRENT_FUNCTION}" "_wdk_attach_root: failed to determine WDK_ROOT")
|
|
endif()
|
|
|
|
if(NOT WDK_INC_VERSION)
|
|
wdk_fatal("${CMAKE_CURRENT_FUNCTION}" "_wdk_attach_root: failed to determine WDK_INC_VERSION")
|
|
endif()
|
|
|
|
if(NOT WDK_LIB_VERSION)
|
|
wdk_fatal("${CMAKE_CURRENT_FUNCTION}" "_wdk_attach_root: failed to determine WDK_LIB_VERSION")
|
|
endif()
|
|
|
|
wdk_log_status("${_target}" "WDK_ROOT: ${WDK_ROOT}")
|
|
wdk_log_status("${_target}" "WDK_VERSION: ${WDK_VERSION}")
|
|
wdk_log_status("${_target}" "WDK_INC_VERSION: ${WDK_INC_VERSION}")
|
|
wdk_log_status("${_target}" "WDK_LIB_VERSION: ${WDK_LIB_VERSION}")
|
|
wdk_log_status("${_target}" "WDK_VERSION_ID: ${version_identifier}")
|
|
wdk_log_status("${_target}" "WDK_WINVER: ${WDK_WINVER}")
|
|
wdk_log_status("${_target}" "WDK_NTDDI_VERSION: ${WDK_NTDDI_VERSION}")
|
|
|
|
#
|
|
# wdkflags.h
|
|
#
|
|
set(WDK_ADDITIONAL_FLAGS_FILE "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/wdkflags.h")
|
|
file(WRITE "${WDK_ADDITIONAL_FLAGS_FILE}" "#pragma runtime_checks(\"suc\", off)\n")
|
|
|
|
#
|
|
# 架构判断
|
|
#
|
|
if(CMAKE_SIZEOF_VOID_P EQUAL 4)
|
|
set(WDK_PLATFORM "x86")
|
|
set(WDK_KMDF_ENTRY "FxDriverEntry@8")
|
|
set(WDK_WDM_ENTRY "GsDriverEntry@8")
|
|
set(WDK_ARCH_DEFINES "_X86_=1" "i386=1" "STD_CALL")
|
|
elseif(CMAKE_SIZEOF_VOID_P EQUAL 8 AND CMAKE_CXX_COMPILER_ARCHITECTURE_ID STREQUAL "ARM64")
|
|
set(WDK_PLATFORM "arm64")
|
|
set(WDK_KMDF_ENTRY "FxDriverEntry")
|
|
set(WDK_WDM_ENTRY "GsDriverEntry")
|
|
set(WDK_ARCH_DEFINES "_ARM64_" "ARM64" "_USE_DECLSPECS_FOR_SAL=1" "STD_CALL")
|
|
elseif(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
|
set(WDK_PLATFORM "x64")
|
|
set(WDK_KMDF_ENTRY "FxDriverEntry")
|
|
set(WDK_WDM_ENTRY "GsDriverEntry")
|
|
set(WDK_ARCH_DEFINES "_AMD64_" "AMD64")
|
|
else()
|
|
wdk_fatal("${CMAKE_CURRENT_FUNCTION}" "_wdk_attach_root: unsupported architecture")
|
|
endif()
|
|
|
|
wdk_log_status("${_target}" "WDK_PLATFORM: ${WDK_PLATFORM}")
|
|
|
|
#
|
|
# Include 目录
|
|
#
|
|
set(WDK_SHARED_INC_DIR "${WDK_ROOT}/Include/${WDK_INC_VERSION}/shared")
|
|
set(WDK_KM_INC_DIR "${WDK_ROOT}/Include/${WDK_INC_VERSION}/km")
|
|
set(WDK_KM_CRT_INC_DIR "${WDK_ROOT}/Include/${WDK_INC_VERSION}/km/crt")
|
|
|
|
if(NOT EXISTS "${WDK_SHARED_INC_DIR}")
|
|
wdk_fatal("${CMAKE_CURRENT_FUNCTION}" "_wdk_attach_root: shared include dir not found: ${WDK_SHARED_INC_DIR}")
|
|
endif()
|
|
|
|
if(NOT EXISTS "${WDK_KM_INC_DIR}")
|
|
wdk_fatal("${CMAKE_CURRENT_FUNCTION}" "_wdk_attach_root: km include dir not found: ${WDK_KM_INC_DIR}")
|
|
endif()
|
|
|
|
if(NOT EXISTS "${WDK_KM_CRT_INC_DIR}")
|
|
wdk_fatal("${CMAKE_CURRENT_FUNCTION}" "_wdk_attach_root: km/crt include dir not found: ${WDK_KM_CRT_INC_DIR}")
|
|
endif()
|
|
|
|
#
|
|
# Lib 目录
|
|
#
|
|
set(WDK_KM_LIB_DIR "${WDK_ROOT}/Lib/${WDK_LIB_VERSION}/km/${WDK_PLATFORM}")
|
|
|
|
if(NOT EXISTS "${WDK_KM_LIB_DIR}")
|
|
wdk_fatal("${CMAKE_CURRENT_FUNCTION}" "_wdk_attach_root: WDK km lib dir not found: ${WDK_KM_LIB_DIR}")
|
|
endif()
|
|
|
|
wdk_log_status("${_target}" "WDK_KM_LIB_DIR: ${WDK_KM_LIB_DIR}")
|
|
|
|
#
|
|
# 内核库
|
|
#
|
|
set(WDK_NTOSKRNL "${WDK_KM_LIB_DIR}/ntoskrnl.lib")
|
|
set(WDK_HAL_LIB "${WDK_KM_LIB_DIR}/hal.lib")
|
|
set(WDK_BUFFEROVERFLOWK "${WDK_KM_LIB_DIR}/BufferOverflowK.lib")
|
|
set(WDK_BUFFEROVERFLOWFASTFAILK "${WDK_KM_LIB_DIR}/bufferoverflowfastfailk.lib")
|
|
if(NOT EXISTS "${WDK_NTOSKRNL}")
|
|
wdk_fatal("${CMAKE_CURRENT_FUNCTION}" "_wdk_attach_root: ntoskrnl.lib not found: ${WDK_NTOSKRNL}")
|
|
endif()
|
|
|
|
if(EXISTS "${WDK_BUFFEROVERFLOWK}")
|
|
set(WDK_BUFFEROVERFLOW_LIB "${WDK_BUFFEROVERFLOWK}")
|
|
elseif(EXISTS "${WDK_BUFFEROVERFLOWFASTFAILK}")
|
|
set(WDK_BUFFEROVERFLOW_LIB "${WDK_BUFFEROVERFLOWFASTFAILK}")
|
|
else()
|
|
wdk_fatal("${CMAKE_CURRENT_FUNCTION}" "_wdk_attach_root: BufferOverflowK.lib / bufferoverflowfastfailk.lib not found in ${WDK_KM_LIB_DIR}")
|
|
endif()
|
|
|
|
if(NOT EXISTS "${WDK_BUFFEROVERFLOW_LIB}")
|
|
wdk_fatal("${CMAKE_CURRENT_FUNCTION}" "_wdk_attach_root: bad buffer overflow lib path: ${WDK_BUFFEROVERFLOW_LIB}")
|
|
endif()
|
|
|
|
wdk_log_status("${_target}" "lib ntoskrnl: ${WDK_NTOSKRNL}")
|
|
wdk_log_status("${_target}" "lib buffer: ${WDK_BUFFEROVERFLOW_LIB}")
|
|
|
|
if(EXISTS "${WDK_HAL_LIB}")
|
|
wdk_log_status("${_target}" "lib hal: ${WDK_HAL_LIB}")
|
|
endif()
|
|
|
|
#
|
|
# 编译定义
|
|
#
|
|
set(WDK_COMPILE_DEFINITIONS
|
|
WINNT=1
|
|
UNICODE
|
|
_UNICODE
|
|
NOMINMAX
|
|
${WDK_ARCH_DEFINES}
|
|
)
|
|
|
|
if(WDK_WINVER)
|
|
list(APPEND WDK_COMPILE_DEFINITIONS "_WIN32_WINNT=${WDK_WINVER}")
|
|
else()
|
|
list(APPEND WDK_COMPILE_DEFINITIONS "_WIN32_WINNT=0x0A00")
|
|
endif()
|
|
|
|
if(WDK_NTDDI_VERSION)
|
|
list(APPEND WDK_COMPILE_DEFINITIONS "ntddiVersion=${WDK_NTDDI_VERSION}")
|
|
endif()
|
|
|
|
set(WDK_COMPILE_DEFINITIONS_DEBUG
|
|
MSC_NOOPT
|
|
DEPRECATE_DDK_FUNCTIONS=1
|
|
DBG=1
|
|
)
|
|
|
|
target_compile_definitions(${_target} ${_rely_domain_}
|
|
${WDK_COMPILE_DEFINITIONS}
|
|
)
|
|
|
|
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
|
target_compile_definitions(${_target} ${_rely_domain_}
|
|
${WDK_COMPILE_DEFINITIONS_DEBUG}
|
|
)
|
|
endif()
|
|
#
|
|
# 编译选项
|
|
#
|
|
target_compile_options(${_target} ${_rely_domain_}
|
|
/Zp8
|
|
/GF
|
|
/GR-
|
|
/Gz
|
|
/kernel
|
|
/GS
|
|
/Zl
|
|
/FIwarning.h
|
|
"/FI${WDK_ADDITIONAL_FLAGS_FILE}"
|
|
/Oi
|
|
/EHs-c-
|
|
/UWIN32_NO_STATUS
|
|
)
|
|
|
|
#
|
|
# C++ 源文件额外处理
|
|
#
|
|
target_compile_options(${_target} ${_rely_domain_}
|
|
/GR-
|
|
/EHs-c-
|
|
)
|
|
|
|
#
|
|
# Include
|
|
#
|
|
target_include_directories(${_target} SYSTEM ${_rely_domain_}
|
|
"${WDK_SHARED_INC_DIR}"
|
|
"${WDK_KM_INC_DIR}"
|
|
"${WDK_KM_CRT_INC_DIR}"
|
|
)
|
|
|
|
#
|
|
# Link options
|
|
#
|
|
target_link_options(${_target} ${_rely_domain_}
|
|
/MANIFEST:NO
|
|
/DRIVER
|
|
/OPT:REF
|
|
/INCREMENTAL:NO
|
|
/OPT:ICF
|
|
/SUBSYSTEM:NATIVE
|
|
/MERGE:_TEXT=.text
|
|
/MERGE:_PAGE=PAGE
|
|
/NODEFAULTLIB
|
|
/SECTION:INIT,d
|
|
/version:10.0
|
|
/DYNAMICBASE
|
|
/NXCOMPAT
|
|
)
|
|
|
|
#
|
|
# 最小内核库
|
|
#
|
|
target_link_libraries(${_target} ${_rely_domain_}
|
|
"${WDK_NTOSKRNL}"
|
|
"${WDK_BUFFEROVERFLOW_LIB}"
|
|
)
|
|
|
|
#
|
|
# HAL 默认链接
|
|
#
|
|
if(EXISTS "${WDK_HAL_LIB}")
|
|
target_link_libraries(${_target} ${_rely_domain_}
|
|
"${WDK_HAL_LIB}"
|
|
)
|
|
endif()
|
|
|
|
#
|
|
# ARM64 runtime
|
|
#
|
|
if(WDK_PLATFORM STREQUAL "arm64")
|
|
target_link_libraries(${_target} ${_rely_domain_}
|
|
arm64rt.lib
|
|
)
|
|
endif()
|
|
|
|
#
|
|
# KMDF / WDM
|
|
#
|
|
if(NOT "${kmdf_version}" STREQUAL "")
|
|
set(WDK_KMDF_INC_DIR "${WDK_ROOT}/Include/wdf/kmdf/${kmdf_version}")
|
|
set(WDK_KMDF_LIB_DIR "${WDK_ROOT}/Lib/wdf/kmdf/${WDK_PLATFORM}/${kmdf_version}")
|
|
|
|
set(WDK_WDF_DRIVER_ENTRY_LIB "${WDK_KMDF_LIB_DIR}/WdfDriverEntry.lib")
|
|
set(WDK_WDF_LDR_LIB "${WDK_KMDF_LIB_DIR}/WdfLdr.lib")
|
|
|
|
if(NOT EXISTS "${WDK_KMDF_INC_DIR}/wdf.h")
|
|
wdk_fatal("${CMAKE_CURRENT_FUNCTION}" "_wdk_attach_root: KMDF include invalid: ${WDK_KMDF_INC_DIR}")
|
|
endif()
|
|
|
|
if(NOT EXISTS "${WDK_WDF_DRIVER_ENTRY_LIB}")
|
|
wdk_fatal("${CMAKE_CURRENT_FUNCTION}" "_wdk_attach_root: WdfDriverEntry.lib not found: ${WDK_WDF_DRIVER_ENTRY_LIB}")
|
|
endif()
|
|
|
|
if(NOT EXISTS "${WDK_WDF_LDR_LIB}")
|
|
wdk_fatal("${CMAKE_CURRENT_FUNCTION}" "_wdk_attach_root: WdfLdr.lib not found: ${WDK_WDF_LDR_LIB}")
|
|
endif()
|
|
|
|
target_include_directories(${_target} SYSTEM ${_rely_domain_}
|
|
"${WDK_KMDF_INC_DIR}"
|
|
)
|
|
|
|
target_link_libraries(${_target} ${_rely_domain_}
|
|
"${WDK_WDF_DRIVER_ENTRY_LIB}"
|
|
"${WDK_WDF_LDR_LIB}"
|
|
)
|
|
|
|
target_link_options(${_target} ${_rely_domain_}
|
|
"/ENTRY:${WDK_KMDF_ENTRY}"
|
|
)
|
|
|
|
wdk_log_status("${_target}" "KMDF version: ${kmdf_version}")
|
|
wdk_log_status("${_target}" "KMDF include: ${WDK_KMDF_INC_DIR}")
|
|
wdk_log_status("${_target}" "KMDF lib dir: ${WDK_KMDF_LIB_DIR}")
|
|
wdk_log_status("${_target}" "KMDF entry: ${WDK_KMDF_ENTRY}")
|
|
wdk_log_status("${_target}" "KMDF entry lib: ${WDK_WDF_DRIVER_ENTRY_LIB}")
|
|
wdk_log_status("${_target}" "KMDF ldr lib: ${WDK_WDF_LDR_LIB}")
|
|
else()
|
|
target_link_options(${_target} ${_rely_domain_}
|
|
"/ENTRY:${WDK_WDM_ENTRY}"
|
|
)
|
|
|
|
wdk_log_status("${_target}" "WDM entry: ${WDK_WDM_ENTRY}")
|
|
endif()
|
|
|
|
wdk_init_target_state("${_target}" version_identifier "${version_identifier}")
|
|
wdk_init_target_state("${_target}" ewdk_root "${root}")
|
|
wdk_init_target_state("${_target}" root "${WDK_ROOT}")
|
|
wdk_init_target_state("${_target}" version "${WDK_VERSION}")
|
|
wdk_init_target_state("${_target}" inc_version "${WDK_INC_VERSION}")
|
|
wdk_init_target_state("${_target}" lib_version "${WDK_LIB_VERSION}")
|
|
wdk_init_target_state("${_target}" winver "${WDK_WINVER}")
|
|
wdk_init_target_state("${_target}" ntddi_version "${WDK_NTDDI_VERSION}")
|
|
wdk_init_target_state("${_target}" platform "${WDK_PLATFORM}")
|
|
wdk_init_target_state("${_target}" km_lib_dir "${WDK_KM_LIB_DIR}")
|
|
wdk_init_target_state("${_target}" shared_inc_dir "${WDK_SHARED_INC_DIR}")
|
|
wdk_init_target_state("${_target}" km_inc_dir "${WDK_KM_INC_DIR}")
|
|
wdk_init_target_state("${_target}" km_crt_inc_dir "${WDK_KM_CRT_INC_DIR}")
|
|
wdk_init_target_state("${_target}" additional_flags_file "${WDK_ADDITIONAL_FLAGS_FILE}")
|
|
|
|
if(NOT "${kmdf_version}" STREQUAL "")
|
|
wdk_init_target_state("${_target}" kmdf_version "${kmdf_version}")
|
|
wdk_init_target_state("${_target}" kmdf_inc_dir "${WDK_KMDF_INC_DIR}")
|
|
wdk_init_target_state("${_target}" kmdf_lib_dir "${WDK_KMDF_LIB_DIR}")
|
|
wdk_init_target_state("${_target}" wdf_driver_entry_lib "${WDK_WDF_DRIVER_ENTRY_LIB}")
|
|
wdk_init_target_state("${_target}" wdf_ldr_lib "${WDK_WDF_LDR_LIB}")
|
|
wdk_init_target_state("${_target}" driver_entry "${WDK_KMDF_ENTRY}")
|
|
else()
|
|
wdk_init_target_state("${_target}" driver_entry "${WDK_WDM_ENTRY}")
|
|
endif()
|
|
|
|
#
|
|
# 末尾验证:确保 /PROFILE 已经被清掉。
|
|
#
|
|
get_property(_wdk_final_link_options TARGET ${_target} PROPERTY LINK_OPTIONS)
|
|
wdk_log_status("${_target}" "${_target} final LINK_OPTIONS=${_wdk_final_link_options}")
|
|
|
|
wdk_log_status("${_target}" "========== WDK attach done: ${_target} ==========")
|
|
endfunction()
|
|
|
|
|
|
|
|
|
|
#_create_vcxproj_win_driver(
|
|
# a_pnp_test
|
|
# "${src}/psc_driver.inf"
|
|
# wyc_driver.cat
|
|
#)
|
|
|
|
# TODO: 目标架构的兼容没做 预计很多位置都要改
|
|
function(wdk_init_vcxproj_driver_tool_defaults target_name)
|
|
wdk_require_target("wdk_init_vcxproj_driver_tool_defaults" "${target_name}")
|
|
wdk_begin_target_state_init_once(_should_init "${target_name}" vcxproj_driver_tool_defaults)
|
|
if(NOT _should_init)
|
|
return()
|
|
endif()
|
|
wdk_get_target_state(root "${target_name}")
|
|
wdk_get_target_state(platform "${target_name}")
|
|
string(TOUPPER "${platform}" dvl_arch)
|
|
wdk_init_target_state("${target_name}" msbuild_log_verbosity "/v:diag")
|
|
wdk_init_target_state("${target_name}" sdv_inputs "/p:Inputs=/check:* /debug")
|
|
wdk_init_target_state("${target_name}" sdv_debug_log TRUE)
|
|
wdk_has_target_state(_has_dvl_exe "${target_name}" dvl_exe)
|
|
if(NOT _has_dvl_exe)
|
|
find_exe_recursive(dvl_exe "${root}" "dvl.exe")
|
|
wdk_init_target_state("${target_name}" dvl_exe "${dvl_exe}")
|
|
wdk_log_status("${target_name}" "WDK_DVL_EXE: ${dvl_exe}")
|
|
endif()
|
|
wdk_init_target_state("${target_name}" dvl_arch "${dvl_arch}")
|
|
wdk_init_target_state("${target_name}" dvl_hlk_dir "C:/DVL")
|
|
wdk_init_target_state("${target_name}" dvl_depend_on_codeql_analyze ON)
|
|
endfunction()
|
|
|
|
function(_create_vcxproj_win_driver target_name inf_file inf_cat_name)
|
|
wdk_require_target("_create_vcxproj_win_driver" "${target_name}")
|
|
wdk_get_target_state(folder_name "${target_name}")
|
|
if("${folder_name}" STREQUAL "")
|
|
wdk_init_target_state("${target_name}" folder_name "${target_name}")
|
|
wdk_get_target_state(folder_name "${target_name}")
|
|
else()
|
|
wdk_set_target_state("${target_name}" folder_name "${folder_name}")
|
|
endif()
|
|
wdk_init_vcxproj_driver_tool_defaults("${target_name}")
|
|
wdk_get_target_state(msbuild_log_verbosity "${target_name}")
|
|
wdk_get_target_state(sdv_inputs "${target_name}")
|
|
wdk_get_target_state(sdv_debug_log "${target_name}")
|
|
wdk_init_vcxproj_defaults("${target_name}")
|
|
wdk_get_target_state(vcxproj_stage_dir "${target_name}")
|
|
wdk_get_target_state(vcxproj_configuration "${target_name}")
|
|
wdk_get_target_state(vcxproj_platform "${target_name}")
|
|
|
|
wdk_set_target_state("${target_name}" vcxproj_extra_inf "${inf_file}")
|
|
wdk_generate_msbuild_xml_from_target("${target_name}")
|
|
|
|
wdk_add_ewdk_msbuild_target(
|
|
"${target_name}"
|
|
"${target_name}_vcxproj"
|
|
"/t:Build"
|
|
"/m"
|
|
"${msbuild_log_verbosity}"
|
|
)
|
|
|
|
# https://learn.microsoft.com/en-us/windows-hardware/drivers/devtest/static-driver-verifier-concepts
|
|
# 新版 WDK,例如 Windows 11 22H2 EWDK 之后,已经不再支持 SDV
|
|
if(sdv_debug_log)
|
|
set(sdv_binlog "/bl:${vcxproj_stage_dir}/${target_name}_sdv.binlog")
|
|
else()
|
|
set(sdv_binlog "")
|
|
endif()
|
|
|
|
wdk_set_target_state("${target_name}" vcxproj_console_codepage 936)
|
|
wdk_set_target_state("${target_name}" vcxproj_repair_sdv_logs TRUE)
|
|
wdk_add_ewdk_msbuild_target(
|
|
"${target_name}"
|
|
${target_name}_sdv
|
|
"${sdv_inputs}"
|
|
"/t:sdv"
|
|
"${msbuild_log_verbosity}"
|
|
"${sdv_binlog}"
|
|
)
|
|
wdk_set_target_state("${target_name}" vcxproj_repair_sdv_logs FALSE)
|
|
wdk_set_target_state("${target_name}" vcxproj_console_codepage 65001)
|
|
|
|
wdk_add_ewdk_msbuild_target(
|
|
"${target_name}"
|
|
${target_name}_ca
|
|
"/t:Build"
|
|
"/p:RunCodeAnalysisOnce=True"
|
|
"${msbuild_log_verbosity}"
|
|
)
|
|
|
|
_add_codeql_driver_analysis("${target_name}" "${vcxproj_stage_dir}")
|
|
|
|
wdk_add_ewdk_msbuild_target(
|
|
"${target_name}"
|
|
${target_name}_dvl
|
|
"/t:dvl"
|
|
"${msbuild_log_verbosity}"
|
|
)
|
|
|
|
wdk_init_inf2cat_defaults("${target_name}")
|
|
wdk_get_target_state(package_dir "${target_name}")
|
|
get_filename_component(_inf_name "${inf_file}" NAME)
|
|
set(driver_file "${vcxproj_stage_dir}/${vcxproj_platform}/${vcxproj_configuration}/${target_name}.sys")
|
|
set(stamped_inf_file "${vcxproj_stage_dir}/${vcxproj_platform}/${vcxproj_configuration}/${_inf_name}")
|
|
wdk_add_inf2cat_target("${target_name}" ${target_name}_inf2cat "${driver_file}" "${stamped_inf_file}" "${package_dir}")
|
|
wdk_add_sign_target("${target_name}" ${target_name}_sign_sys "${package_dir}/${target_name}.sys")
|
|
wdk_add_sign_target("${target_name}" ${target_name}_sign_cat "${package_dir}/${inf_cat_name}")
|
|
|
|
set(_list_targets
|
|
${target_name}_sdv
|
|
${target_name}_ca
|
|
${target_name}_codeql
|
|
${target_name}_dvl
|
|
# ${target_name}_sign_sys
|
|
${target_name}_inf2cat
|
|
${target_name}_sign_cat
|
|
)
|
|
add_serial_build_target(${target_name}_static_tools_logo ${_list_targets})
|
|
wdk_set_target_state("${target_name}_static_tools_logo" folder_name "${folder_name}")
|
|
|
|
|
|
set(_list_targets
|
|
|
|
${target_name}_vcxproj
|
|
${target_name}_inf2cat
|
|
${target_name}_sign_cat
|
|
)
|
|
add_serial_build_target(${target_name}_package ${_list_targets})
|
|
wdk_set_target_state("${target_name}_package" folder_name "${folder_name}")
|
|
|
|
endfunction()
|
|
|
|
|
|
|
|
|