summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2018-09-02 22:12:32 +0800
committerruki <[email protected]>2018-09-02 22:12:32 +0800
commit3b7cbb55f26f2beff05c0c803ee20d27712a15ba (patch)
treed7dce23a9ddf04f0c33fd0293a1fb07a996028dc
parentd54f54c0e7f90d8eade621f102d18938cd153f5b (diff)
fix wdk rule bug
-rw-r--r--CHANGELOG.md2
-rw-r--r--xmake/modules/os/winver.lua26
-rw-r--r--xmake/rules/wdk/load.lua51
3 files changed, 46 insertions, 33 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4baa3b7c8..36fba53ec 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -23,6 +23,7 @@
* [#177](https://github.com/tboox/xmake/issues/177): Fix the dependent target link bug
* Fix high cpu usage bug and Exit issues for `$ xmake f --menu`
* [#197](https://github.com/tboox/xmake/issues/197): Fix Chinese path for generating vs201x project
+* Fix wdk rules bug
## v2.2.1
@@ -500,6 +501,7 @@
* [#177](https://github.com/tboox/xmake/issues/177): 修复被依赖的动态库target,如果设置了basename后链接失败问题
* 修复`$ xmake f --menu`中Exit问题以及cpu过高问题
* [#197](https://github.com/tboox/xmake/issues/197): 修复生成的vs201x工程文件带有中文路径乱码问题
+* 修复WDK规则编译生成的驱动在Win7下运行蓝屏问题
## v2.2.1
diff --git a/xmake/modules/os/winver.lua b/xmake/modules/os/winver.lua
index 288f3a89f..e684ffa02 100644
--- a/xmake/modules/os/winver.lua
+++ b/xmake/modules/os/winver.lua
@@ -94,6 +94,32 @@ function target_version(name)
return version(name)
end
+-- get subsystem version from name
+function subsystem(name)
+
+ -- ignore the subname with '_xxx'
+ name = (name or ""):split('_')[1]
+
+ -- make defined values
+ local defvals =
+ {
+ nt4 = "4.00"
+ , win2k = "5.00"
+ , winxp = "5.01"
+ , ws03 = "5.02"
+ , win6 = "6.00"
+ , vista = "6.00"
+ , ws08 = "6.00"
+ , longhorn = "6.00"
+ , win7 = "6.01"
+ , win8 = "6.02"
+ , winblue = "6.03"
+ , win81 = "6.03"
+ , win10 = "10.00"
+ }
+ return defvals[name] or "10.00"
+end
+
-- get windows system version
--
-- $ xmake l os.winver
diff --git a/xmake/rules/wdk/load.lua b/xmake/rules/wdk/load.lua
index 23a4c0740..d4cfaab7e 100644
--- a/xmake/rules/wdk/load.lua
+++ b/xmake/rules/wdk/load.lua
@@ -24,32 +24,7 @@
-- imports
import("core.project.config")
-
--- get subsystem version defined value
-function _winver_subsystem(winver)
-
- -- ignore the subname with '_xxx'
- winver = (winver or ""):split('_')[1]
-
- -- make defined values
- local defvals =
- {
- nt4 = "4.00"
- , win2k = "5.00"
- , winxp = "5.01"
- , ws03 = "5.02"
- , win6 = "6.00"
- , vista = "6.00"
- , ws08 = "6.00"
- , longhorn = "6.00"
- , win7 = "6.01"
- , win8 = "6.02"
- , winblue = "6.03"
- , win81 = "6.03"
- , win10 = "10.00"
- }
- return defvals[winver] or "10.00"
-end
+import("os.winver", {alias = "os_winver"})
-- load for umdf driver
function driver_umdf(target)
@@ -63,7 +38,7 @@ function driver_umdf(target)
-- add subsystem
local winver = target:values("wdk.env.winver") or config.get("wdk_winver")
- target:add("shflags", "-subsystem:windows," .. _winver_subsystem(winver), {force = true})
+ target:add("shflags", "-subsystem:windows," .. os_winver.subsystem(winver), {force = true})
-- set default driver entry if does not exist
local entry = false
@@ -89,15 +64,20 @@ function driver_kmdf(target)
target:set("filename", target:basename() .. ".sys")
-- add links
- target:add("links", "BufferOverflowFastFailK", "ntoskrnl", "hal", "wmilib", "WdfLdr", "ntstrsafe", "wdmsec")
+ local winver = target:values("wdk.env.winver") or config.get("wdk_winver")
+ if os_winver.version(winver) >= os_winver.version("win8") then
+ target:add("links", "BufferOverflowFastFailK")
+ else
+ target:add("links", "BufferOverflowK")
+ end
+ target:add("links", "ntoskrnl", "hal", "wmilib", "WdfLdr", "ntstrsafe", "wdmsec")
-- compile as kernel driver
target:add("cxflags", "-kernel", {force = true})
target:add("ldflags", "-kernel", "-driver", {force = true})
-- add subsystem
- local winver = target:values("wdk.env.winver") or config.get("wdk_winver")
- target:add("ldflags", "-subsystem:native," .. _winver_subsystem(winver), {force = true})
+ target:add("ldflags", "-subsystem:native," .. os_winver.subsystem(winver), {force = true})
-- set default driver entry if does not exist
local entry = false
@@ -124,15 +104,20 @@ function driver_wdm(target)
target:set("filename", target:basename() .. ".sys")
-- add links
- target:add("links", "BufferOverflowFastFailK", "ntoskrnl", "hal", "wmilib", "ntstrsafe")
+ local winver = target:values("wdk.env.winver") or config.get("wdk_winver")
+ if os_winver.version(winver) >= os_winver.version("win8") then
+ target:add("links", "BufferOverflowFastFailK")
+ else
+ target:add("links", "BufferOverflowK")
+ end
+ target:add("links", "ntoskrnl", "hal", "wmilib", "ntstrsafe")
-- compile as kernel driver
target:add("cxflags", "-kernel", {force = true})
target:add("ldflags", "-kernel", "-driver", {force = true})
-- add subsystem
- local winver = target:values("wdk.env.winver") or config.get("wdk_winver")
- target:add("ldflags", "-subsystem:native," .. _winver_subsystem(winver), {force = true})
+ target:add("ldflags", "-subsystem:native," .. os_winver.subsystem(winver), {force = true})
-- set default driver entry if does not exist
local entry = false