阅读:3280回复:20
传一个简单的隐藏文件的过滤驱动,想请教与应用程序的通信问题
在驱动程序中:
// 创建连接名 RtlInitUnicodeString(&DosNameLink, L"\\DosDevices\\SFilter"); status = IoCreateSymbolicLink(&DosNameLink, &nameString); 返回的status 的值是成功的。我想这个连接应该创建成功的。 在应用程序中: CHAR DevicePath[] = "\\\\.\\SFilter"; HANDLE hDevice; hDevice = CreateFile(DevicePath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (INVALID_HANDLE_VALUE == hDevice) { MessageBox("打开文件出错!!"); return; } 我想这样应该可以打开设备的吧?可是总是提示“打开文件出错” 不知道为什么,所以应用程序至今一直无法通信。 想请各位大哥帮忙下! |
|
|
沙发#
发布于:2007-11-22 10:55
我也是同样的问题,不知道哪里设置出了问题,正在想办法。
|
|
板凳#
发布于:2007-11-22 14:43
用GetLastError看看错误出在哪里。
|
|
地板#
发布于:2007-11-22 15:21
int i = 1;
i = GetLastError(); i得到的值是00000000000 不知道是什么原因 |
|
地下室#
发布于:2007-11-22 15:48
〖0〗-成功完成,没有错误。
〖1〗-功能错误。 〖2〗-系统找不到指定的文件。 我想是这样吧,说明是正确的可是为什么INVALID_HANDLE_VALUE == hDevice 有点想不通了 |
|
5楼#
发布于:2007-11-22 15:52
GetLastError();
放错位置了 其值为1, 说明功能错误。 不知道这个问题要怎么解决 |
|
6楼#
发布于:2007-11-22 21:17
我也是createfile返回INVALID_HANDLE_VALUE ,GetLastError()得到0x1错误码,修改调试搞了2,3天了,毫无进展,不知道哪里出了问题,郁闷。
|
|
7楼#
发布于:2007-11-23 10:53
用户被禁言,该主题自动屏蔽! |
|
8楼#
发布于:2007-11-23 10:57
ifs中不是有现成的例子吗?
|
|
9楼#
发布于:2007-11-23 12:30
1 看看错误号1什么意思
2 如果不知道错误号1什么意思:确定驱动是否加载成功? |
|
|
10楼#
发布于:2007-11-23 13:17
我只知道 1 是功能错误
其他不知道了 驱动一定加载成功了 因为可以用了, 可以隐藏文件夹名为hide 的文件夹。和文件后缀名为.hide的文件 所以深信驱动是加载成功的。 我以前写过U盘跟应用程序的通信 觉得是没有问题的 所以这次在我已知的范围内,我想是正确的。 找不出到底错在哪里 |
|
11楼#
发布于:2007-11-23 13:44
是不是要加 GENERIC_READ 和 GENERIC_WRITE
|
|
12楼#
发布于:2007-11-23 14:27
小妹你检查一下你的设备对象是否有正确处理IRP_MJ_CREATE!!
|
|
13楼#
发布于:2007-11-23 16:43
改filespy也碰到过这种错误,不知道是怎么回事
|
|
14楼#
发布于:2007-11-23 20:18
驱动VS应用.rar 以前的找不到了,这里发个简单的连接例子,肯定能帮到你的.写的驱动SYS和应用程序连接的.
|
|
|
15楼#
发布于:2007-11-23 22:17
你的驱动最少有两个错误。
1,当判断是自己的设备的时候,特别是在irp_mj_create的时候,返回成功并完成,之所以会出现错误代码一,是因为你返回的STATUS_INVALID_DEVICE_REQUEST造成的 2,你的控制码不能那么定义。微软要求某个值以上的是用户自定义,你这样做很可能造成系统的deviceiocontrol被你错误的完成 |
|
16楼#
发布于:2007-11-24 09:55
谢谢各位大哥指点 试试
|
|
17楼#
发布于:2007-11-26 12:05
我是在DriverEntry中对创建的控制设备对象建立符号连接,在SfCreate中设置irp成功并完成irp,返回STATUS_SUCCESS,但是当应用程序createfile的时候就蓝屏了,问题还是没有解决,苦恼中。
|
|
18楼#
发布于:2007-11-26 13:57
按xx_qiang说的,非要在SfCreate中判断DeviceObject是不是控制设备对象里面,也就是在
if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject)) {……} 里面把 Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST和return STATUS_INVALID_DEVICE_REQUEST 改成 Irp->IoStatus.Status = STATUS_SUCCESS和return STATUS_SUCCESS,这样应用程序CreateFile时是成功的。而我是在SfCreate函数最开始,也就是在 if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject)) {……} 的前面做这些事的: Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest( Irp, IO_NO_INCREMENT ); return STATUS_SUCCESS; 最终应用程序CreateFile时导致蓝屏,实在不明白为什么非要判断DeviceObject是不是控制设备对象,非要在if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject)) {……} 里面改才行,在外面改就不行了?搞不懂,SFilter的规则吗?(而且声明变量只能在函数的最开始声明,不然就会编译错误,实在搞不懂?) |
|
19楼#
发布于:2008-05-21 15:53
Re:传一个简单的隐藏文件的过滤驱动,想请教与的通信问题应用程序
|
|
上一页
下一页