驱动程序文件操作测试.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;
}