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

原创 2006年05月18日 13:51:00

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

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 将文件指针移动到需要的位置。

LinuxGPIO驱动使用其实很简单

Author:DriverMonkey Mail:bookworepeng@Hotmail.com Phone:13410905075 QQ:196568501 本文资料主要来自互联网,并通...
  • peng654321
  • peng654321
  • 2014年02月28日 13:53
  • 6188

Uboot中driver驱动和linux内核驱动的区别

说明: 1.和下面论相关的帖子: http://www.crifan.com/records_in_the_uboot_201106_mmc_drive_the_process_of_po...
  • caoyicheng1
  • caoyicheng1
  • 2014年04月10日 17:26
  • 2829

Linux驱动开发之 七 (不知道目录结构,何谈Linux)

Linux驱动开发之 七 (Linux内核目录结构和五个子系统)老谢前面分享的文章,主要介绍了: 1. 基于操作系统的驱动开发是完全不同于无操作系统的驱动开发; 2. 介绍了Linux驱动开发必须...
  • itxiebo
  • itxiebo
  • 2016年05月15日 23:20
  • 1773

How to build parport related driver upon parport module in the kernel

The following is from  Documentation/parport-lowlevel.txt.At last,  a example is given.The example i...
  • ganggexiongqi
  • ganggexiongqi
  • 2011年07月02日 11:35
  • 751

How to mount partition with ntfs file system and read write access

原文地址:http://linuxconfig.org/How_to_mount_partition_with_ntfs_file_system_and_read_write_access 1. I...
  • xiaoqinpeng
  • xiaoqinpeng
  • 2011年12月07日 15:55
  • 1168

在64位系统下安装32位ODBC驱动问题How to install and configure a 32 bit ODBC driver on a 64 bit Operating System?

You have a 64 bit operating system, which usually comes with a more modern equipment, and specially ...
  • seven_dj
  • seven_dj
  • 2014年05月09日 14:09
  • 1308

How to Install Nvidia Kernel Module Cuda and Pyrit in Kali Linux

Install Nvidia Kernel Module Cuda and Pyrit in Kali Linux UPDATE: 13/03/2014 – Readers should fol...
  • cyuyan112233
  • cyuyan112233
  • 2015年03月17日 20:25
  • 927

How to load a camera module in kernel space

Loading sensor structure from kernel space, it is more familiar than loading from user space, first,...
  • xiaolifenghaha888
  • xiaolifenghaha888
  • 2014年09月25日 19:42
  • 948

How to access JIRA in your Python program

Access JIRA in your Python program
  • JZF2050
  • JZF2050
  • 2015年03月28日 11:32
  • 781

How to count the number of lines in a text file

  • 2006年02月23日 09:05
  • 685B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:核心驱动文件操作 How to access file in Kernel Driver
举报原因:
原因补充:

(最多只允许输入30个字)