6577|17

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

为什么ZwCreateFile总是返回STATUS_INVALID_PARAMETER? [复制链接]

各位大哥,求救…………

文件存在,只是想打开,可是ZwCreateFile总返回的是0xC000000D,即STATUS_INVALID_PARAMETER。请问是什么问题?

谢谢!!

源代码如下:

    HANDLE hFileHandle;
    NTSTATUS ntStatus;
    UNICODE_STRING uszFileName;
    OBJECT_ATTRIBUTES objAttributes;
    IO_STATUS_BLOCK isbCreateReadStatus;
    FILE_STANDARD_INFORMATION StandardFileInfo;
    ULONG ulFileLen;
    PVOID pFileImage;

    if(KeGetCurrentIrql() >= DISPATCH_LEVEL)
        return STATUS_UNSUCCESSFUL;

    RtlInitUnicodeString(&uszFileName,
                    pFilePath);

    InitializeObjectAttributes(&objAttributes,
                            &uszFileName,
                            OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,
                            NULL,
                            NULL);

    ntStatus = ZwCreateFile(&hFileHandle,
                            SYNCHRONIZE|FILE_READ_DATA,
                            &objAttributes,
                            &isbCreateReadStatus,
                            NULL,
                            0,
                            FILE_SHARE_READ|FILE_SHARE_WRITE,
                            FILE_OPEN,
                            FILE_SYNCHRONOUS_IO_NONALERT|FILE_NON_DIRECTORY_FILE,
                            NULL,
                            0);  // 总返回 STATUS_INVALID_PARAMETER
    if(!NT_SUCCESS(ntStatus))
    {
        KdPrint(("KmdReadWholeFile: Failed to open %ws. Error Code: 0x%xL\n", pFilePath, ntStatus));
        return ntStatus;
    }

最新回复

ZwCreateFile 只能在IRQL为PASSIVE_LEVEL调用,而且ZwReadFile,ZwWriteFileye也必须在相同的线程环境下,而PtReceive则运行在IRQL DISPATCH_LEVEL,因此会蓝屏。 解决办法是在DriverEntry 建立一系统工作者线程,在该线程里面 完成ZwXxxFile的调用 示例代码如下: 1建立一系统工作者线程status = PsCreateSystemThread( &ThreadHandle,THREAD_ALL_ACCESS ,0, 0,0, LogToFile,0);   详情 回复 发表于 2008-7-14 12:59
点赞 关注

回复
举报

68

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
pFilePath指向的内容是什么?
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
pFilePath指向一个字符串,是C盘的一个文件:\??\c:\windows\system32\pro.dat
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 
前面不要加\??\
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

5
 
搞错了,是要加的。看看你是不是这样写的:
L"\\??\\c:\\windows\\system32\\pro.dat"
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 
对的,就是这么写的:L"\\??\\c:\\windows\\system32\\pro.dat",如果前面不加"\\??\\"的话则报STATUS_OBJECT_PATH_SYNTAX_BAD错误。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

7
 
你再试试把OBJ_KERNEL_HANDLE去掉,这个标志我从未用过。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

8
 
另外建议把SYNCHRONIZE|FILE_READ_DATA改为GENERIC_READ。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

9
 
cnzdgs:谢谢你的热心帮助,你的两个建议我都试过了,还是不行,还是返回0xC000000D...
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

10
 
其它参数都没有问题了,莫非是有其它程序Hook了ZwCreateFile?
还有一点要注意一下,Zw开头的函数都必须在IRQL=PASSIVE_LEVEL级别才能调用。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

11
 
对,在这之前我做了这么一件事:HOOK_SYSCALL(ZwCreateSection, HookCreateSection, RealCreateSection);
这样对ZwCreateFile有联系吗?
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

12
 
不确定,通常应该没问题。你先把Hook注释掉试试。
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

13
 
把HOOK注释掉了……还是同样的情况……照样返回0xC000000D STATUS_INVALID_PARAMETER
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

14
 
你把这段代码放到DriverEntry里面看看是否正常。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

15
 
我试过了,就放在DriverEntry一开始,变量声明的后面,同样的反应。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

16
 
看来应该是被其它程序Hook了,ZwCreateFile的参数是没错的,下面是我的一个驱动程序中摘出的代码,与你的代码中调用ZwCreateFile的参数基本时相同的,没有问题。
WCHAR fileNamebuffer[0x100];
UNICODE_STRING fileName;
OBJECT_ATTRIBUTES objectAttributes;
IO_STATUS_BLOCK ioStatusBlock;

swprintf(fileNamebuffer, L"%s\\%d.log", RecordPath->Buffer, Number);
RtlInitUnicodeString(&fileName, fileNamebuffer);
InitializeObjectAttributes(&objectAttributes, &fileName, OBJ_CASE_INSENSITIVE, NULL, NULL);
ZwCreateFile(&process->RecordFile, GENERIC_ALL, &objectAttributes, &ioStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_VALID_FLAGS, FILE_OPEN, FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

17
 
知道原因了,sfilter 例子的安装文件sfilter.inf里设置的 start type 是1,即SERVICE_BOOT_START,DriverEntry()未运行完成前 IO MANAGER 不会工作,当DriverEntry()运行完后 IO MANAGER 才开始执行。所以解决办法就是在DriverEntry()中创建一个线程来执行ZwCreateFile(),线程被创建后,当DriverEntry()执行完,线程才开始执行,这时ZwCreateFile()才正常执行,返回STATUS_SUCCESS了。

不过还是要感谢各位帮助过我的人,谢谢~
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

18
 
ZwCreateFile 只能在IRQL为PASSIVE_LEVEL调用,而且ZwReadFile,ZwWriteFileye也必须在相同的线程环境下,而PtReceive则运行在IRQL DISPATCH_LEVEL,因此会蓝屏。
解决办法是在DriverEntry 建立一系统工作者线程,在该线程里面
完成ZwXxxFile的调用 示例代码如下:
1建立一系统工作者线程status = PsCreateSystemThread( &ThreadHandle,THREAD_ALL_ACCESS ,0,
0,0, LogToFile,0);
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表