6762|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
 
闂傚倸鍊风粈渚€骞栭銈嗗仏妞ゆ劧绠戠壕鍧楁煕閹邦垼鍤嬮柤鏉挎健閺屾稑鈽夊▎鎰▏闁诲孩鑹鹃ˇ浼村Φ閸曨垰绠抽柛鈩冦仦婢规洜绱撻崒娆戝妽妞ゃ劌妫濋弫鍐閻樺灚娈惧┑掳鍊曢幊搴㈠劔闂備礁鐤囧銊х矆娴h鍙忛柕鍫濐槹閻撶喖鏌e鈧禍璺侯瀶閻戣姤鐓曢柡鍌濇硶缁犵粯銇勯姀锛勬噰妤犵偛顑夐弫鍌炴嚍閵夛妇褰ㄩ梺璇查閸樻粓宕戦幘缁樼厱闁归偊鍘奸崝銈嗙箾閸剚瀚�闂傚倸鍊峰ù鍥儍椤愶箑骞㈤柍杞扮劍椤斿嫮绱撻崒姘偓鍝ョ矙閸曨垰绠柨鐕傛嫹闂傚倸鍊烽懗鍫曞箠閹剧粯鍋ら柕濞炬櫆閸嬪鏌i幇顒佹儓闁绘帒鐏氶妵鍕箳閹搭垱鏁鹃柣搴㈢啲閹凤拷婵犵數濮烽弫鎼佸磻濞戔懞鍥敇閵忕姷顦悗鍏夊亾闁告洦鍋夐崺鐐烘⒑鐠恒劌娅愰柟鍑ゆ嫹
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

8
 
闂傚倸鍊风粈渚€骞栭銈嗗仏妞ゆ劧绠戠壕鍧楁煕閹邦垼鍤嬮柤鏉挎健閺屾稑鈽夊▎鎰▏闁诲孩鑹鹃ˇ浼村Φ閸曨垰绠抽柛鈩冦仦婢规洜绱撻崒娆戝妽妞ゃ劌妫濋弫鍐閻樺灚娈惧┑掳鍊曢幊搴㈠劔闂備礁鐤囧銊х矆娴h鍙忛柕鍫濐槹閻撶喖鏌e鈧禍璺侯瀶閻戣姤鐓曢柡鍌濇硶缁犵粯銇勯姀锛勬噰妤犵偛顑夐弫鍌炴嚍閵夛妇褰ㄩ梺璇查閸樻粓宕戦幘缁樼厱闁归偊鍘奸崝銈嗙箾閸剚瀚�闂傚倸鍊峰ù鍥儍椤愶箑骞㈤柍杞扮劍椤斿嫮绱撻崒姘偓鍝ョ矙閸曨垰绠柨鐕傛嫹闂傚倸鍊烽懗鍫曞箠閹剧粯鍋ら柕濞炬櫆閸嬪鏌i幇顒佹儓闁绘帒鐏氶妵鍕箳閹搭垱鏁鹃柣搴㈢啲閹凤拷婵犵數濮烽弫鎼佸磻濞戔懞鍥敇閵忕姷顦悗鍏夊亾闁告洦鍋夐崺鐐烘⒑鐠恒劌娅愰柟鍑ゆ嫹
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

9
 
闂傚倸鍊风粈渚€骞栭銈嗗仏妞ゆ劧绠戠壕鍧楁煕閹邦垼鍤嬮柤鏉挎健閺屾稑鈽夊▎鎰▏闁诲孩鑹鹃ˇ浼村Φ閸曨垰绠抽柛鈩冦仦婢规洜绱撻崒娆戝妽妞ゃ劌妫濋弫鍐閻樺灚娈惧┑掳鍊曢幊搴㈠劔闂備礁鐤囧銊х矆娴h鍙忛柕鍫濐槹閻撶喖鏌e鈧禍璺侯瀶閻戣姤鐓曢柡鍌濇硶缁犵粯銇勯姀锛勬噰妤犵偛顑夐弫鍌炴嚍閵夛妇褰ㄩ梺璇查閸樻粓宕戦幘缁樼厱闁归偊鍘奸崝銈嗙箾閸剚瀚�闂傚倸鍊峰ù鍥儍椤愶箑骞㈤柍杞扮劍椤斿嫮绱撻崒姘偓鍝ョ矙閸曨垰绠柨鐕傛嫹闂傚倸鍊烽懗鍫曞箠閹剧粯鍋ら柕濞炬櫆閸嬪鏌i幇顒佹儓闁绘帒鐏氶妵鍕箳閹搭垱鏁鹃柣搴㈢啲閹凤拷婵犵數濮烽弫鎼佸磻濞戔懞鍥敇閵忕姷顦悗鍏夊亾闁告洦鍋夐崺鐐烘⒑鐠恒劌娅愰柟鍑ゆ嫹
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

10
 
闂傚倸鍊风粈渚€骞栭銈嗗仏妞ゆ劧绠戠壕鍧楁煕閹邦垼鍤嬮柤鏉挎健閺屾稑鈽夊▎鎰▏闁诲孩鑹鹃ˇ浼村Φ閸曨垰绠抽柛鈩冦仦婢规洜绱撻崒娆戝妽妞ゃ劌妫濋弫鍐閻樺灚娈惧┑掳鍊曢幊搴㈠劔闂備礁鐤囧銊х矆娴h鍙忛柕鍫濐槹閻撶喖鏌e鈧禍璺侯瀶閻戣姤鐓曢柡鍌濇硶缁犵粯銇勯姀锛勬噰妤犵偛顑夐弫鍌炴嚍閵夛妇褰ㄩ梺璇查閸樻粓宕戦幘缁樼厱闁归偊鍘奸崝銈嗙箾閸剚瀚�闂傚倸鍊峰ù鍥儍椤愶箑骞㈤柍杞扮劍椤斿嫮绱撻崒姘偓鍝ョ矙閸曨垰绠柨鐕傛嫹闂傚倸鍊烽懗鍫曞箠閹剧粯鍋ら柕濞炬櫆閸嬪鏌i幇顒佹儓闁绘帒鐏氶妵鍕箳閹搭垱鏁鹃柣搴㈢啲閹凤拷婵犵數濮烽弫鎼佸磻濞戔懞鍥敇閵忕姷顦悗鍏夊亾闁告洦鍋夐崺鐐烘⒑鐠恒劌娅愰柟鍑ゆ嫹
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

