6

出于我的目的,我需要为 Windows 编写一个内核模式驱动程序。目前我正试图让它在 Windows 7 x64 下工作。

我在 Visual Studio 2012 中使用 KMDF 驱动程序的默认代码创建了一个简单的项目。我编译了带有测试签名的代码。驱动程序已编译和签名。我还启用了测试签名,清楚地显示在我的桌面左下角。

在尝试将驱动程序作为服务启动时,我总是收到错误代码 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:想了半天我开始想是不是test-sign证书的问题,因为我尝试了MSDN提供的驱动源码,编译成功后还是出现ERROR_INVALID_HANDLE(Error Code 6)的时候试图启动它。我还没有找到解决办法。

4

5 回答 5

10

我将此追踪到驱动程序的项目设置。项目中缺少 KMDF 版本。

调整以下(在驱动程序模型设置下):
  - KMDF 主要版本 = 1
  - KMDF 次要版本 = 9

点击 OK,重新编译并重新安装。为我工作!

于 2014-05-16T22:15:02.480 回答
0

一些想法:

您正在使用 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\""。

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

于 2012-11-11T16:22:34.680 回答
0

以管理员权限运行 Visual Studio

于 2019-01-31T05:09:24.593 回答
0

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


启动服务失败 6:

句柄无效

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

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

希望这可以帮助...

于 2016-10-07T09:48:46.240 回答
-1

您的调用OpenSCManager()只是请求SC_MANAGER_CREATE_SERVICE其本身的许可,这不足以OpenService()StartService()成功。

于 2012-11-06T19:23:21.390 回答