如何从内核模式设备驱动程序打开文件以及如何读取或写入文件

如何从内核模式设备驱动程序打开文件以及如何读取或写入文件察看本文应用于的产品注意:这篇文章是由无人工介入的自动的机器翻译系统翻译完成。这些文章是微软为不懂英语的用户提供的,以使他们能够理解这些文章的内容。微软不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的使用所引起的任何直接的,或间接的可能的问题负责。: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)回到顶端

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

笔杆子文秘
机构认证
内容提供者

为您提供优质文档,供您参考!

确认删除?