如何从内核模式设备驱动程序打开文件以及如何读取或写入文件察看本文应用于的产品注意:这篇文章是由无人工介入的自动的机器翻译系统翻译完成。这些文章是微软为不懂英语的用户提供的,以使他们能够理解这些文章的内容。微软不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的使用所引起的任何直接的,或间接的可能的问题负责。:891805最后修改:2006年6月7日修订:2.0本页INTRODUCTION更多信息通过对象名称引用到一个文件获取文件句柄读取或写入文件参考INTRODUCTION本文介绍如何从内核模式设备驱动程序打开磁盘文件以及如何读取或写入文件。回到顶端更多信息通过对象名称引用到一个文件内核模式设备驱动程序通过对象名称引用到一个文件。此名称是\DosDevices一起使用的文件完整路径。例如,C:\Windows\Example.txt文件的对象名称是\DosDevices\C:\Windows\Example.txt。然后对象名称由调用InitializeObjectAttributes函数封装到一个OBJECT_ATTRIBUTES结构。注意如果早期,加载设备驱动程序可能不存在\DosDevices命名空间。因为没有驱动器号暴露因此,\DosDevices命名空间是访问到设备驱动程序。只是文件系统,才能保证是\SystemRoot命名空间。\SystemRoot命名空间映射到操作系统安装文件夹。例如,C:\Windows或D:\Winnt可能该文件夹。以下代码示例阐释如何通过对象名称引用到一个文件。UNICODE_STRINGuniName;OBJECT_ATTRIBUTESobjAttr;RtlInitUnicodeString(uniName,L"\\DosDevices\\C:\\WINDOWS\\example.txt");//orL"\\SystemRoot\\example.txt"InitializeObjectAttributes(objAttr,uniName,OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,NULL,NULL);回到顶端获取文件句柄向ZwCreateFile函数以获得文件句柄,可传递OBJECT_ATTRIBUTES结构。根据您要做什么DesiredAccess参数被设置为GENERIC_READ、GENERIC_或GENERIC_ALL。如果将CreateOptions参数设置为FILE_SYNCHRONOUS_IO_NONALERT或FILE_SYNCHRONOUS_IO_ALERT,文件系统跟踪的当前文件位置偏移。因此,您可连续读取或写入文件后面。此外,您可以访问文件在随机位置。以下代码示例阐释如何获得文件句柄。HANDLEhandle;NTSTATUSntstatus;IO_STATUS_BLOCKioStatusBlock;//DonottrytoperformanyfileoperationsathigherIRQLlevels.//Instead,youmayuseaworkitemorasystemworkerthreadtoperformfileoperations.if(KeGetCurrentIrql()!=PASSIVE_LEVEL)returnSTATUS_INVALID_DEVICE_STATE;ntstatus=ZwCreateFile(handle,GENERIC_WRITE,objAttr,ioStatusBlock,NULL,FILE_ATTRIBUTE_NORMAL,0,FILE_OVERWRITE_IF,FILE_SYNCHRONOUS_IO_NONALERT,NULL,0);回到顶端读取或写入文件您现在可以调用ZwReadFile函数或ZwWriteFile函数。通过使用ZwClose函数完修改文件,关闭句柄。以下代码示例阐释如何写入文件。#defineBUFFER_SIZE30CHARbuffer[BUFFER_SIZE];size_tcb;if(NT_SUCCESS(ntstatus)){ntstatus=RtlStringCbPrintfA(buffer,sizeof(buffer),"Thisis%dtest\r\n",0x0);if(NT_SUCCESS(ntstatus)){ntstatus=RtlStringCbLengthA(buffer,sizeof(buffer),cb);if(NT_SUCCESS(ntstatus)){ntstatus=ZwWriteFile(handle,NULL,NULL,NULL,ioStatusBlock,buffer,cb,NULL,NULL);}}ZwClose(handle);}以下代码示例阐释如何从文件读取。LARGE_INTEGERbyteOffset;ntstatus=ZwCreateFile(handle,GENERIC_READ,objAttr,ioStatusBlock,NULL,FILE_ATTRIBUTE_NORMAL,0,FILE_OPEN,FILE_SYNCHRONOUS_IO_NONALERT,NULL,0);if(NT_SUCCESS(ntstatus)){byteOffset.LowPart=byteOffset.HighPart=0;ntstatus=ZwReadFile(handle,NULL,NULL,NULL,ioStatusBlock,buffer,BUFFER_SIZE,byteOffset,NULL);if(NT_SUCCESS(ntstatus)){buffer[BUFFER_SIZE-1]='\0';DbgPrint("%s\n",buffer);}ZwClose(handle);}回到顶端参考更多有关如何使用驱动程序,中文件请参阅Windows驱动程序开发工具包中驱动"文件范围A使用程序"节。有关Windows驱动程序开发工具包,请访问MicrosoftWeb站点:wwmicrosoft/whdc/devtools/ddk/default.mspx(wwmicrosoft/whdc/devtools/ddk/default.mspx)回到顶端