打开设备失败......

fangchao918628 2010-05-19 03:45:29
程序需要开机去打开一个设备...传入一些数据...
但是不知道为什么显示调试信息 打开设备失败,GetLastError 显示2 "文件不存在"
但是我用WinObj 去查看但是设备已经创建成功并存在.

这时候没办法我当返回为2 的时候我循环去读,一直到成功..我用记录循环的次数,但是通过调试信息查看一次就成功了.

我又改为循环100次....晕了...这时候100次都没有成功.


有哪位大大知道为什么这种情况么.....
Dev = CreateFile("\\\\.\\FileXXXXX",
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
...全文
650 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
fangchao918628 2010-05-22
  • 打赏
  • 举报
回复
恩..我改成了1...
jyh_baoding 2010-05-20
  • 打赏
  • 举报
回复
看自己进行了什么设备操作造成
cnzdgs 2010-05-20
  • 打赏
  • 举报
回复
你的驱动程序是以SERVICE_AUTO_START类型安装的(注册表中Start值为2),这种Start类型是在系统启动后才加载,应用程序加载时,驱动程序很可能还没有加载,所以也不存在设备,自然打不开。
解决方法有:
1、把驱动程序的Start值改成1(但要确定程序的依赖项都已启动);
2、应用程序在打开失败时,如果错误码是2,Sleep(1000)后再重试,如此循环N次;
3、应用程序调用StartService主动加载驱动,判断驱动的状态。
船过水无痕 2010-05-19
  • 打赏
  • 举报
回复
要不进行调试看看喽!
船过水无痕 2010-05-19
  • 打赏
  • 举报
回复
个人感觉楼主这循环代码是有问题的!

while(INVALID_HANDLE_VALUE == Dev) //首先返回这个结果,并不都是 Error并不都是2,如果错误值不是2,你这里就成死循环了,oCount不会递增,自然就不会退出! 暂且不说这个问题,楼主能贴完整点的代码吗?
{

int pError = GetLastError();

if(pError == 2)
{
oCount++;

Dev = CreateFile("\\\\.\\FileXXXX",
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
}
if(oCount == 100)
break;

}
fangchao918628 2010-05-19
  • 打赏
  • 举报
回复
而且我打调试信息....如果成功循环都没进入
fangchao918628 2010-05-19
  • 打赏
  • 举报
回复
我这样写的..
while(INVALID_HANDLE_VALUE == Dev)
{

int pError = GetLastError();

if(pError == 2)
{
oCount++;

Dev = CreateFile("\\\\.\\FileXXXX",
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
}
if(oCount == 100)
break;

}

这样写不行

if(oCount == 100)
break;

把这句去掉就可以.........
船过水无痕 2010-05-19
  • 打赏
  • 举报
回复
这么怪异??? 楼主意思是
1.
while(1) //这样就行???
{
hFile = CreateFile(...);
if(hFile != INVALID_HANDLE_VALUE)
{
printf("success\n");
break;
}
...
}

2. for (int i = 0;i < 100;i++) //这样就不行???
{
hFile = CreateFile(...);
if(hFile != INVALID_HANDLE_VALUE)
{
printf("success\n");
break;
}
}
fangchao918628 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 liuyu60305002 的回复:]
引用 9 楼 fangchao918628 的回复:

没看明白到底啥意思?? 楼主用怎么加载的那个驱动, SCM管理器??? 又是否加载成功呢!
[/Quote]

手动启动程序没有问题...开机启动就失败...然后我加了个无限循环 一旦成功我就跳出循环这样也没有问题.
我就想看看他循环了多少次.打印出调试信息显示是一次就成功了.这时候就郁闷了想知道是什么原因加了个无限循环就能读取成功..修改下无限循环让他循环100次但是这时候又失败了.
我通过工具查看驱动加载成功..设备也创建成功
船过水无痕 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fangchao918628 的回复:]
这时候没办法我当返回为2 的时候我循环去读,一直到成功..我用记录循环的次数,但是通过调试信息查看一次就成功了.

我又改为循环 100次....晕了...这时候100次都没有成功.
[/Quote]

没看明白到底啥意思?? 楼主用怎么加载的那个驱动, SCM管理器??? 又是否加载成功呢!
fangchao918628 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 liuyu60305002 的回复:]
\\\\.\\FileXXXXX 你确定是你那驱动的符号链接吗? 首先得弄清楚符号链接是不是正确,如果不正确,你Open N次都一样失败!
[/Quote]
应该是啊...我加循环的时候能够打开成功
船过水无痕 2010-05-19
  • 打赏
  • 举报
回复
\\\\.\\FileXXXXX 你确定是你那驱动的符号链接吗? 首先得弄清楚符号链接是不是正确,如果不正确,你Open N次都一样失败!
fangchao918628 2010-05-19
  • 打赏
  • 举报
回复

Irp->IoStatus.Status = STATUS_SUCCESS;

Irp->IoStatus.Information = 0;

IoCompleteRequest(Irp, IO_NO_INCREMENT);

return STATUS_SUCCESS;


IRP_MJ_CREATE 就上面的那样

设备类型是 FILE_DEVICE_UNKNOWN
bilaopao 2010-05-19
  • 打赏
  • 举报
回复
有设备驱动代码没?

有最好,没有也得想办法跟一下。

用windbg跟IRP_MJ_CREATE

mcaok 2010-05-19
  • 打赏
  • 举报
回复
顶一下。
向立天 2010-05-19
  • 打赏
  • 举报
回复
什么设备
是头一次出现这个问题
还是从来没有成功过
soswaidao 2010-05-19
  • 打赏
  • 举报
回复
尽一行代码看不出什么
liuharris 2010-05-19
  • 打赏
  • 举报
回复
试一下异步方式看看 FILE_FLAG_OVERLAPPED
aa3000 2010-05-19
  • 打赏
  • 举报
回复
估计是那个设备的驱动有问题吧

16,549

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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