内核驱动创建文件异常:OSRLOADER成功CreateService服务加载失败
问题分析与解决方案
这种情况我之前也碰到过,主要是几个容易忽略的点导致的,咱们一步步拆解:
1. 驱动签名验证问题(最常见原因)
OSRLOADER这类测试工具通常会在宽松的签名环境下使用,你大概率已经通过bcdedit /set testsigning on开启了测试签名模式,或者工具本身做了签名绕过。但当你通过系统服务加载驱动时,Windows会严格执行驱动签名验证:
- 如果你的驱动没有经过微软官方签名,也没有安装测试签名证书,系统会直接拒绝加载驱动,导致
StartService调用失败,驱动根本没运行,自然不会创建文件。 - 你可以先给
StartService加上返回值检查,确认是否启动失败:
如果错误码是if (!StartServiceA(schService, 0, 0)) { printf("\nStart Service fails.\nError_Code: %d", GetLastError()); return -1; }ERROR_IN_WOW64或者ERROR_DRIVER_BLOCKED,基本就是签名的问题。
2. 驱动代码里的错误判断逻辑完全反了
看你的驱动代码:
if (!status) { DbgPrint("Error While Creating file......."); }
NTSTATUS类型中,STATUS_SUCCESS的值是0,也就是说当文件创建成功时,这个条件会成立,反而打印错误信息;而如果创建失败(status非0),反而不会输出任何日志,这会严重误导你判断驱动是否真的执行了文件创建逻辑。
正确的判断应该用NT_SUCCESS()宏,它能正确识别所有成功的NTSTATUS值:
if (!NT_SUCCESS(status)) { DbgPrint("Error While Creating file....... Status: 0x%X", status); } else { DbgPrint("File created successfully!"); }
3. 服务启动时的权限与路径细节
虽然你的驱动创建的是C:\test.txt,但还是要确认两个点:
- 服务默认以
Local System账户运行,这个账户理论上拥有C盘根目录的写入权限,但如果你的系统开启了严格的UAC或者文件夹权限被手动修改,可能会导致创建失败。可以先尝试把路径改成C:\Windows\Temp\test.txt,这个系统临时目录的权限更宽松。 - 你的服务指向的驱动路径
C:\\Users\\abc\\Desktop\\CreateFile.sys,Local System账户默认可以访问用户桌面目录,但如果是多用户环境或者桌面目录权限被修改,可能会导致服务无法读取驱动文件。建议把驱动文件放到系统目录(比如C:\Windows\System32\drivers\),再修改服务的路径参数。
4. 驱动生命周期的小细节
如果你的驱动没有设置卸载函数,虽然不会影响DriverEntry的执行,但系统会认为驱动无法正常卸载,可能在某些场景下出现异常。建议加上卸载函数,确保驱动生命周期完整:
VOID DriverUnload(PDRIVER_OBJECT DriverObject) { DbgPrint("Driver unloaded successfully!"); } NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { DriverObject->DriverUnload = DriverUnload; // 剩下的文件创建代码... }
快速排查步骤
- 先给服务启动代码加上
StartService的错误检查,确认驱动是否真的被加载。 - 用
DebugView工具抓取内核调试信息,看驱动的DbgPrint输出,确认文件创建逻辑是否执行,以及返回的status值是什么。 - 如果是签名问题,要么开启测试签名模式(执行
bcdedit /set testsigning on后重启系统),要么给驱动申请测试签名证书并安装。 - 优先修正驱动里的错误判断逻辑,避免误导自己的排查方向。
内容的提问来源于stack exchange,提问作者Raafat
相关产品推荐
相关产品推荐

