#include <ntddk.h>
//创建文件
NTSTATUS CreateFileText(void);
//打开文件
NTSTATUS OpenFileText(void);
NTSTATUS OpenFileTest2(void);
//写入文件
NTSTATUS WriteFileText(void);
//读取文件
NTSTATUS ReadFileText(void);
//文件属性
NTSTATUS FileAttributeText(void);
void Unload(IN PDRIVER_OBJECT DriverObject);
#ifdef __cplusplus
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
#endif
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
unsigned i;
DbgPrint("Hello from 1!\n");
DriverObject->DriverUnload =Unload;
DbgBreakPoint();
//创建文件
CreateFileText();
//打开文件
OpenFileText();
OpenFileTest2();
//写入文件
WriteFileText();
//读取文件
ReadFileText();
//文件属性
FileAttributeText();
return STATUS_SUCCESS;
}
void Unload(IN PDRIVER_OBJECT DriverObject)
{
DbgPrint("Goodbye from 1!\n");
}
//创建文件
NTSTATUS CreateFileText(void)
{
UNICODE_STRING SymbolFileName={0};
OBJECT_ATTRIBUTES objectAttributes={0};
HANDLE hfile=NULL;
IO_STATUS_BLOCK iostatus={0};
RtlInitUnicodeString(&SymbolFileName,L"\\Device\\HarddiskVolume1\\1.txt");
InitializeObjectAttributes(
&objectAttributes, //指定一个需要OBJECT_ATTRIBUTES结构地址
&SymbolFileName,//是一个UNICODE_STRING字串地址,指定需要操作对象名(在这里可以是符号链接名,或者设备名)
OBJ_CASE_INSENSITIVE, //指定此值表示 不区分大小写。
NULL,
NULL );
//创建文件
NTSTATUS ntStatus = ZwCreateFile(
&hfile,
//PHANDLE类型指针 用于返回打开文件的句柄
GENERIC_WRITE,
//ACCESS_MASK类型 此值用于描述打开文件操作(读,写,或者其它)
&objectAttributes,
//此值是OBJECT_ATTRIBUTES结构的地址,该结构包含要打开的文件名 需要用InitializeObjectAttributes进行初始化
&iostatus,
//指向一个IO_STATUS_BLOCK结构,返回值之一 用于存放ZwCreateFile操作的结果状态
NULL,
//PLARGE_INTEGER 类型(64位整数指针)该数指定文件初始分配时的大小。该参数如果为NULL,那么文件长度将从0开始,随着写入而增长
FILE_ATTRIBUTE_NORMAL,
//此参数在驱动下指定为0或者FILE_ATTRIBUTE_NORMAL,如果文件不是被创建和覆盖写入 则此参数将被忽略
FILE_SHARE_READ,
//指定共享模式 有共享读FILE_SHARE_READ,写FILE_SHARE_WRITE,删除FILE_SHARE_DELETE这几中模式
FILE_OPEN_IF,
//此值表示 文件存在则打开 不存在则创建一个新的文件
FILE_SYNCHRONOUS_IO_NONALERT,
//指定文件创建或者打开的附加标志 FILE_SYNCHRONOUS_IO_NONALERT表示在文件中的所有操作均同步,并没有警报
NULL,
//对于设备和中间驱动程序,此参数必须是NULL
0 );
if ( NT_SUCCESS(ntStatus))
{
KdPrint(("创建文件成功!\n"));
}else
{
KdPrint(("创建文件失败!\n"));
}
//文件操作
//.......
//关闭文件句柄
ZwClose(hfile);
return true;
}
//打开文件
NTSTATUS OpenFileText(void)
{
UNICODE_STRING SymbolFileName;
OBJECT_ATTRIBUTES objectAttributes;
HANDLE hfile=NULL;
IO_STATUS_BLOCK iostatus;
RtlInitUnicodeString(&SymbolFileName,L"\\Device\\HarddiskVolume1\\1.txt");
InitializeObjectAttributes(
&objectAttributes, //指定一个需要OBJECT_ATTRIBUTES结构地址
&SymbolFileName,//是一个UNICODE_STRING字串地址,指定需要操作对象名(在这里可以是符号链接名,或者设备名)
OBJ_CASE_INSENSITIVE, //指定此值表示 不区分大小写。
NULL,
NULL );
NTSTATUS ntStatus = ZwCreateFile(
&hfile,
//PHANDLE类型指针 用于返回打开文件的句柄
GENERIC_WRITE,
//ACCESS_MASK类型 此值用于描述打开文件操作(读,写,或者其它)
&objectAttributes,
//此值是OBJECT_ATTRIBUTES结构的地址,该结构包含要打开的文件名 需要用InitializeObjectAttributes进行初始化
&iostatus,
//指向一个IO_STATUS_BLOCK结构,返回值之一 用于存放ZwCreateFile操作的结果状态
NULL,
//PLARGE_INTEGER 类型(64位整数指针)该数指定文件初始分配时的大小。该参数如果为NULL,那么文件长度将从0开始,随着写入而增长
FILE_ATTRIBUTE_NORMAL,
//此参数在驱动下指定为0或者FILE_ATTRIBUTE_NORMAL,如果文件不是被创建和覆盖写入 则此参数将被忽略
FILE_SHARE_READ,
//指定共享模式 有共享读FILE_SHARE_READ,写FILE_SHARE_WRITE,删除FILE_SHARE_DELETE这几中模式
FILE_OPEN,
//此值表示 文件存在则打开 不存在则创建一个新的文件
FILE_SYNCHRONOUS_IO_NONALERT,
//指定文件创建或者打开的附加标志 FILE_SYNCHRONOUS_IO_NONALERT表示在文件中的所有操作均同步,并没有警报
NULL,
//对于设备和中间驱动程序,此参数必须是NULL
0 );
//对于设备和中间驱动程序,此参数必须是0
if ( NT_SUCCESS(ntStatus))
{
KdPrint(("打开文件成功!hfile=%x\n",hfile));
}else
{
KdPrint(("打开文件失败!hfile=%x\n",hfile));
}
//文件操作
//.......
//关闭文件句柄
ZwClose(hfile);
return true;
}
NTSTATUS OpenFileTest2(void)
{
OBJECT_ATTRIBUTES objectAttributes;
IO_STATUS_BLOCK iostatus;
HANDLE hfile;
UNICODE_STRING SymbolFileName;
//初始化UNICODE_STRING字符串
RtlInitUnicodeString( &SymbolFileName, L"\\Device\\HarddiskVolume1\\1.txt");
//RtlInitUnicodeString( &SymbolFileName, L"\\??\\C:\\1.txt");
//初始化objectAttributes
InitializeObjectAttributes(&objectAttributes,
&SymbolFileName,
OBJ_CASE_INSENSITIVE,
NULL,
NULL );
//打开文件
NTSTATUS ntStatus = ZwOpenFile(
&hfile,
GENERIC_ALL,
&objectAttributes,
&iostatus,
FILE_SHARE_READ|FILE_SHARE_WRITE,
FILE_SYNCHRONOUS_IO_NONALERT);
//对于设备和中间驱动程序,此参数必须是0
if ( NT_SUCCESS(ntStatus))
{
KdPrint(("打开文件成功!hfile=%x\n",hfile));
}else
{
KdPrint(("打开文件失败!hfile=%x\n",hfile));
}
//文件操作
//.......
//关闭文件句柄
ZwClose(hfile);
return true;
}
//写入文件
NTSTATUS WriteFileText(void)
{
OBJECT_ATTRIBUTES objectAttributes={0};
IO_STATUS_BLOCK iostatus={0};
HANDLE hfile=NULL;
UNICODE_STRING SymbolFileName={0};
//初始化UNICODE_STRING字符串
RtlInitUnicodeString( &SymbolFileName, L"\\Device\\HarddiskVolume1\\1.txt");
//RtlInitUnicodeString( &SymbolFileName, L"\\??\\C:\\1.txt");
//初始化objectAttributes
InitializeObjectAttributes(&objectAttributes,
&SymbolFileName,
OBJ_CASE_INSENSITIVE,//对大小写敏感
NULL,
NULL );
//创建文件
NTSTATUS ntStatus = ZwCreateFile( &hfile,
GENERIC_WRITE,
&objectAttributes,
&iostatus,
NULL,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_WRITE,
FILE_OPEN_IF,//即使存在该文件,也创建
FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0 );
#define BUFFER_SIZE 30
PCHAR pBuffer = (PCHAR)ExAllocatePool(PagedPool,BUFFER_SIZE);
//构造要填充的数据
RtlFillMemory(pBuffer,BUFFER_SIZE,'s');//www.yjxsoft.comssssssssssssxxxxxx
//strcpy(pBuffer,"www.yjxsoft.com");
RtlCopyMemory(pBuffer,L"我是你的大皇冠",sizeof(L"我是你的大皇冠"));
KdPrint(("即将写入 %d 字节\n",BUFFER_SIZE));
//写文件ZwQueryInfomationfile
LARGE_INTEGER sl;
sl.QuadPart=0i64;
ZwWriteFile(hfile,NULL,NULL,NULL,&iostatus,pBuffer,30,&sl,NULL);
KdPrint(("成功写入 %d 字节\n",iostatus.Information));
//构造要填充的数据
RtlFillMemory(pBuffer,BUFFER_SIZE,'x');
KdPrint(("成功写入 %d 字节\n",BUFFER_SIZE));
//追加数据
LARGE_INTEGER number;
number.QuadPart =30i64;//设置文件指针
//对文件进行附加写
ZwWriteFile(hfile,NULL,NULL,NULL,&iostatus,pBuffer,BUFFER_SIZE,&number,NULL);
KdPrint(("追加写入 %d 字节\n",iostatus.Information));
//关闭文件句柄
ZwClose(hfile);
ExFreePool(pBuffer);
return true;
}
//读取文件
NTSTATUS ReadFileText(void)
{
OBJECT_ATTRIBUTES objectAttributes;
IO_STATUS_BLOCK iostatus;
HANDLE hfile;
UNICODE_STRING SymbolFileName;
//初始化UNICODE_STRING字符串
RtlInitUnicodeString( &SymbolFileName, L"\\Device\\HarddiskVolume1\\1.txt");
//RtlInitUnicodeString( &SymbolFileName, L"\\??\\C:\\1.txt");
//初始化objectAttributes
InitializeObjectAttributes(&objectAttributes,
&SymbolFileName,
OBJ_CASE_INSENSITIVE,//对大小写敏感
NULL,
NULL );
//创建文件
NTSTATUS ntStatus = ZwCreateFile( &hfile,
GENERIC_READ,
&objectAttributes,
&iostatus,
NULL,
FILE_ATTRIBUTE_NORMAL, //常规属性
FILE_SHARE_READ,//共享读
FILE_OPEN,//有文件存在则打开,不存在则报错
FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0 );
if (!NT_SUCCESS(ntStatus))
{
KdPrint(("文件不存在!\n"));
return false;
}
FILE_STANDARD_INFORMATION fsi;
//读取文件长度
ntStatus = ZwQueryInformationFile(hfile,
&iostatus,
&fsi,
sizeof(FILE_STANDARD_INFORMATION),
FileStandardInformation);
KdPrint(("共读取 %d 字节\n",fsi.EndOfFile.QuadPart));
//为读取的文件分配缓冲区
PUCHAR pBuffer = (PUCHAR)ExAllocatePool(PagedPool,
(LONG)fsi.EndOfFile.QuadPart);
//读取文件
ZwReadFile(hfile,NULL,
NULL,NULL,
&iostatus,
pBuffer,
(LONG)fsi.EndOfFile.QuadPart,
NULL,NULL);
KdPrint(("实际读取 %d 字节\n",iostatus.Information));
//显示实际读取内容
KdPrint(("\n 成功读取内容为:%s \n",pBuffer));
//关闭文件句柄
// ZwClose(hfile);
//释放缓冲区
ExFreePool(pBuffer);
return true;
}
//文件属性
NTSTATUS FileAttributeText(void)
{
OBJECT_ATTRIBUTES objectAttributes;
IO_STATUS_BLOCK iostatus;
HANDLE hfile;
UNICODE_STRING SymbolFileName;
//初始化UNICODE_STRING字符串
//RtlInitUnicodeString( &SymbolFileName, L"\\Device\\HarddiskVolume1\\1.txt");
RtlInitUnicodeString( &SymbolFileName, L"\\??\\C:\\1.txt");
//初始化objectAttributes
InitializeObjectAttributes(&objectAttributes,
&SymbolFileName,
OBJ_CASE_INSENSITIVE,//对大小写敏感
NULL,
NULL );
//创建文件
NTSTATUS ntStatus = ZwCreateFile( &hfile,
GENERIC_ALL,
&objectAttributes,
&iostatus,
0,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_WRITE,
FILE_OPEN_IF,//对文件打开,如果不存在则返回错误
FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0);
if (NT_SUCCESS(ntStatus))
{
KdPrint(("打开文件成功.\n"));
}
FILE_STANDARD_INFORMATION fsi;
//读取文件长度
ntStatus = ZwQueryInformationFile(hfile,
&iostatus,
&fsi,
sizeof(FILE_STANDARD_INFORMATION),
FileStandardInformation);
if (NT_SUCCESS(ntStatus))
{
KdPrint(("文件长度 :%u\n",fsi.EndOfFile.QuadPart));
}
//读出文件属性
FILE_BASIC_INFORMATION fbi;
ZwQueryInformationFile(hfile,
&iostatus,
&fbi,
sizeof(FILE_BASIC_INFORMATION),
FileBasicInformation);
//修改文件属性
fbi.FileAttributes=FILE_ATTRIBUTE_READONLY;//|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_NORMAL;
ntStatus = ZwSetInformationFile(hfile,
&iostatus,
&fbi,
sizeof(FILE_BASIC_INFORMATION),
FileBasicInformation);
if (NT_SUCCESS(ntStatus))
{
KdPrint(("设置文件 属性成功.\n"));
} else
{
KdPrint(("设置文件 属性失败ntStatus=%x\n",ntStatus));
}
//关闭文件句柄
ZwClose(hfile);
return true;
}
内核下文件操作
最新推荐文章于 2023-09-07 09:39:08 发布