首页
社区
课程
招聘
[求助]ZwCreateFile打开驱动设备失败!!
发表于: 2013-3-16 16:51 11991

[求助]ZwCreateFile打开驱动设备失败!!

2013-3-16 16:51
11991
ZwCreateFile打开驱动设备失败 ,请问是什么原因?》

RtlInitUnicodeString( &fileNameUnicodeString, L"\\Driver\\i8042prt" );
InitializeObjectAttributes(&objectAttributes, &fileNameUnicodeString,
                OBJ_CASE_INSENSITIVE, NULL, NULL);
ntStatus = ZwCreateFile(
                 &ntFileHandle,
                 FILE_READ_ATTRIBUTES|SYNCHRONIZE,
                 &objectAttributes,
                 &ioStatus,
                 NULL,
                 FILE_ATTRIBUTE_NORMAL,
                 FILE_SHARE_READ|FILE_SHARE_WRITE,
                 FILE_OPEN,
                 FILE_NON_DIRECTORY_FILE| FILE_SYNCHRONOUS_IO_NONALERT,
                 NULL,0);

返回C0000024  ,是参数有问题吗?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
ioStatus里面的值是什么?

另外,建议你在初始化对象属性的时候指定OBJ_KERNEL_HANDLE标志。
2013-3-16 17:13
0
雪    币: 281
活跃值: (33)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
i8042prt  这个驱动没加载

把CreateDisposition参数 用FILE_OPEN_IF 试试
2013-3-16 17:31
0
雪    币: 158
活跃值: (349)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
用FILE_OPEN_IF  也不行

ioStatus 没有付值的
2013-3-16 18:38
0
雪    币: 281
活跃值: (33)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
1.确定i8042prt是否加载了
2.确定i8042prt是否处理了irp_mj_create
2013-3-16 18:47
0
雪    币: 158
活跃值: (349)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
.确定i8042prt 加载了 用其他工具能看见
用ObReferenceObjectByName  都能获取设备指针
2013-3-16 19:06
0
雪    币: 862
活跃值: (329)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
7
返回值是   STATUS_OBJECT_TYPE_MISMATCH   楼主再检查一下
2013-3-16 19:07
0
雪    币: 158
活跃值: (349)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
对 返回是这个 STATUS_OBJECT_TYPE_MISMATCH            C0000024
2013-3-16 20:01
0
雪    币: 496
活跃值: (291)
能力值: ( LV13,RANK:400 )
在线值:
发帖
回帖
粉丝
9
........
........
........
........
CreateFile是打开设备,不是驱动。
i8042prt是PS/2驱动,没有对应的设备。
2013-3-16 21:10
0
雪    币: 158
活跃值: (349)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
设备有的  因为用用其他工具能看到的,
用CreateFile 这个函数 而不用ZwCreateFile  是吗?
2013-3-16 22:02
0
雪    币: 496
活跃值: (291)
能力值: ( LV13,RANK:400 )
在线值:
发帖
回帖
粉丝
11
CreateFile最终会调用Ntdll!ZwCreateFile

跟你说了,i8042ptr这个驱动没有对应的设备对象,只不过在其设备栈上附加的有键盘或者鼠标驱动。
2013-3-16 22:08
0
雪    币: 158
活跃值: (349)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
那怎么得到 对象指针呢。
这样不能得到对象指针。

NTSTATUS Getkeyi8042prt()
{
        NTSTATUS            ntStatus;
        UNICODE_STRING      fileNameUnicodeString;
        OBJECT_ATTRIBUTES   objectAttributes;
        HANDLE              ntFileHandle;  
        IO_STATUS_BLOCK     ioStatus;
        PFILE_OBJECT        fileObject;
        PDEVICE_OBJECT      fileSysDevice;
         HANDLE hSymbolic;
  
  
        RtlInitUnicodeString( &fileNameUnicodeString,L"\\??\\C:\\windows\\System32\\Drivers\\i8042prt.sys");
        //  RtlInitUnicodeString( &fileNameUnicodeString, L"\\Driver\\i8042prt" );

         

        InitializeObjectAttributes(&objectAttributes, &fileNameUnicodeString,
                OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE, NULL, NULL);

           ntStatus = ZwCreateFile(
                   &ntFileHandle,
                   FILE_READ_ATTRIBUTES|SYNCHRONIZE,
                   &objectAttributes,
                   &ioStatus,
                   NULL,
                   FILE_ATTRIBUTE_NORMAL,
                   FILE_SHARE_READ|FILE_SHARE_WRITE,
                   FILE_OPEN_IF,
                   FILE_NON_DIRECTORY_FILE| FILE_SYNCHRONOUS_IO_NONALERT,
                   NULL,0);

  

         if( !NT_SUCCESS( ntStatus )) {

                 return STATUS_UNSUCCESSFUL;

         }

        ntStatus = ObReferenceObjectByHandle( ntFileHandle, FILE_READ_DATA,
                NULL, KernelMode, &fileObject, NULL );

        if( !NT_SUCCESS( ntStatus )) {

                 ObDereferenceObject( fileObject );
                return STATUS_UNSUCCESSFUL;
                 
        }

         
        fileSysDevice=IoGetBaseFileSystemDeviceObject( fileObject );
  
        //这里不能得到对象指针
        ObDereferenceObject( fileObject );

return ntStatus;
}

应该怎么才能 得到对象指针
2013-3-16 22:15
0
雪    币: 496
活跃值: (291)
能力值: ( LV13,RANK:400 )
在线值:
发帖
回帖
粉丝
13
\\Driver\\i8042prt

NTSTATUS ObReferenceObjectByName(
       PUNICODE_STRING ObjectName,
       ULONG Attributes,
       PACCESS_STATE AccessState,
       ACCESS_MASK DesiredAccess,
       POBJECT_TYPE ObjectType,
       KPROCESSOR_MODE AccessMode,
       PVOID ParseContext,
       PVOID *Object
       );
2013-3-16 22:56
0
雪    币: 158
活跃值: (349)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
ObReferenceObjectByName 这个函数用过 ,有的机器 不行 不知道是什么 原因。
2013-3-16 23:24
0
雪    币: 158
活跃值: (349)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
http://bbs.pediy.com/showthread.php?p=1079664

这个和遇到的情况一样
2013-3-16 23:29
0
雪    币: 496
活跃值: (291)
能力值: ( LV13,RANK:400 )
在线值:
发帖
回帖
粉丝
16
因为这个函数是为公开函数,在早起的nt内核版本中可能还没有这个函数,所以需要考虑兼容性,
如果你对兼容性要求较高的话那就换个办法吧。

先去挂到KbdClass0设备上,然后再在设备栈中搜索驱动对象,理论上应该改能找到下层的i8042prt驱动对象。
2013-3-17 09:09
0
游客
登录 | 注册 方可回帖
返回
//