写的第一个驱动就失败,StartService老是失败,求助
驱动代码:
//////////////////////////////////////////////////
// FirstDriver.cpp文件
extern "C"
{
#include <ntddk.h>
}
#include <devioctl.h>
NTSTATUS DispatchCreateClose(PDEVICE_OBJECT pDevObj, PIRP pIrp);
void DriverUnload(PDRIVER_OBJECT pDriverObj);
#define DEVICE_NAME L"\\DEVICE\\devFirstDriver"
#define LINK_NAME L"\\??\\slFirstDriver"
// 驱动程序加载时调用DriverEntry例程
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
{
NTSTATUS status = STATUS_SUCCESS;
DbgPrint("FirstDriver:DriverEntry\n");
//初始化各个派遣例程
pDriverObj->MajorFunction[IRP_MJ_CREATE] = DispatchCreateClose;
pDriverObj->MajorFunction[IRP_MJ_CLOSE] = DispatchCreateClose;
pDriverObj->DriverUnload = DriverUnload;
//设备名称
UNICODE_STRING ustrDevName;
RtlInitUnicodeString(&ustrDevName, DEVICE_NAME);
//创建设备
PDEVICE_OBJECT pDevObj;
status = IoCreateDevice(pDriverObj,
0,
&ustrDevName,
FILE_DEVICE_UNKNOWN,
0,
FALSE,
&pDevObj);
if(!NT_SUCCESS(status))
{
return status;
}
//符号连接名称
UNICODE_STRING ustrLinkName;
RtlInitUnicodeString(&ustrLinkName, LINK_NAME);
//创建关联
status = IoCreateSymbolicLink(&ustrLinkName, &ustrDevName);
if(!NT_SUCCESS(status))
{
IoDeleteDevice(pDevObj);
return status;
}
return STATUS_SUCCESS;
}
void DriverUnload(PDRIVER_OBJECT pDriverObj)
{
DbgPrint("FirstDriver:DriverUnload...\n");
//删除符号连接名称
UNICODE_STRING ustrLinkName;
RtlInitUnicodeString(&ustrLinkName, LINK_NAME);
IoDeleteSymbolicLink(&ustrLinkName);
//删除设备对象
IoDeleteDevice(pDriverObj->DeviceObject);
}
NTSTATUS DispatchCreateClose(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
DbgPrint("FirstDriver:DispatchCreateClose...\n");
pIrp->IoStatus.Status = STATUS_SUCCESS;
//完成此请求
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
测试代码:
#include <windows.h>
#include <winioctl.h>
#include <winsvc.h>
#include <stdio.h>
#pragma comment(lib, "advapi32.lib")
int main()
{
char szDriverPath[256];
char szLinkName[] = "slFirstDriver";
char* p;
::GetFullPathName("FirstDriver.sys", 256, szDriverPath, &p);
//打开SCM管理器
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(NULL == hSCM)
{
return 0;
}
//创建或打开服务
SC_HANDLE hService = ::CreateService(hSCM, szLinkName, szLinkName, SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, szDriverPath, NULL,
0, NULL, NULL, NULL);
if(NULL == hService)
{
int nError = ::GetLastError();
if(nError == ERROR_SERVICE_EXISTS || nError == ERROR_SERVICE_MARKED_FOR_DELETE)
{
hService = ::OpenService(hSCM, szLinkName, SERVICE_ALL_ACCESS);
}
}
if(NULL == hService)
{
printf("创建服务出错\n");
return -1;
}
if(0 == ::StartService(hService, 0, NULL))<-------这里失败
{
int nError = ::GetLastError();
if(nError != ERROR_SERVICE_ALREADY_RUNNING)
{
printf("启动服务出错\n");
return -1;
}
}
//打开驱动程序所控制设备的句柄
char sz[256] = "";
wsprintf(sz, "\\\\.\\%s", szLinkName);
HANDLE hDriver = ::CreateFile(sz, GENERIC_WRITE | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
if(INVALID_HANDLE_VALUE == hDriver)
{
printf("打开设备失败\n");
return -1;
}
::CloseHandle(hDriver);
SERVICE_STATUS ss;
::ControlService(hService, SERVICE_CONTROL_STOP, &ss);
//从SCM数据库中删除服务
::DeleteService(hService);
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
return 0;
}
用的是一本参考书上的模板,用向导产生的驱动程序