阅读:2296回复:14
ZwCreateFile错误
我在驱动中调用ZwCreateFile,代码如下:
NTSTATUS CreateMapFile() { OBJECT_ATTRIBUTES ObjectAttributes; NTSTATUS status = STATUS_SUCCESS ; UNICODE_STRING FileName ; HANDLE hFile ; IO_STATUS_BLOCK IoStatus; LARGE_INTEGER Size ; Size.QuadPart = 16384i64 ; //16K RtlZeroMemory(&ObjectAttributes , sizeof(OBJECT_ATTRIBUTES) ) ; RtlInitUnicodeString( &ShareFileName, L\"\\\\??\\\\C:\\\\TestDat.dat\"); // Make appropriate ObjectAttributes for ZwCreateFile InitializeObjectAttributes( &ObjectAttributes, &FileName, OBJ_CASE_INSENSITIVE, NULL, NULL); DbgBreakPoint() ; //Set break point for debug status = ZwCreateFile( &hFile, FILE_WRITE_DATA|FILE_READ_DATA|GENERIC_READ | GENERIC_WRITE, &ObjectAttributes, &IoStatus, &Size , // alloc size = 16K FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0 ); if( !NT_SUCCESS(status) ) { DebugPrint((\"ZwCreateFile failed and status is 0X%x , %S.\\n\" , status , FileName.Buffer) ) ; return status; } ZwClose(hFile) ; return status ; } 1、如果系统启动后在调用该函数没有问题; 2、如果驱动程序是自动加栽的,并在AddDevice中调用该函数,则ZwCreateFile总是返回0xc000014f, 我通过SofIce查看在系统调用该函数时名为??的对象已经存在,C:等符号连接也存在,我也将 L\"\\\\??\\\\C:\\\\Tmp\\\\TestDat.dat\"改为L\"\\\\Device\\\\HarddiskVolume1\\\\TestDat.dat\", 可是还是同样结果,请各位大虾指点,谢谢。 |
|
|
沙发#
发布于:2002-06-12 14:02
// MessageId: STATUS_UNRECOGNIZED_VOLUME
// // MessageText: // // The volume does not contain a recognized file system. // Please make sure that all required file system drivers are loaded and that the volume is not corrupt. 或许加载你的驱动时相关初始化尚未完成,你改改启动顺序试试吧。 //sign |
|
板凳#
发布于:2002-06-12 14:31
I think so ,
but i have set the order to genport, and the same return value, When ZwCreateFile is called, i have seen some object existing, such as C:,D:,HarddiskVolume1,HarddiskVolume2,ntfs,cdf... etc. the order is ?i don,t know |
|
|
地板#
发布于:2002-06-12 15:29
各位
请指教,多谢啦 |
|
|
地下室#
发布于:2002-06-12 15:31
我可不想使用系一个统线程来专门做这事情呀
|
|
|
5楼#
发布于:2002-06-12 18:39
你必须在AddDevice里调用该函数吗?
|
|
|
6楼#
发布于:2002-06-12 20:50
做个猜测:你的C:盘是Fat32的吧?
事实上,只要文件在Ntfs分区上,让你的程序DependOnGroup=>File system(后者似乎一般都不需要),就可成功调用ZwCreateFile。 若你坚持放在C:上,就得等到Fat32的FSD启动后才能启动你的驱动。 |
|
7楼#
发布于:2002-06-13 11:50
多谢pjf兄,
我的C盘确实是FAT32分区,那么有什么办法得到操作系统目录呢? WIN32中很多办法,在Driver中呢 |
|
|
8楼#
发布于:2002-06-13 11:54
你必须在AddDevice里调用该函数吗? 不,但我在Win32程序启动前需要使用该空间,如果通过使用一个系统线程,那太夸张了,所以我不想使用这中办法(虽然我已经使用这中方式从了)。 不只老兄有何高见 |
|
|
9楼#
发布于:2002-06-13 15:14
query the registry:
HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion \"SystemRoot\"=\"I:\\\\WINNT\" //sign |
|
10楼#
发布于:2002-06-14 13:22
多谢pjf兄,可不知道驱动程序启动过程中是否可对该键进行查询
我试试先, |
|
|
11楼#
发布于:2005-02-06 11:42
1、如果系统启动后在调用该函数没有问题; AllenZh兄,我现在遇到了你曾经遇到的问题,能不能给点经验阿,最后怎么解决的? |
|
|
12楼#
发布于:2005-02-06 14:59
我们新人要好好学习学习!
|
|
13楼#
发布于:2005-02-17 15:49
他们都是高手.
|
|
驱动老牛
![]() |
14楼#
发布于:2005-02-17 17:47
我原来也遇到同样的问题,是UNICODE串的问题,用ANSI串设置完在转换成UNICODE就可以了,不知道为何。
|
|