6626|12

65

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

用CreateFile打开过滤驱动失败,这是怎么回事? [复制链接]

    做了一个U盘过滤驱动,需要用DeviceIoControl和过滤驱动通信,在MFC exe程序中可以使用CreateFile打开并使用DeviceIoControl与过滤驱动通信。

    但是在一个dll中却无法使用CreateFile打开驱动,我用GetLastError和FormatMessage跟踪,没有报错,说是操作成功完成,估计是权限不够吧。


    但是过滤驱动的DriverEntry函数中,已经加了降低权限的代码,不知道为什么还是打不开?向大家请教

#define USBFILTER_SYSDEVICE_NAME L"\\Device\\HTUsbFilter"
#define USBFILTER_DOSDEVICE_NAME L"\\DosDevices\\HTUsbFilter"

#pragma INITCODE
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
        IN PUNICODE_STRING RegistryPath)
{
        。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。                                       
        MyDriverObject = DriverObject;
        // create control device object
         RtlInitUnicodeString(&DeviceName, USBFILTER_SYSDEVICE_NAME);
        NtStatus = IoCreateDevice(DriverObject,
                                      0,
                                                          &DeviceName,
                                      FILE_DEVICE_DISK,
                                                          0,
                                                      FALSE,
                                              &MyControlDeviceObject);
        if (!NT_SUCCESS(NtStatus))
        {                                               
                KdPrint((DRIVERNAME " - IoCreateDevice failed - %X\n", NtStatus));
                return NtStatus;
        }
       
        NtStatus = ObOpenObjectByPointer(MyControlDeviceObject,
                0,
                NULL,
                FILE_ALL_ACCESS,
                NULL,KernelMode,
                &CtlDevHandle);
        if(!NT_SUCCESS(NtStatus))
        {
               
                return NtStatus;
        }
        ObDereferenceObject(MyControlDeviceObject);
        SecurityDescriptor = (PSECURITY_DESCRIPTOR)ExAllocatePool(NonPagedPool,sizeof(SECURITY_DESCRIPTOR));
        NtStatus = RtlCreateSecurityDescriptor(SecurityDescriptor,SECURITY_DESCRIPTOR_REVISION);
        if(!NT_SUCCESS(NtStatus))
        {
                KdPrint((DRIVERNAME " - Entering DriverEntry: DriverObject %8.8lX\n", DriverObject));
                return NtStatus;
        }
        NtStatus = NtSetSecurityObject(CtlDevHandle,DACL_SECURITY_INFORMATION,SecurityDescriptor);
        if(!NT_SUCCESS(NtStatus))
        {
                return NtStatus;
        }
        ZwClose(CtlDevHandle);

        // create symbol Link
         RtlInitUnicodeString(&SymLinkName, USBFILTER_DOSDEVICE_NAME);
        NtStatus = IoCreateSymbolicLink(&SymLinkName, &DeviceName);
        if (!NT_SUCCESS(NtStatus))
        {
                KdPrint((DRIVERNAME " - IoCreateSymbolicLink failed - %X\n", NtStatus));
                IoDeleteDevice(MyControlDeviceObject);
                return NtStatus;
        }
         。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。       
        return STATUS_SUCCESS;
}                                                        // DriverEntry


dll中的相关代码:

