用CreateFile函数怎么启动驱动?

zzz822163 2008-11-07 10:05:24
我生成了一个HelloWorld.sys,把他放在了应用程序的debug目录下
在exe程序中
#define MY_DEVICE_NAME ".\\HelloWorld"
HANDLE hDevice=NULL; //设备句柄

//获得设备句柄
hDevice=CreateFile(MY_DEVICE_NAME,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

if (hDevice==INVALID_HANDLE_VALUE)
{
printf("INVALID_HANDLE_VALUE");
#ifdef DEBUGMSG
printf("CreateFile() GetLastError reports %d\n",erron);
#endif
return FALSE;
}
他总是失败,每次都执行这个printf("INVALID_HANDLE_VALUE");
我换成#define MY_DEVICE_NAME "\\\\.\\HelloWorld" 也不行,大家给我说说\\\\.\\这些该怎么设定吧.
...全文
1291 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
show 2010-04-14
  • 打赏
  • 举报
回复
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
zzz822163 2008-11-07
  • 打赏
  • 举报
回复
#define MY_DEVICE_NAME "\\\\.\\HelloWorld"
例子是这么写的,但我不懂他的意思,所以给改了,\\\\到底是什么意思啊
我是看的驱动程序简单入门 ,写驱动版的“Hello World”,这个是用户态程序:

BOOL DriverControl (TCHAR *Maik)
{
HANDLE hDevice=NULL; //设备句柄

//获得设备句柄
hDevice=CreateFile(MY_DEVICE_NAME,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

if (hDevice==INVALID_HANDLE_VALUE)
{
printf("INVALID_HANDLE_VALUE");
#ifdef DEBUGMSG
printf("CreateFile() GetLastError reports %d\n",erron);
#endif
return FALSE;
}
printf("DriverControl");
//启动
if (strcmpi(Maik,MY_DEVICE_START)==0)
{
//传递启动的I/O控制代码
if (!(DeviceIoControl(hDevice,START_HELLPWORLD,NULL,0,NULL,0,NULL,NULL)))
{
#ifdef DEBUGMSG
printf("DeviceIoControl() GetLastError reports %d\n",erron);
#endif
CloseHandle(hDevice);
return FALSE;
}
else
printf("succeed");
}

//停止
if (strcmpi(Maik,MY_DEVICE_STOP)==0)
{
//传递停止的I/O控制代码
if (!(DeviceIoControl(hDevice,STOP_HELLPWORLD,NULL,0,NULL,0,NULL,NULL)))
{
#ifdef DEBUGMSG
printf("DeviceIoControl() GetLastError reports %d\n",erron);
#endif
CloseHandle(hDevice);
return FALSE;
}
}

if (hDevice)
CloseHandle(hDevice); //关闭句柄

return TRUE;
}
zzz822163 2008-11-07
  • 打赏
  • 举报
回复
我现在已经用工具安装服务启动服务了,但还是CreateFile失败,错误代码是2
还有我怎么知道sys文件已经被启动了
他代码里有DbgPrint("Starting DriverEntry()\n"); 但我不知道他都输出到哪里去了
snow_haoxue 2008-11-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 zzz822163 的帖子:]
我生成了一个HelloWorld.sys,把他放在了应用程序的debug目录下
在exe程序中
#define MY_DEVICE_NAME ".\\HelloWorld"
HANDLE hDevice=NULL; //设备句柄

//获得设备句柄
hDevice=CreateFile(MY_DEVICE_NAME,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
[/Quote]

你想要做什么呢?说句实话,从你的代码中我没怎么看懂你想要做什么

如果单说你要做驱动、使用CreateFile启动它,那么CreateFile的第一个参数肯定是错误的,对于驱动来说,这个参数一定是由(三个字母外+index)构成的,以便对应驱动程序中的函数,在实际的驱动中对应的Init、open、close等等函数也都是用XXX_作为前缀的。另外,要使用驱动也需要先注册成功才可以使用的

如果你只是想要用CreateFile打开其他文件的话,你的写法是可以的
Pipi0714 2008-11-07
  • 打赏
  • 举报
回复
你的将你的驱动安装然后才能使用CreateFile,它并不能启动设备
palmax 2008-11-07
  • 打赏
  • 举报
回复
CreateFile 只是打开驱动设备,\\\\.\\yourdevicename,并不是“启动”

驱动sys文件应该像服务一样在注册表里注册的,否则系统不知道你的驱动在什么地方

启动的话,也可以像服务一样的启动
zzz822163 2008-11-07
  • 打赏
  • 举报
回复
是不是之前得先启动服务呀,我是第一次玩这个sys文件,啥都不懂,请大家帮我说仔细点吧
zzz822163 2008-11-07
  • 打赏
  • 举报
回复
我找到了,非常感谢各位指点,等我改天加分之后再来结贴
palmax 2008-11-07
  • 打赏
  • 举报
回复
驱动,你可以在我的电脑->管理->设备管理器->(菜单【查看】->【显示隐藏的设备】)->右边列表里,展开【非即插即用驱动程序】看到

service.msc里没有的
zzz822163 2008-11-07
  • 打赏
  • 举报
回复
我明白了,再问个问题,services.msc打开的页面里面的服务都是非驱动的吗?因为在里面找不到我的服务.而以前我写的一般的服务程序在里面都有显示
palmax 2008-11-07
  • 打赏
  • 举报
回复
一般是卸载时有这个问题

也不是所有的驱动/服务都有这个问题,我觉得安全的做法是在 DeleteService 之后 , 再到注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下面,把你的服务的注册表项删除(用代码删除)。
否则你再CreateService、StartService调用会失败。
zzz822163 2008-11-07
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 palmax 的回复:]
驱动这个一般是你第一次直接安装后启动,OK
然后你卸载,也OK
但是如果不重启的话,再安装,启动,有时就有问题。 所以你看到很多带有驱动的软件都是在卸载完成时要重启系统。

驱动在注册表里也是Service下面的项,你删除的话,系统也是标记为删除,DeletedFlag = 1,在重启时才删除。
[/Quote]
真的重启电脑就好了,难道我修改了驱动之后都得重启电脑吗?这也太麻烦了吧?
yxz_lp 2008-11-07
  • 打赏
  • 举报
回复
驱动要先启动(CreateService 具体看MSDN)后,才能CreateFile 打开驱动。
palmax 2008-11-07
  • 打赏
  • 举报
回复
驱动这个一般是你第一次直接安装后启动,OK
然后你卸载,也OK
但是如果不重启的话,再安装,启动,有时就有问题。 所以你看到很多带有驱动的软件都是在卸载完成时要重启系统。

驱动在注册表里也是Service下面的项,你删除的话,系统也是标记为删除,DeletedFlag = 1,在重启时才删除。
zzz822163 2008-11-07
  • 打赏
  • 举报
回复
我重新启动了,test_console.exe都运行一切良好了,都输出了printf("succeed");
而且我再用工具启动服务,他会说已经在running 中了
我都不知道刚才debugview窗口中为什么会有hellloword的,因为我从来就没成功过
shenyi0106 2008-11-07
  • 打赏
  • 举报
回复
重新安装了并不代表你就启动了,你重新启动一下看看先
zzz822163 2008-11-07
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 cnzdgs 的回复:]
既然已经打开成功了,就不必再讨论设备名的问题了。
DeviceIoControl的lpBytesReturned参数不要给NULL,给一个DWORD型变量的地址,接收返回长度(虽然是0)。
[/Quote]
这下好使了,刚才我想加分的,系统居然不让加,说要明天才能加
刚才我的debugview窗口中都出现helloword了,但是我又把服务卸载了再重新安装,debugview窗口中又不出现helloword了,
这又是怎么了?
TO palmax ,我是拷贝的教程的代码,没想到教程也不好使
palmax 2008-11-07
  • 打赏
  • 举报
回复
因为你打开驱动时没有指定 FILE_FLAG_OVERLAPPED,所以最后两个参数中lpBytesReturned必须不能为NULL,而lpOverlapped会被忽略。
palmax 2008-11-07
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zzz822163 的回复:]
CreateService之类的我现在已经做了,驱动已经running中了,
我调试到DeviceIoControl时出现断点了
test_console.exe 中的 0x7c80168a 处未处理的异常: 0xC0000005: 写入位置 0x00000000 时发生访问冲突 。
GetLastError用不了哎,根本就不能往下运行了呀
[/Quote]

我是让你在调试的Watch窗口中输入 err,hr 来看LastError

刚才又看一遍你在6楼贴的代码,你怎么能全都传NULL呢?
cnzdgs 2008-11-07
  • 打赏
  • 举报
回复
既然已经打开成功了,就不必再讨论设备名的问题了。
DeviceIoControl的lpBytesReturned参数不要给NULL,给一个DWORD型变量的地址,接收返回长度(虽然是0)。
加载更多回复(8)

2,643

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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