2

我最近一直在尝试使用带有 Visual Studio 2015 的 WDK 创建我的第一个驱动程序,到目前为止,我能够生成一个 .sys 文件,以及默认生成的 .cert 和其他文件。

当我尝试动态加载驱动程序时,我的问题出现了,该函数失败,代码为 577,ERROR_INVALID_IMAGE_HASH。

这是我用来加载驱动程序的代码:

#include <windows.h>
#include <stdio.h>

int _cdecl main(void)
{
   HANDLE hSCManager;
   HANDLE hService;
   SERVICE_STATUS ss;
   DWORD error;
   PHANDLE hToken;

   hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
   error = GetLastError();
   printf("Load Driver\n");

   if (hSCManager)
   {
       printf("Create Service\n");

       hService = CreateService(hSCManager
        , "test"
        , "test Driver"
        , SERVICE_START | DELETE | SERVICE_STOP
        , SERVICE_KERNEL_DRIVER
        , SERVICE_DEMAND_START
        , SERVICE_ERROR_IGNORE
        , "C:\\driver_test.sys"
        , NULL, NULL, NULL, NULL, NULL);
       error = GetLastError();
       if(error == ERROR_SERVICE_EXISTS)
       {
           error = 0;
       }
       if(!hService)
       {
           hService = OpenService(hSCManager, "test", SERVICE_START | DELETE
           | SERVICE_STOP);
       }
       error = GetLastError();
       if (hService)
       {
           printf("Start Service\n");
           StartService(hService, 0, NULL);
           error = GetLastError();
           if (error!= NO_ERROR)
           {
               printf("Error: %d\nPress Enter to exit", error);
               getchar();
           }
           else
           {
               printf("SUCCESS\nPress Enter to close service\n");
               getchar();

           }

           ControlService(hService, SERVICE_CONTROL_STOP, &ss);
           CloseServiceHandle(hService);

           DeleteService(hService);
       }

       CloseServiceHandle(hSCManager);
   }

   return 0;
}

一旦我在调用 StartService 函数后立即调用 GetLastError 函数,就会出现错误。

到目前为止,我所了解的是我要测试的驱动程序没有有效的证书,或者至少 windows 不知道它的存在。

因此,我尝试在 vs2015 的开发人员命令提示符中使用 signtool,并且能够成功签署我的驱动程序。

不幸的是,我回去尝试加载它,但仍然遇到同样的错误。

解决此问题的最佳行动方案是什么?

谢谢

4

0 回答 0