内核下文件操作

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值