11
 
闂傚倸鍊风粈渚€骞栭銈嗗仏妞ゆ劧绠戠壕鍧楁煕閹邦垼鍤嬮柤鏉挎健閺屾稑鈽夊▎鎰▏闁诲孩鑹鹃ˇ浼村Φ閸曨垰绠抽柛鈩冦仦婢规洜绱撻崒娆戝妽妞ゃ劌妫濋弫鍐閻樺灚娈惧┑掳鍊曢幊搴㈠劔闂備礁鐤囧銊х矆娴h鍙忛柕鍫濐槹閻撶喖鏌e鈧禍璺侯瀶閻戣姤鐓曢柡鍌濇硶缁犵粯銇勯姀锛勬噰妤犵偛顑夐弫鍌炴嚍閵夛妇褰ㄩ梺璇查閸樻粓宕戦幘缁樼厱闁归偊鍘奸崝銈嗙箾閸剚瀚�闂傚倸鍊峰ù鍥儍椤愶箑骞㈤柍杞扮劍椤斿嫮绱撻崒姘偓鍝ョ矙閸曨垰绠柨鐕傛嫹闂傚倸鍊烽懗鍫曞箠閹剧粯鍋ら柕濞炬櫆閸嬪鏌i幇顒佹儓闁绘帒鐏氶妵鍕箳閹搭垱鏁鹃柣搴㈢啲閹凤拷婵犵數濮烽弫鎼佸磻濞戔懞鍥敇閵忕姷顦悗鍏夊亾闁告洦鍋夐崺鐐烘⒑鐠恒劌娅愰柟鍑ゆ嫹
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

12
 
闂傚倸鍊风粈渚€骞栭銈嗗仏妞ゆ劧绠戠壕鍧楁煕閹邦垼鍤嬮柤鏉挎健閺屾稑鈽夊▎鎰▏闁诲孩鑹鹃ˇ浼村Φ閸曨垰绠抽柛鈩冦仦婢规洜绱撻崒娆戝妽妞ゃ劌妫濋弫鍐閻樺灚娈惧┑掳鍊曢幊搴㈠劔闂備礁鐤囧銊х矆娴h鍙忛柕鍫濐槹閻撶喖鏌e鈧禍璺侯瀶閻戣姤鐓曢柡鍌濇硶缁犵粯銇勯姀锛勬噰妤犵偛顑夐弫鍌炴嚍閵夛妇褰ㄩ梺璇查閸樻粓宕戦幘缁樼厱闁归偊鍘奸崝銈嗙箾閸剚瀚�闂傚倸鍊峰ù鍥儍椤愶箑骞㈤柍杞扮劍椤斿嫮绱撻崒姘偓鍝ョ矙閸曨垰绠柨鐕傛嫹闂傚倸鍊烽懗鍫曞箠閹剧粯鍋ら柕濞炬櫆閸嬪鏌i幇顒佹儓闁绘帒鐏氶妵鍕箳閹搭垱鏁鹃柣搴㈢啲閹凤拷婵犵數濮烽弫鎼佸磻濞戔懞鍥敇閵忕姷顦悗鍏夊亾闁告洦鍋夐崺鐐烘⒑鐠恒劌娅愰柟鍑ゆ嫹
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

13
 
闂傚倸鍊风粈渚€骞栭銈嗗仏妞ゆ劧绠戠壕鍧楁煕閹邦垼鍤嬮柤鏉挎健閺屾稑鈽夊▎鎰▏闁诲孩鑹鹃ˇ浼村Φ閸曨垰绠抽柛鈩冦仦婢规洜绱撻崒娆戝妽妞ゃ劌妫濋弫鍐閻樺灚娈惧┑掳鍊曢幊搴㈠劔闂備礁鐤囧銊х矆娴h鍙忛柕鍫濐槹閻撶喖鏌e鈧禍璺侯瀶閻戣姤鐓曢柡鍌濇硶缁犵粯銇勯姀锛勬噰妤犵偛顑夐弫鍌炴嚍閵夛妇褰ㄩ梺璇查閸樻粓宕戦幘缁樼厱闁归偊鍘奸崝銈嗙箾閸剚瀚�闂傚倸鍊峰ù鍥儍椤愶箑骞㈤柍杞扮劍椤斿嫮绱撻崒姘偓鍝ョ矙閸曨垰绠柨鐕傛嫹闂傚倸鍊烽懗鍫曞箠閹剧粯鍋ら柕濞炬櫆閸嬪鏌i幇顒佹儓闁绘帒鐏氶妵鍕箳閹搭垱鏁鹃柣搴㈢啲閹凤拷婵犵數濮烽弫鎼佸磻濞戔懞鍥敇閵忕姷顦悗鍏夊亾闁告洦鍋夐崺鐐烘⒑鐠恒劌娅愰柟鍑ゆ嫹
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
Microchip 直播|利用motorBench开发套件高效开发电机磁场定向控制方案 报名中!
直播主题:利用motorBench开发套件高效开发电机磁场定向控制方案
直播时间:2025年3月25日(星期二)上午10:30-11:30
快来报名!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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