gpt4 book ai didi

c - 为什么我在 StartService 上收到错误代码 6?

转载 作者:可可西里 更新时间:2023-11-01 13:29:24 25 4
gpt4 key购买 nike

出于我的目的,我需要为 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:想了半天是不是test-sign证书的问题,因为我试过MSDN提供的驱动源码,编译成功后还是出现ERROR_INVALID_HANDLE(Error Code 6)尝试启动时。我还没有找到解决方案。

最佳答案

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

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

点击确定,重新编译并重新安装。对我有用!

关于c - 为什么我在 StartService 上收到错误代码 6?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13254487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com