关闭

核心驱动文件操作 How to access file in Kernel Driver

标签: fileaccessattributesintegernullbuffer
3480人阅读 评论(1) 收藏 举报
分类:

核心驱动的文件操作主要有以下一个函数

NTSTATUS 
  ZwCreateFile(
  OUT PHANDLE FileHandle,
  IN ACCESS_MASK DesiredAccess,
  IN POBJECT_ATTRIBUTES ObjectAttributes,
  OUT PIO_STATUS_BLOCK IoStatusBlock,
  IN PLARGE_INTEGER AllocationSize  OPTIONAL,
  IN ULONG FileAttributes,
  IN ULONG ShareAccess,
  IN ULONG CreateDisposition,
  IN ULONG CreateOptions,
  IN PVOID EaBuffer  OPTIONAL,
  IN ULONG EaLength
  );

NTSTATUS
  ZwQueryInformationFile(
  IN HANDLE  FileHandle,
  OUT PIO_STATUS_BLOCK  IoStatusBlock,
  OUT PVOID  FileInformation,
  IN ULONG  Length,
  IN FILE_INFORMATION_CLASS  FileInformationClass
  );

NTSTATUS
  ZwSetInformationFile(
  IN HANDLE  FileHandle,
  OUT PIO_STATUS_BLOCK  IoStatusBlock,
  IN PVOID  FileInformation,
  IN ULONG  Length,
  IN FILE_INFORMATION_CLASS  FileInformationClass
  );

NTSTATUS
  ZwWriteFile(
  IN HANDLE  FileHandle,
  IN HANDLE  Event  OPTIONAL,
  IN PIO_APC_ROUTINE  ApcRoutine  OPTIONAL,
  IN PVOID  ApcContext  OPTIONAL,
  OUT PIO_STATUS_BLOCK  IoStatusBlock,
  IN PVOID  Buffer,
  IN ULONG  Length,
  IN PLARGE_INTEGER  ByteOffset  OPTIONAL,
  IN PULONG  Key  OPTIONAL
  );

NTSTATUS
  ZwReadFile(
  IN HANDLE  FileHandle,
  IN HANDLE  Event  OPTIONAL,
  IN PIO_APC_ROUTINE  ApcRoutine  OPTIONAL,
  IN PVOID  ApcContext  OPTIONAL,
  OUT PIO_STATUS_BLOCK  IoStatusBlock,
  OUT PVOID  Buffer,
  IN ULONG  Length,
  IN PLARGE_INTEGER  ByteOffset  OPTIONAL,
  IN PULONG  Key  OPTIONAL
  );

打开/创建/读/写文件 的操作基本上和 SDK API 的使用差不多,但是文件指针的移动,属性的修改比 SDK API 稍复杂一些,主要使用 ZwQueryInformationFile 和 ZwSetInformationFile 这两个函数完成,下面举个例子大概说明一下这两个函数的使用。

 

         //Create the log file

         IO_STATUS_BLOCK file_status;

         OBJECT_ATTRIBUTES obj_attrib;

         CCHAR              ntNameFile[64] = "//DosDevices//c://temp.txt";

    STRING               ntNameString;

         UNICODE_STRING uFileName;

         FILE_STANDARD_INFORMATION fsi;

         FILE_POSITION_INFORMATION fpi;

 

         RtlInitAnsiString( &ntNameString, ntNameFile);

    RtlAnsiStringToUnicodeString(&uFileName, &ntNameString, TRUE );

         InitializeObjectAttributes(&obj_attrib, &uFileName, OBJ_CASE_INSENSITIVE, NULL, NULL);

         Status = ZwCreateFile(&pKeyboardDeviceExtension->hLogFile,GENERIC_WRITE,&obj_attrib,&file_status,

                                                                 NULL,FILE_ATTRIBUTE_NORMAL,FILE_SHARE_READ,FILE_OPEN_IF,FILE_SYNCHRONOUS_IO_NONALERT,NULL,0);

         RtlFreeUnicodeString(&uFileName);

 

         ZwQueryInformationFile(pKeyboardDeviceExtension->hLogFile, &file_status, &fsi, sizeof(FILE_STANDARD_INFORMATION), FileStandardInformation);

 

         fpi.CurrentByteOffset = fsi.EndOfFile;

 

         ZwSetInformationFile(pKeyboardDeviceExtension->hLogFile, &file_status, &fpi, sizeof(FILE_POSITION_INFORMATION), FilePositionInformation);

 

         if (Status != STATUS_SUCCESS)

         {

                   DbgPrint("Failed to create log file.../n");

                   DbgPrint("File Status = %x/n",file_status);

         }

         else

         {

                   DbgPrint("Successfully created log file.../n");

                   DbgPrint("File Handle = %x/n",pKeyboardDeviceExtension->hLogFile);

                   DbgPrint("Move to Eof %d/n", fsi.EndOfFile);

         }

 

 

 这段代码打开文件 C:/temp.txt 并将文件指针移动到文件末尾

在 SDK 编程中我们只需要

SetFilePointer(hAppend, 0, NULL, FILE_END);

就可以将文件指针移动到文件尾,但在 DDK 编程中我们需要使用 ZwQueryInformationFile 获得文件大小,然后使用 ZwSetInformationFile 将文件指针移动到需要的位置。

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:100917次
    • 积分:1338
    • 等级:
    • 排名:千里之外
    • 原创:26篇
    • 转载:13篇
    • 译文:0篇
    • 评论:18条
    文章分类
    最新评论