为什么ZwCreateFile总是返回STATUS_INVALID_PARAMETER?

cxunjam 2008-06-09 12:27:52
各位大哥,求救…………

文件存在,只是想打开,可是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;
}
...全文
1153 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
minmin0876 2008-07-14
  • 打赏
  • 举报
回复
ZwCreateFile 只能在IRQL为PASSIVE_LEVEL调用,而且ZwReadFile,ZwWriteFileye也必须在相同的线程环境下,而PtReceive则运行在IRQL DISPATCH_LEVEL,因此会蓝屏。
解决办法是在DriverEntry 建立一系统工作者线程,在该线程里面
完成ZwXxxFile的调用 示例代码如下:
1建立一系统工作者线程status = PsCreateSystemThread( &ThreadHandle,THREAD_ALL_ACCESS ,0,
0,0, LogToFile,0);
cxunjam 2008-06-11
  • 打赏
  • 举报
回复
知道原因了,sfilter 例子的安装文件sfilter.inf里设置的 start type 是1,即SERVICE_BOOT_START,DriverEntry()未运行完成前 IO MANAGER 不会工作,当DriverEntry()运行完后 IO MANAGER 才开始执行。所以解决办法就是在DriverEntry()中创建一个线程来执行ZwCreateFile(),线程被创建后,当DriverEntry()执行完,线程才开始执行,这时ZwCreateFile()才正常执行,返回STATUS_SUCCESS了。

不过还是要感谢各位帮助过我的人,谢谢~
cnzdgs 2008-06-10
  • 打赏
  • 举报
回复
看来应该是被其它程序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);
cxunjam 2008-06-09
  • 打赏
  • 举报
回复
我试过了,就放在DriverEntry一开始,变量声明的后面,同样的反应。
cnzdgs 2008-06-09
  • 打赏
  • 举报
回复
你把这段代码放到DriverEntry里面看看是否正常。
cxunjam 2008-06-09
  • 打赏
  • 举报
回复
把HOOK注释掉了……还是同样的情况……照样返回0xC000000D STATUS_INVALID_PARAMETER
cnzdgs 2008-06-09
  • 打赏
  • 举报
回复
不确定,通常应该没问题。你先把Hook注释掉试试。
cxunjam 2008-06-09
  • 打赏
  • 举报
回复
对,在这之前我做了这么一件事:HOOK_SYSCALL(ZwCreateSection, HookCreateSection, RealCreateSection);
这样对ZwCreateFile有联系吗?
cnzdgs 2008-06-09
  • 打赏
  • 举报
回复
其它参数都没有问题了,莫非是有其它程序Hook了ZwCreateFile?
还有一点要注意一下,Zw开头的函数都必须在IRQL=PASSIVE_LEVEL级别才能调用。
cxunjam 2008-06-09
  • 打赏
  • 举报
回复
cnzdgs:谢谢你的热心帮助,你的两个建议我都试过了,还是不行,还是返回0xC000000D...
cnzdgs 2008-06-09
  • 打赏
  • 举报
回复
另外建议把SYNCHRONIZE|FILE_READ_DATA改为GENERIC_READ。
cnzdgs 2008-06-09
  • 打赏
  • 举报
回复
你再试试把OBJ_KERNEL_HANDLE去掉,这个标志我从未用过。
cxunjam 2008-06-09
  • 打赏
  • 举报
回复
对的,就是这么写的:L"\\??\\c:\\windows\\system32\\pro.dat",如果前面不加"\\??\\"的话则报STATUS_OBJECT_PATH_SYNTAX_BAD错误。
cnzdgs 2008-06-09
  • 打赏
  • 举报
回复
搞错了,是要加的。看看你是不是这样写的:
L"\\??\\c:\\windows\\system32\\pro.dat"
cnzdgs 2008-06-09
  • 打赏
  • 举报
回复
前面不要加\??\
cxunjam 2008-06-09
  • 打赏
  • 举报
回复
pFilePath指向一个字符串,是C盘的一个文件:\??\c:\windows\system32\pro.dat
cnzdgs 2008-06-09
  • 打赏
  • 举报
回复
pFilePath指向的内容是什么?

21,616

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