获取或修改文件的属性:ZwSetInformationFile、ZwQueryInformationFile 两个函数的参数大体上相同,
当FileInformationClass设置参数为FileStandardInformation时,输入和输出的数据是FILE_STANDARD_INFORMATION 结构体,描述文件的基本信息。当FileInformationClass是FileBasicInformation时,输入和输出的数据是FILE_BASIC_INFORMATION结构体,描述文件的时间信息。
当FileInformationClass是FileNameInformation时,输入和输出的数据是FILE_NAME_INFORMATION结构体,描述文件名信息。
#include "ntddk.h"
#include "wdm.h"
NTSTATUS DriverEntry(IN PDRIVER_OBJECT theDriverObject,IN PUNICODE_STRING theRegistryPath)
{
NTSTATUS status=STATUS_SUCCESS;
OBJECT_ATTRIBUTES objectAttributes;
IO_STATUS_BLOCK iostatus;
NTSTATUS ntStatus;
FILE_STANDARD_INFORMATION fsi;
FILE_POSITION_INFORMATION fpi;
HANDLE hfile;
UNICODE_STRING logFileUnicodeString;
//初始化UNICODE_STRING字符串
RtlInitUnicodeString(&logFileUnicodeString,L"\\??\\C:\\1.log");//1.log是全名
//或者写成"\\Device\\HarddiskVolume1\\1.LOG"
//初始化objectAttributes
InitializeObjectAttributes(&objectAttributes,&logFileUnicodeString,OBJ_CASE_INSENSITIVE,NULL,NULL);
//打开文件
ntStatus=ZwCreateFile(&hfile,GENERIC_READ,&objectAttributes,&iostatus,NULL,FILE_ATTRIBUTE_NORMAL,0,FILE_OPEN,FILE_SYNCHRONOUS_IO_NONALERT,NULL,0);
if(NT_SUCCESS(ntStatus))
{
KdPrint(("Open file successfully!\n"));
}else
{
KdPrint(("Open file unsuccessfully!\n"));
}
//读取文件长度
ntStatus=ZwQueryInformationFile(hfile,&iostatus,&fsi,sizeof(FILE_STANDARD_INFORMATION),FileStandardInformation);
if(NT_SUCCESS(ntStatus))
{
KdPrint(("file length:%u\n",fsi.EndOfFile.QuadPart));
}
//修改当前文件指针
fpi.CurrentByteOffset.QuadPart=100i64;
ntStatus=ZwSetInformationFile(hfile,&iostatus,&fpi,sizeof(FILE_POSITION_INFORMATION),FilePositionInformation);
if(NT_SUCCESS(ntStatus))
{
KdPrint(("Update the file pointer successfully.\n"));
}
//关闭文件句柄
ZwClose(hfile);
return status;
}