驱动中的文件操作

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是成功,跟三环应用程序相反

}


上一篇下一篇

猜你喜欢

热点阅读