阅读:3046回复:10
ZwOpenFile( )该如何使用?
在DriverEntry( )中按照如下的方法使用,总是返回失败。该文件是存在的。
RtlInitUnicodeString(&FileName, L\"\\\\??\\\\c:\\\\program files\\\\readme.txt\"); InitializeObjectAttributes(&ObjAttributes, &FileName, 0, NULL, NULL); if (NT_SUCCESS(ZwOpenFile(&hFile, GENERIC_READ, &ObjAttributes, &StatusBlock, FILE_SHARE_READ, FILE_NON_DIRECTORY_FILE))) { //do sth } [编辑 - 4/9/02 作者: Netguy] |
|
沙发#
发布于:2002-04-09 23:41
这个我就不清楚了,可能那时侯系统还不能认识长文件名吧!(这是我的估计)
当时我试过在系统起来的时候读注册表的当前用户的那棵树的一些变量就读不出来,而在系统起来之后再读就可以读出来! |
|
板凳#
发布于:2002-04-09 23:42
这个我就不清楚了,可能那时侯系统还不能认识长文件名吧!(这是我的估计)
当时我试过在系统起来的时候读注册表的当前用户的那棵树的一些变量就读不出来,而在系统起来之后再读就可以读出来! 你先试一下在系统完全起来之后用这部分代码来读,看看能不能读出来吧!如果可以,那么很高兴我的估计就是对的了 |
|
地板#
发布于:2002-04-10 08:31
会不会文件系统驱动还没有启动?
|
|
地下室#
发布于:2002-04-10 08:34
现在应该用ZwCreateFile,98下应该用\"\\\\DosDevice\\\\c:\\\\program files\\\\readme.txt\",还有只能在PASSIVE_LEVEL调用 。
具体代码如: NTSTATUS ntStatus; OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING UniFileName; PCWSTR FileName = L\"\\\\DosDevice\\\\c:\\\\program files\\\\readme.txt\" RtlInitUnicodeString(&UniFileName , FileName); InitializeObjectAttributes(&ObjectAttributes,&UniFileName, OBJ_CASE_INSENSITIVE,NULL,NULL); ntStatus=ZwCreateFile(FileHandle, GENERIC_WRITE|SYNCHRONIZE|GENERIC_READ, &ObjectAttributes, &IoStatusBlock, 0, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_DELETE, FILE_OPEN_IF, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); |
|
|
5楼#
发布于:2002-04-10 08:36
sorry,少了一个S : \"\\\\DosDevices\\\\c:\\\\program files\\\\readme.txt\"
|
|
|
6楼#
发布于:2002-04-10 09:33
sorry,少了一个S : \"\\\\DosDevices\\\\c:\\\\program files\\\\readme.txt\" 请教一下,为什么要用\"\\\\DosDevices\\\\\"这个东西, 而且我还看过有什么“\\\\BaseNamedObjects\\\\”的,我 看过很多资料好象也没有介绍这些是干吗的?高手知道 的就说说吧... |
|
|
7楼#
发布于:2002-04-10 10:54
是在登录Win2K之后执行那段代码的,文件系统已经启动了。我再用ZwCreateFile试试。谢谢!
|
|
8楼#
发布于:2002-04-10 11:07
会不会是系统优先级的问题? 可能不会,那样的话会蓝屏的.但driverentry的优先级很可能高过passive-level,建议确认一下调用时的优先级,如果高了可以将调用排队处理.
|
|
|
9楼#
发布于:2002-04-10 12:30
[quote]sorry,少了一个S : \"\\\\DosDevices\\\\c:\\\\program files\\\\readme.txt\" 请教一下,为什么要用\"\\\\DosDevices\\\\\"这个东西, 而且我还看过有什么“\\\\BaseNamedObjects\\\\”的,我 看过很多资料好象也没有介绍这些是干吗的?高手知道 的就说说吧... [/quote] 这是ZwCreateFile中的一段: PUNICODE_STRING ObjectName Points to a buffered Unicode string naming the file to be created or opened. This value must be a fully qualified file specification or the name of a device object, unless it is the name of a file relative to the directory specified by RootDirectory. For example, \\Device\\Floppy1\\myfile.dat or \\??\\B:\\myfile.dat could be the fully qualified file specification, provided that the floppy driver and overlying file system are already loaded. (Note: \\?? replaces \\DosDevices as the name of the Win32 object namespace. \\DosDevices will still work, but \\?? is translated faster by the object manager.) |
|
|
10楼#
发布于:2002-04-14 17:54
在2K,XP下C:,D:等是有MOUNT MANAGER管理的. 如果VOL MANAGER没有起来, 你就无法访问C:,D:等盘符. 如果你的DRIVER是BOOT DRIVER.那就需要向SOFTICE学习. 人家预先将C:到HADRDISKVOLUMEX的LINK获取. 然后直接用那个HADRDISKVOLUMEX就可.
|
|
|