写的第一个驱动就失败,StartService老是失败,求助

tracing 2006-11-23 08:39:48
驱动代码:
//////////////////////////////////////////////////
// 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;
}
用的是一本参考书上的模板,用向导产生的驱动程序
...全文
908 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
LoveBugs 2006-12-28
  • 打赏
  • 举报
回复
早几天我也写了个. 可以用. 我也刚学驱动. 以后多多交流. :)

class test_sys_tools
{
string m_sys_name;
string m_service_name;
SC_HANDLE m_hservice;
SC_HANDLE m_hscm;

BOOL install();
BOOL open();
BOOL uninstall();
BOOL start();
BOOL stop();
public:
test_sys_tools(const string& _sys_name, const string &_service_name ):
m_sys_name(_sys_name),
m_service_name(_service_name),
m_hservice(NULL),
m_hscm(NULL){}
void test()
{
if(!install() && !open())
{
return ;
}

start();

system("pause");

stop();

uninstall();

}
~test_sys_tools()
{
if(m_hservice)
CloseServiceHandle(m_hservice);
if(m_hscm)
CloseServiceHandle(m_hscm);
}
};

BOOL test_sys_tools::install()
{
if((m_hscm = OpenSCManager(0,0,SC_MANAGER_CREATE_SERVICE)) == NULL)
{
cout <<"OpenSCManager:"<<GetLastError()<<endl;
return false;
}

if((m_hservice = CreateService( m_hscm,
m_service_name.c_str(),
m_service_name.c_str(),
SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,m_sys_name.c_str(),
NULL,
NULL,
NULL,
NULL,
NULL)) == NULL)
{
cout <<"CreateService:"<<GetLastError()<<endl;
return false;
}
return true;
}

BOOL test_sys_tools::open()
{
return (m_hservice = OpenService(m_hscm,m_service_name.c_str(),SERVICE_ALL_ACCESS)) != NULL;
}

BOOL test_sys_tools::start()
{
if(!StartService(m_hservice, 0, NULL))
{
cout << "StartService:"<<GetLastError()<<endl;
}
return TRUE;
}

BOOL test_sys_tools::stop()
{
SERVICE_STATUS lpServiceStatus ;
if(!ControlService(m_hservice, SERVICE_CONTROL_STOP, &lpServiceStatus))
{
cout << "ControlService(Stop):"<<GetLastError()<<endl;
}
return TRUE;
}

BOOL test_sys_tools::uninstall()
{
if(!DeleteService(m_hservice))
{
cout << "DeleteService:"<<GetLastError()<<endl;
}
return TRUE;
}
tracing 2006-12-26
  • 打赏
  • 举报
回复
jacklzw88 2006-11-29
  • 打赏
  • 举报
回复
你去看看filemon吧
tracing 2006-11-29
  • 打赏
  • 举报
回复
自己顶
wangk 2006-11-23
  • 打赏
  • 举报
回复
你把驱动放在system32/drivers下面再看看行不行。
绝对路径的话要用下面的格式:
\??\C:\WINDOWS\system32\drivers\xxx.sys
tracing 2006-11-23
  • 打赏
  • 举报
回复
我不明白为什么会提示路径有问题,我把另一个驱动放在当前工程的目录下,是服务是可以启动的
大熊猫侯佩 2006-11-23
  • 打赏
  • 举报
回复
看看实际打开的是什么路径
tracing 2006-11-23
  • 打赏
  • 举报
回复
没有,谢谢
wangk 2006-11-23
  • 打赏
  • 举报
回复
szDriverPath路径里带有空格?有的话建议加上双引号。
tracing 2006-11-23
  • 打赏
  • 举报
回复
对的,我用这个测试程序安装其他驱动是可以的,不知道是不是驱动的问题,还有光盘里的一个例子,我在一台机上StartService失败,换台机就可以了,不知道有没有什么设置啊
wangk 2006-11-23
  • 打赏
  • 举报
回复
将szDriverPath打印出来,看看取得是否正确。
tracing 2006-11-23
  • 打赏
  • 举报
回复
哦,忘记说了,错误代码是2,找不到系统指定路径,当是我的.sys文件已经放到当前工程的目录下了啊
peter2108 2006-11-23
  • 打赏
  • 举报
回复
检查是否管理员登录?
jacklzw88 2006-11-23
  • 打赏
  • 举报
回复
错误提示是什么?你可以用inf来装
guileen 2006-11-23
  • 打赏
  • 举报
回复
楼主我支持你 ----------------- 松自萧萧云自飘 风中独酌亦逍遥 抚却凡愁与尘念 琴韵未解恨已销
tracing 2006-11-23
  • 打赏
  • 举报
回复
你们能不能把代码运行一下啊,我试了下还是不行啊
jacklzw88 2006-11-23
  • 打赏
  • 举报
回复
SERVICE_KERNEL_DRIVER或者SERVICE_FILE_SYSTEM_DRIVER应该把sys文件放到drivers下去,用相对路径就可以了

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