3131# target_link_libraries(KmdfCppDriver KmdfCppLib)
3232#
3333
34+ find_package (WindowsSDK) # the headers are needed
35+
3436if ( DEFINED ENV{WindowsSdkDir} )
3537 file (GLOB WDK_NTDDK_FILES
3638 "$ENV{WindowsSdkDir} /Include/*/km/ntddk.h"
@@ -48,9 +50,35 @@ endif()
4850include (FindPackageHandleStandardArgs)
4951find_package_handle_standard_args(WDK REQUIRED_VARS WDK_LATEST_NTDDK_FILE)
5052
51- if (NOT WDK_LATEST_NTDDK_FILE)
52- return ()
53- endif ()
53+ if (MINGW)
54+ get_filename_component (MINGW_BIN_DIR ${CMAKE_RC_COMPILER} DIRECTORY )
55+ get_filename_component (MINGW_DIR ${MINGW_BIN_DIR} DIRECTORY )
56+ if (REACTOS_SDK)
57+ set (REACTOS_DDK "${REACTOS_SDK} /include/ddk" CACHE PATH "The path to ReactOS DDK" )
58+ set (REACTOS_CRT_HEADERS "${REACTOS_SDK} /include/CRT" CACHE PATH "The path to ReactOS CRT headers" )
59+ set (REACTOS_PSDK_HEADERS "${REACTOS_SDK} /include/psdk" CACHE PATH "The path to ReactOS PSDK headers" )
60+ set (REACTOS_XDK_HEADERS "${REACTOS_SDK} /include/xdk" CACHE PATH "The path to ReactOS XDK headers" )
61+ endif (REACTOS_SDK)
62+ message ( STATUS "MINGW_DIR ${MINGW_DIR} " )
63+
64+ file (GLOB MINGW_INCLUDE_EXCPT_HS "${MINGW_DIR} /*/include/excpt.h" )
65+ list (GET MINGW_INCLUDE_EXCPT_HS -1 MINGW_INCLUDE_EXCPT_H)
66+ get_filename_component (MINGW_INCLUDE_DIR ${MINGW_INCLUDE_EXCPT_H} DIRECTORY )
67+
68+ set (MINGW_INCLUDE_DIR "${MINGW_INCLUDE_DIR} " CACHE PATH "The path to MinGW include" )
69+ set (MINGW_DDK "${MINGW_INCLUDE_DIR} /ddk" CACHE PATH "The path to MinGW DDK" )
70+
71+ if (NOT MINGW_DDK)
72+ message (FATAL_ERROR "MINGW_DDK not found!" )
73+ return ()
74+ else ()
75+ message (STATUS "MINGW_DDK_ROOT: " ${MINGW_DDK} )
76+ endif ()
77+ else (MINGW)
78+ if (NOT WDK_LATEST_NTDDK_FILE)
79+ return ()
80+ endif ()
81+ endif (MINGW)
5482
5583get_filename_component (WDK_ROOT ${WDK_LATEST_NTDDK_FILE} DIRECTORY )
5684get_filename_component (WDK_ROOT ${WDK_ROOT} DIRECTORY )
@@ -66,15 +94,43 @@ set(WDK_WINVER "0x0601" CACHE STRING "Default WINVER for WDK targets")
6694set (WDK_ADDITIONAL_FLAGS_FILE "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY} /wdkflags.h" )
6795file (WRITE ${WDK_ADDITIONAL_FLAGS_FILE} "#pragma runtime_checks(\" suc\" , off)" )
6896
69- set (WDK_COMPILE_FLAGS
70- "/Zp8" # set struct alignment
71- "/GF" # enable string pooling
72- "/GR-" # disable RTTI
73- "/Gz" # __stdcall by default
74- "/kernel" # create kernel mode binary
75- "/FIwarning.h" # disable warnings in WDK headers
76- "/FI${WDK_ADDITIONAL_FLAGS_FILE} " # include file to disable RTC
97+ if (MINGW)
98+ set (WDK_COMPILE_FLAGS
99+ "-shared"
100+ "-nostartfiles"
101+ "-nostdlib"
102+ "-lntoskrnl"
103+ "-lhal"
104+ "-lndis"
105+ "-mdll"
106+ "-fno-rtti"
107+ "-mrtd" # __stdcall by default
108+ "-fpack-struct=8" # set struct alignment
109+ "-fms-extensions" # microsoft visual c++ compatibility
110+ "-fdelayed-template-parsing"
111+ "-fms-compatibility"
112+ "-D_MSC_VER=1300"
113+ "-masm=intel" #MSVC headers use intel syntax
114+ #"-std=c++17"
77115 )
116+ include_directories (SYSTEM "${LIB_DIR} /Include" )
117+ #set(WDK_COMPILE_FLAGS
118+ # "/kernel" # create kernel mode binary
119+ # "/FIwarning.h" # disable warnings in WDK headers
120+ # "/FI${WDK_ADDITIONAL_FLAGS_FILE}" # include file to disable RTC
121+ # )
122+ elseif (MSVC )
123+ set (WDK_COMPILE_FLAGS
124+ "/Zp8" # set struct alignment
125+ "/GF" # enable string pooling
126+ "/GR-" # disable RTTI
127+ "/Gz" # __stdcall by default
128+ "/kernel" # create kernel mode binary
129+ "/FIwarning.h" # disable warnings in WDK headers
130+ "/FI${WDK_ADDITIONAL_FLAGS_FILE} " # include file to disable RTC
131+ )
132+ endif (MINGW)
133+
78134
79135set (WDK_COMPILE_DEFINITIONS "WINNT=1" )
80136set (WDK_COMPILE_DEFINITIONS_DEBUG "MSC_NOOPT;DEPRECATE_DDK_FUNCTIONS=1;DBG=1" )
@@ -89,18 +145,28 @@ else()
89145 message (FATAL_ERROR "Unsupported architecture" )
90146endif ()
91147
92- string (CONCAT WDK_LINK_FLAGS
93- "/MANIFEST:NO " #
94- "/DRIVER " #
95- "/OPT:REF " #
96- "/INCREMENTAL:NO " #
97- "/OPT:ICF " #
98- "/SUBSYSTEM:NATIVE " #
99- "/MERGE:_TEXT=.text;_PAGE=PAGE " #
100- "/NODEFAULTLIB " # do not link default CRT
101- "/SECTION:INIT,d " #
102- "/VERSION:10.0 " #
148+ if (MINGW)
149+ string (CONCAT WDK_LINK_FLAGS
150+ "--subsystem,native "
151+ "--image-base,0x10000 "
152+ "--file-alignment,0x1000 "
153+ "--section-alignment,0x1000 "
154+ "--entry,_DriverEntry@8 "
103155 )
156+ elseif (MSVC )
157+ string (CONCAT WDK_LINK_FLAGS
158+ "/MANIFEST:NO " #
159+ "/DRIVER " #
160+ "/OPT:REF " #
161+ "/INCREMENTAL:NO " #
162+ "/OPT:ICF " #
163+ "/SUBSYSTEM:NATIVE " #
164+ "/MERGE:_TEXT=.text;_PAGE=PAGE " #
165+ "/NODEFAULTLIB " # do not link default CRT
166+ "/SECTION:INIT,d " #
167+ "/VERSION:10.0 " #
168+ )
169+ endif (MINGW)
104170
105171# Generate imported targets for WDK lib files
106172file (GLOB WDK_LIBRARIES "${WDK_ROOT} /Lib/${WDK_VERSION} /km/${WDK_PLATFORM} /*.lib" )
@@ -123,10 +189,16 @@ function(wdk_add_driver _target)
123189 "${WDK_COMPILE_DEFINITIONS} ;$<$<CONFIG:Debug>:${WDK_COMPILE_DEFINITIONS_DEBUG} >;_WIN32_WINNT=${WDK_WINVER} "
124190 )
125191 set_target_properties (${_target} PROPERTIES LINK_FLAGS "${WDK_LINK_FLAGS} " )
126-
192+
127193 target_include_directories (${_target} SYSTEM PRIVATE
194+ #"${REACTOS_DDK}"
195+ #"${REACTOS_CRT_HEADERS}"
196+ #"${REACTOS_PSDK_HEADERS}"
197+ #"${REACTOS_XDK_HEADERS}"
128198 "${WDK_ROOT} /Include/${WDK_VERSION} /shared"
129199 "${WDK_ROOT} /Include/${WDK_VERSION} /km"
200+ "${MINGW_DDK} "
201+ #"${MINGW_INCLUDE_DIR}"
130202 )
131203
132204 target_link_libraries (${_target} WDK::NTOSKRNL WDK::HAL WDK::BUFFEROVERFLOWK WDK::WMILIB)
@@ -167,8 +239,14 @@ function(wdk_add_library _target)
167239 )
168240
169241 target_include_directories (${_target} SYSTEM PRIVATE
242+ #"${REACTOS_DDK}"
243+ #"${REACTOS_CRT_HEADERS}"
244+ #"${REACTOS_PSDK_HEADERS}"
245+ #"${REACTOS_XDK_HEADERS}"
170246 "${WDK_ROOT} /Include/${WDK_VERSION} /shared"
171247 "${WDK_ROOT} /Include/${WDK_VERSION} /km"
248+ "${MINGW_DDK} "
249+ #"${MINGW_INCLUDE_DIR}"
172250 )
173251
174252 if (DEFINED WDK_KMDF)
0 commit comments