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

<script type="text/javascript"> </script>

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值