出于我的目的,我需要为Windows编写内核模式驱动程序。目前我正在尝试使其在Windows 7 x64下运行。
我在Visual Studio 2012中创建了一个简单项目,其中包含KMDF驱动程序的默认代码。我通过测试签名编译了代码。驱动程序已编译并签名。 我还启用了Test-Signing ON,清晰地显示在桌面的左下角。
在尝试将驱动程序作为服务启动时,我总是得到错误代码6:无效句柄错误。(我已经简化了代码,只是尝试启动它但仍然无效;默认代码也无效)
基本上,我遇到与此处提出的问题相同的问题
https://stackoverflow.com/questions/12080157/startservice-error-6
不幸的是,他从未接受过回答。我尝试了提供的解决方案,但它也没有帮助。尝试启动驱动程序的代码是
int _cdecl main(void)
{
HANDLE hSCManager;
HANDLE hService;
SERVICE_STATUS ss;
hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
printf("Load Driver\n");
if(hSCManager)
{
printf("Create Service\n");
hService = CreateService(hSCManager, "Example",
"Example Driver",
SERVICE_ALL_ACCESS | SERVICE_START | DELETE | SERVICE_STOP ,
SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START,
SERVICE_ERROR_IGNORE,
"\\path\\to\\driver\\KMDFDriver1.sys",
NULL, NULL, NULL, NULL, NULL);
if(!hService)
{
hService = OpenService(hSCManager, "Example",
SERVICE_ALL_ACCESS | SERVICE_START | DELETE | SERVICE_STOP);
if(!hService)
{
// If initial startup of the driver failed, it will fail here.
process_error();
return 0;
}
}
if(hService)
{
printf("Start Service\n");
if(StartService(hService, 0, NULL) == 0)
{
// Start service ALWAYS returns 0. Only when executed for the first time. Next time it fails on OpenService.
process_error();
printf("Did not start!\n");
}
printf("Press Enter to close service\r\n");
getchar();
ControlService(hService, SERVICE_CONTROL_STOP, &ss);
DeleteService(hService);
CloseServiceHandle(hService);
}
CloseServiceHandle(hSCManager);
}
return 0;
}
这是驱动程序代码
DRIVER_INITIALIZE DriverEntry;
#ifdef ALLOC_PRAGMA
#pragma alloc_text (INIT, DriverEntry)
#endif
NTSTATUS
DriverEntry(
_In_ PDRIVER_OBJECT DriverObject,
_In_ PUNICODE_STRING RegistryPath
)
{
WDF_DRIVER_CONFIG config;
NTSTATUS status;
DbgPrint("Hello World!\n");
WDF_DRIVER_CONFIG_INIT(&config,
NULL
);
config.DriverInitFlags = WdfDriverInitNonPnpDriver;
status = WdfDriverCreate(DriverObject,
RegistryPath,
WDF_NO_OBJECT_ATTRIBUTES,
&config,
WDF_NO_HANDLE
);
if (!NT_SUCCESS(status)) {
KdPrint( ("WdfDriverCreate failed with "
"status 0x%x\n", status));
}
return status;
}
函数process_error()
是GetLastError()
的包装器,它除了提供数值外,还显示错误代码的文本版本。
我已经用尽了解决这个问题的所有选项。谷歌搜索只发现了一个问题,这里提出了问题。
问题是什么?
额外说明:驱动程序是使用Visual Studio 2012 Ultimate编译的,而我的启动代码是使用MinGW-W64(使用GCC)编译的。但启动代码应该与驱动程序无关。
额外注意事项2:经过长时间的疑惑后,我开始考虑是否是测试签名证书,因为我尝试了从MSDN提供的驱动程序源代码,并且在成功编译后,我仍然得到了ERROR_INVALID_HANDLE(错误代码) 6)试图启动时。 我还没有找到解决方案。
答案 0 :(得分:9)
我将其跟踪到驱动程序的项目设置。该项目缺少KMDF版本
调整以下内容(在“驱动程序模型设置”下):
- KMDF版本Major = 1
- KMDF版本次要= 9
点击OK,重新编译,然后重新安装。为我工作!
答案 1 :(得分:0)
一些想法:
你正在使用HANDLE hSCManager&&处理hService时,应将它们声明为SC_HANDLE
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682450(v=vs.85).aspx
“ lpBinaryPathName [in,optional] 服务二进制文件的标准路径。如果路径包含空格,则必须引用它以便正确解释。例如,“d:\ my share \ myservice.exe”应指定为“\”d:\ my share \ myservice.exe \“”。
尝试使用驱动程序的完整路径
答案 2 :(得分:0)
启动内核驱动程序时遇到了同样的问题:
startservice失败6:
原来是" classID GUID"驱动程序与另一个驱动程序相同(通过设备管理器查找,查看事件显示不同的驱动程序名称)。
使用在线生成器创建新的GUID并替换项目的.inf文件中的那个(在VS中,而不是任何texteditor或其他)。 在目标机器上重建和部署后,一切正常。
希望这会有所帮助......
答案 3 :(得分:0)
以管理员权限运行Visual Studio
答案 4 :(得分:-1)
您对OpenSCManager()
的来电仅要求SC_MANAGER_CREATE_SERVICE
权限,这对于OpenService()
或StartService()
来说是不够的。