BOOL SendKeyUsernameToUsbfilter(char* Username,int len)
{
    BOOL  bStatus;
        DWORD dwRet;
        int   buflen = len;
        char  keyUsername[64] = {0};
        HANDLE hHTUSBFILTERDevice = INVALID_HANDLE_VALUE;//scott
       
        memcpy(keyUsername,Username,len);

        //add notification to USBFILTER
        hHTUSBFILTERDevice = CreateFile(HTUSBFILTER_NAME,
                                                                        GENERIC_READ | GENERIC_WRITE,
                                                                        FILE_SHARE_READ | FILE_SHARE_WRITE,
                                                                        NULL,
                                                                        OPEN_EXISTING,
                                                                        0,
                                                                        NULL);
       
        if(hHTIPSECDevice != INVALID_HANDLE_VALUE)
        {
                bStatus = DeviceIoControl(hHTUSBFILTERDevice,
                        IOCTL_USBFILTER_GET_USERNAME,
                        keyUsername,                                                
                        buflen,                             
                           NULL,                                                   
                           0,
                         &dwRet,                                                           
                           NULL);
                CloseHandle( hHTUSBFILTERDevice );
                if (!bStatus)
                {
                        MessageBox(NULL,"通知U盘过滤驱动失败-DeviceIoControl!","SendKeyUsernameToUsbfilter",0);
                }
                MessageBox(NULL,"通知U盘过滤驱动成功!","SendKeyUsernameToUsbfilter",0);
        }
        else
        {
//                 DWORD nErrorNo = GetLastError ( ); // 得到错误代码
//                 LPSTR lpBuffer;   
//                 FormatMessage ( FORMAT_MESSAGE_ALLOCATE_BUFFER |
//                         FORMAT_MESSAGE_IGNORE_INSERTS |
//                         FORMAT_MESSAGE_FROM_SYSTEM,
//                         NULL,
//                         nErrorNo, // 此乃错误代码,通常在程序中可由 GetLastError()得之
//                         LANG_NEUTRAL,
//                         (LPTSTR) & lpBuffer,
//                         0 ,
//                         NULL );
//                 MessageBox(NULL,lpBuffer,0,0);
//         LocalFree (lpBuffer);
                MessageBox(NULL,"打开U盘过滤驱动失败-CreateFile!","SendKeyUsernameToUsbfilter",0);
                return FALSE;
        }
       
        return TRUE;

}

最新回复

我用另一种方法搞定了 用文件过滤驱动传信息过来  详情 回复 发表于 2010-4-28 09:18
点赞 关注

回复
举报

63

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
楼主提供下 HTUSBFILTER_NAME 这个宏看看!
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你的代码运行在那个平台上啊?XP CE?
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

4
 
#define HTUSBFILTER_NAME "\\\\.\\HTUsbFilter"  

运行在XP平台下,

奇怪的是在dll里和文件过滤驱动通信时,CreateFile和DeviceIoControl是没有问题的
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

5
 
楼主有没有在 USB过滤驱动中处理 IRP_MJ_READ 呢? 必须在这个消息的派遣函数中返回 STATUS_SUCCESS,应用程序CreateFile才能正常 !
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

6
 
    没有处理IRP_MJ_READ ,因为我的程序严格来说是磁盘过滤驱动,挂在在磁盘驱动器的下面,主要用来拦截U盘的插入,里面的IRP大部分都是IRP_MJ_SCSI,没有IRP_MJ_READ 。

MFC程序是没有问题的,CreateFile和DeviceIoControl也是没有问题的。
在dll里和文件过滤驱动通信时,CreateFile和DeviceIoControl是没有问题的。

说实话,那个dll是一个Gina.dll,用来进行登录用的。

 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

7
 
是处理你控制设备的 IRP_MJ_READ,不是处理你 过滤设备的 IRP_MJ_READ!!! 这是两个概念!

DriverObject->MajorFunction[IRP_MJ_READ] = DispatchRead;

NTSTATUS DispatchRead(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
        PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(Irp);
        KEVENT waitEvent;
        NTSTATUS status;
        UNICODE_STRING tempName;

        //这里如果是我自己的设备,就放行
        if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject))
        {
                DbgPrint("对控制设备进行读取!\n");
                Irp->IoStatus.Status = STATUS_SUCCESS;
                Irp->IoStatus.Information = 0;
                IoCompleteRequest(Irp,IO_NO_INCREMENT);
                return Irp->IoStatus.Status;
        }
}
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

8
 
哦  谢谢楼上 我试试
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

9
 
to liuyu60305002:

我用windbg调试过了,磁盘驱动器的lowerFilters根本不会进入IRP_MJ_READ的派遣函数。

不过我有一个地方疏忽了,在IRP_MJ_SCSI的派遣函数里没有加入对自己设备的IRP的处理,我加上处理之后,gina.dll还是CreateFile失败。

 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

10
 
尤其让我郁闷的是 一个对话框程序CreateFile和DeviceIoControl也是没有问题的。

但是Gina.dll为什么会失败呢?
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

11
 
Gina.dll 被调用的时候系统还没有登录,你首先确保这个时候驱动程序已经被加载
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

12
 
这个驱动系统刚启动时就启动了,就是滚动条刚出现就加载了
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

13
 
我用另一种方法搞定了

用文件过滤驱动传信息过来
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

开源项目 更多>>
    随便看看
    查找数据手册?

    EEWorld Datasheet 技术支持

    相关文章 更多>>
    关闭
    站长推荐上一条 1/10 下一条

     
    EEWorld订阅号

     
    EEWorld服务号

     
    汽车开发圈

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表