驱动程序文件操作

驱动程序文件操作测试.cpp

#ifdef _cplusplus
{
#endif
extern "C"
#include <ntddk.h>
#include<wdm.h>
#include "驱动程序文件操作测试.h"
#ifdef _cplusplus
}
#endif

// 创建文件函数 1.文件路径字符串
NTSTATUS createFile(const PCWSTR fileName)
{
	HANDLE hFile = { NULL };			// 定义一个句柄

	OBJECT_ATTRIBUTES attr;			// 通过创建对象和/或返回句柄对象例程被应用到对象或对象句柄结构指定的属性。

	UNICODE_STRING file;				// Unicode字符串

	RtlInitUnicodeString(&file, fileName);		// 初始化Unicode字符串

	// 初始化 OBJECT_ATTRIBUTES 结构
	InitializeObjectAttributes(
		&attr,
		&file,
		OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,				// 不区分大小写	
		NULL,		// 设置为NULL
		NULL);		// 设置为NULL

	IO_STATUS_BLOCK block;		// IO状态块

	NTSTATUS status = ZwCreateFile(
		&hFile,			// 文件句柄
		GENERIC_READ | GENERIC_WRITE,				// 读 / 写
		&attr,														// 指定的对象属性结构
		&block,														// IO状态块
		NULL,														// 初始大小							
		FILE_ATTRIBUTE_NORMAL,							//  该文件未设置其他属性。仅当单独使用时,此属性才有效
		FILE_SHARE_READ,									// 文件读共享
		FILE_OPEN_IF,											// 打开文件
		FILE_NON_DIRECTORY_FILE |						// 该文件不是目录
		FILE_RANDOM_ACCESS |							// 对文件的访问可以是随机的
		FILE_SYNCHRONOUS_IO_NONALERT,			// 对文件的操作都是同步的	
		NULL,														// 设置为NULL
		0);														// 设置为NULL

	// 判断文件是否成功创建
	if (!NT_SUCCESS(status))
	{
		KdPrint(("文件创建失败"));
		return status;
	}
	else
	{
		KdPrint(("文件创建成功"));
	}

	// 如果成功创建则关闭句柄
	ZwClose(hFile);
	return status;
}

// 打开文件
NTSTATUS openFile(const PCWSTR filePath)
{
	// 流程和创建文件差不多
	HANDLE FileHandle = NULL;

	OBJECT_ATTRIBUTES ObjectAttributes;			// 对象属性结构

	UNICODE_STRING file;		// 文件路径Unicode字符串

	RtlInitUnicodeString(&file, filePath);			// 初始化Unicode字符串

	// 初始化对象结构
	InitializeObjectAttributes(&ObjectAttributes, &file, OBJ_KERNEL_HANDLE, NULL, NULL);

	IO_STATUS_BLOCK   IoStatusBlock;			// io信息块

	NTSTATUS status = ZwOpenFile(
		&FileHandle,												// 文件句柄
		FILE_READ_DATA | FILE_WRITE_DATA,		// 读 / 写
		&ObjectAttributes,										// 对象属性结构体
		&IoStatusBlock,											// io信息块
		FILE_SHARE_READ,									// 共享读
		FILE_NON_DIRECTORY_FILE | FILE_RANDOM_ACCESS | FILE_SYNCHRONOUS_IO_NONALERT);

	if (!NT_SUCCESS(status))		// 判断文件时是否打开成功
	{
		return status;
	}

	wrireFile(FileHandle);
	readFile(FileHandle);			// 读取文件内容

	/*
	if (NT_SUCCESS(wrireFile(FileHandle)))
	{
	DbgPrint("文件写入成功");
	}
	else
	{
	DbgPrint("文件写入失败");
	}
	*/
	ZwClose(FileHandle);		// 关闭文件

	return status;
}

// 文件写入
NTSTATUS wrireFile(HANDLE hFile)
{
	IO_STATUS_BLOCK IoStatusBlock;		// io信息块

	char buf[] = "我试试看吧,大猫鱼,hello word\n";		// 写入的内容

	if (NT_SUCCESS(ZwWriteFile(
		hFile,				// 文件句柄
		NULL,			// 设置NULL
		NULL,			// 设置NULL
		NULL,			// 设置NULL
		&IoStatusBlock,		// 接收实际写入的字节数
		buf,					// 缓冲区
		sizeof(buf),		// 缓冲区大小
		NULL,				// 文件的起始偏移
		NULL)))				// 设置为NULL
	{
		DbgPrint("成功写入%I64d\n", IoStatusBlock.Information);
		return STATUS_SUCCESS;
	}

	return STATUS_UNSUCCESSFUL;
}

