驱动中的文件操作
2019-11-22 本文已影响0人
温柔倾怀
//#include <ntddk.h>
#include <ntifs.h>
VOID DriverUnlode(PDRIVER_OBJECT pDriverObject)
{
//指明这个参数是我故意不用的,不是我忘了,告知编译器不要警告我
UNREFERENCED_PARAMETER(pDriverObject);
//DriverUnlode 驱动的卸载函数,负责清理资源,在驱动卸载的时候调用
//驱动里的资源是真实的系统里的资源,搞不明白分分钟给你蓝屏
DbgPrint("Unlode success");
//打印成功证明我们成功的卸载了这个驱动
}
//DriverEntry 相当于三环程序,也就是应用程序的main函数
//两个参数,PDRIVER_OBJECT 驱动对象指针 ;PUNICODE_STRING pRegPath 注册表的路径指针
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath)
{
UNREFERENCED_PARAMETER(pRegPath);
//制定驱动卸载函数
pDriverObject->DriverUnload = DriverUnlode;
DbgPrint("Hello World!");
//驱动中的文件操作-路径处理
OBJECT_ATTRIBUTES obj_att;
//声明结构体
UNICODE_STRING filepath = { 0 };
WCHAR filepathbuf[]=L"\\??\\C:\\nihao.txt"; //内核中路径的书写方式
RtlInitUnicodeString(&filepath, filepathbuf);
//初始化路径.1:对象属性结构体 2:文件路径(符号链接的形式 3:属性)
InitializeObjectAttributes(&obj_att, &filepath, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,NULL,NULL);//OBJ_CASE_INSENSITIVE不区分大小写
// 驱动中的文件删除,只有一个参数,文件路径(符号路径)
ZwDeleteFile(&obj_att);
//驱动中的文件操作-打开关闭
//ZwCreateFile 创建新文件或打开现有文件
//ZwCloseFile
//声明一个状态,用于后面接收返回值
NTSTATUS status;
//文件句柄
HANDLE hFileHandle = NULL;
//IO状态
IO_STATUS_BLOCK io_status;
//创建或者打开的函数
status = ZwCreateFile(&hFileHandle, GENERIC_READ | GENERIC_WRITE, &obj_att,&io_status,NULL,FILE_ATTRIBUTE_NORMAL,FILE_SHARE_READ,FILE_OPEN_IF,FILE_NON_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT,NULL,0);
if (status==STATUS_SUCCESS)
{
DbgPrint("success");
}
else
{
DbgPrint("fail");
}
//写文件
//1. 申请一段内存,存放字符串,用于写出
UNICODE_STRING fileData = { 0 };
ULONG ulLength = (wcslen(L"hello writer")) * sizeof(WCHAR);
fileData.Buffer = ExAllocatePoolWithTag(PagedPool, 256 * sizeof(WCHAR), 'ADFS');
RtlZeroMemory(fileData.Buffer, 256 * sizeof(WCHAR));
memcpy(fileData.Buffer, L"hello writer",ulLength);
fileData.Length = ulLength;
fileData.MaximumLength = 256 * sizeof(WCHAR);
//写入函数 ZwWriteFile
status = ZwWriteFile(hFileHandle, NULL, NULL, NULL, &io_status, fileData.Buffer,ulLength,NULL,NULL);
//读取文件 ZwReadFile
//1. 申请一段内存
UNICODE_STRING fileData = { 0 };
fileData.Buffer = ExAllocatePoolWithTag(PagedPool, 256 * sizeof(WCHAR), 'ADFS');
RtlZeroMemory(fileData.Buffer, 256 * sizeof(WCHAR));
status = ZwReadFile(hFileHandle, NULL, NULL, NULL, &io_status, fileData.Buffer, 1024, NULL, NULL);
if (status==STATUS_SUCCESS)
{
KdPrint(("read success"));
KdPrint(("%wS",fileData.Buffer));
}
else
{
KdPrint(("read fail"));
}
ZwClose(&hFileHandle);
//返回值
return STATUS_SUCCESS; //实际这里返回的是0,在驱动里返回0是成功,跟三环应用程序相反
}