为什么我在StartService上得到错误代码6?

为了我的目的,我需要为Windows编写一个内核模式驱动程序。 目前我正在尝试使其在Windows 7 x64下工作。

我在Visual Studio 2012中使用KMDF驱动程序的默认代码创build了一个简单的项目。 我编写了testing签名的代码。 司机被编辑和签字。 我也启用了testing签名function,清晰地显示在桌面的左下angular。

在试图启动驱动程序作为服务时,我总是得到一个错误代码6:无效的句柄错误(我已经简化了代码,只是尝试启动它,但仍然没有工作;默认代码也不工作)

基本上,我和这里提出的问题有同样的问题

https://stackoverflow.com/questions/12080157/startservice-error-6

不幸的是他从来没有回答。 我尝试了提供的解决scheme,但它也没有帮助。

我的代码,试图启动驱动程序是

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()一个包装,它除了提供数值之外,还显示错误代码的文本版本。 我已经用尽了所有提供给我的选项来解决这个问题。 谷歌search只揭示了这个问题的一个事件,并在这里问了这个问题。

问题是什么?

额外的注意事项:驱动程序是用Visual Studio 2012 Ultimate编译的,而我的启动代码是用MinGW-W64(使用GCC)编译的。 但是启动代码不应该像驱动程序那么重要。

额外的注意事项2:想了很长时间什么可能是错误的,我开始考虑如果它是testing符号证书,因为我尝试从MSDN提供的驱动程序源代码,并成功编译后,我仍然得到ERROR_INVALID_HANDLE(错误代码6)试图启动它。 我还没有find解决办法。

Solutions Collecting From Web of "为什么我在StartService上得到错误代码6?"

我跟踪到这个驱动程序的项目设置。 项目中缺少KMDF版本。

调整以下(在“驱动程序型号设置”下):
– KMDF版本专业= 1
– KMDF版本轻微= 9

点击确定,重新编译,然后重新安装。 为我工作!

一些想法:

您正在使用HANDLE hSCManager && HANDLE 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 \“”。

尝试使用驱动程序的完整路径

我在启动内核驱动程序时遇到同样的问题:


启动服务失败6:

该句柄无效

发现驱动程序的“classID GUID”与另一个驱动程序的“classID GUID”相同(通过设备管理器查找,查看事件显示不同的驱动程序名称)。

使用在线生成器来创建一个新的GUID,并替换项目的.inf文件中的一个(在VS中,而不是任何texteditor或一些)。 在目标机器上重建和部署后,一切正常。

希望这可以帮助…

您对OpenSCManager()调用本身只需要SC_MANAGER_CREATE_SERVICE权限,这对于OpenService()StartService()是不够的。