// 文件读取
NTSTATUS readFile(HANDLE hFile)
{
	char buf[128];			// 缓冲区
	IO_STATUS_BLOCK IoStatusBlock;			// io信息块

	// 直到读取完毕为止
	while (NT_SUCCESS(
		ZwReadFile(hFile,			// 文件句柄
		NULL,						// 设置NULL
		NULL,						// 设置NULL
		NULL,						// 设置NULL
		&IoStatusBlock,			// io信息块
		buf,							// 缓存区大小
		sizeof(buf)-1,			// 大小-1字节
		NULL,						// 文件偏移
		NULL)))						// 设置NULL
	{
		buf[IoStatusBlock.Information] = '\0';		// 将缓冲区转成字符串
		DbgPrint("%s", buf);				// 打印到调式内核
	}
	return STATUS_SUCCESS;
}

驱动程序文件操作测试.h

#ifdef _cplusplus
{
#endif
	extern "C"
#include <ntddk.h>
#include<wdm.h>
#ifdef _cplusplus
}
#endif

// 创建文件
extern "C" NTSTATUS createFile(const PCWSTR fileName);
// 打开文件
NTSTATUS openFile(const PCWSTR filePath);
// 文件写入
NTSTATUS wrireFile(HANDLE hFile);
// 文件读取
NTSTATUS readFile(HANDLE hFile);



源.cpp

#ifdef _cplusplus
{
#endif
extern "C"
#include <ntddk.h>
#include "驱动程序文件操作测试.h"
#ifdef _cplusplus
}
#endif

extern "C" NTSTATUS CreateMyDevice(IN PDRIVER_OBJECT pDriverObject);
void DDK_Unload(IN PDRIVER_OBJECT DriverObject);

#define PAGEDCODE  code_seg("PAGE")
#pragma PAGEDCODE
//驱动程序函数入口
extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pUnicodeString)
{
	//打印字符串
	KdPrint(("PNDGMCSY--加载"));
	//卸载例程的回调函数
	pDriverObject->DriverUnload = DDK_Unload;

	//创建设备对象
	CreateMyDevice(pDriverObject);

	//创建文件
	createFile(L"\\??\\c:\\1.txt");
	//打开文件
	openFile(L"\\??\\c:\\1.txt");
	




	return 0;

}

void DDK_Unload(IN PDRIVER_OBJECT DriverObject)
{
	//删除符号链接
	UNICODE_STRING symLinkName;
	RtlInitUnicodeString(&symLinkName, L"\\??\\Myddk_LinkName");		//初始化设备名称指针
	IoDeleteSymbolicLink(&symLinkName);			//删除符号链接
	//删除设备对象
	//获得设备对象
	PDEVICE_OBJECT pDev = DriverObject->DeviceObject;
	IoDeleteDevice(pDev);		//删除设备对象
	DbgPrint("Goodbye from TestDDK125096!\n");

}

#define INITCODE code_seg("INIT")	
#pragma INITCODE 
NTSTATUS CreateMyDevice(IN PDRIVER_OBJECT pDriverObject)
{
	NTSTATUS status;				//LONG
	PDEVICE_OBJECT pDevObj;			//用来返回创建的设备对象

	//创建设备名称
	UNICODE_STRING devName;
	//对devName初始化字符串为 "\\Device\\Myddk_Device"
	RtlInitUnicodeString(&devName, L"\\Device\\Myddk_Device");

	//创建设备
	status = IoCreateDevice(pDriverObject, 0, &devName, FILE_DEVICE_UNKNOWN, 0, TRUE, &pDevObj);
	//检查创建设备是否成功
	if (!NT_SUCCESS(status))
	{
		if (status == STATUS_INSUFFICIENT_RESOURCES)
		{
			KdPrint(("资源不足"));
		}
		if (status == STATUS_OBJECT_NAME_EXISTS)
		{
			KdPrint(("指定对象名字存在"));
		}
		if (status == STATUS_OBJECT_NAME_COLLISION)
		{
			KdPrint(("对象名有冲突"));
		}
		KdPrint(("创建设备失败"));
		return status;
	}
	KdPrint(("创建设备成功--PNDGMCSY"));
	//设置读写方式,这里为缓冲区读写方式
	pDevObj->Flags |= DO_BUFFERED_IO;

	//创建符号链接
	UNICODE_STRING symLinkName;
	RtlInitUnicodeString(&symLinkName, L"\\??\\Myddk_LinkName");
	status = IoCreateSymbolicLink(&symLinkName, &devName);

	//如果创建符号链接失败,则删除设备
	if (!NT_SUCCESS(status))
	{
		IoDeleteDevice(pDevObj);
		return status;
	}
	KdPrint(("创建符号链接成功"));
	return STATUS_SUCCESS;

}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值