美文网首页
驱动中的文件操作

驱动中的文件操作

作者: 温柔倾怀 | 来源:发表于2019-11-22 21:19 被阅读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是成功,跟三环应用程序相反

}


相关文章

  • 驱动中的文件操作

  • Linux那点事-文件系统

    1. Linux文件系统 在Windows操作系统中,使用驱动器盘符(比如C盘),决定文件的路径名。每个驱动器都会...

  • linux bond创建

    首先加载驱动 modprobe bonding 通过命令操作 通过sys文件操作 参考 https://acces...

  • admin06-挂载光盘

    1、mount 挂载点操作显示光盘文件内容:Windows光盘放入------->光驱设备------->CD驱动...

  • Linux系统简单了解

    Linux文件系统 在Linux操作系统中,所有被操作系统管理的资源,例如网络接口卡、磁盘驱动器、打印机、输入输出...

  • 14.Python之文件操作

    Python之文件操作 文件操作通过Python中的内置函数open()对文件进行操作。文件操作需要如下几个参数:...

  • MyBatis基础

    基本原理 将sql语句写入到xml文件中,为这个xml文件提供统一的接口来操作数据库 引入整合 引入两个驱动包Pa...

  • Redis 事件

    Redis是事件驱动的服务器。事件是对操作的抽象,redis中的事件分为两类: 1)文件事件:redis通过soc...

  • nacos配置使用mysql8的数据库

    1、 下载代码 2、修改pom.xml文件,修改对应的mysql驱动版本 3、修改文件对mysql驱动包中类的引用...

  • 2018-07-23

    主要内容认识系统中的文件操作系统中的文本文件操作系统中的二进制文件操作程序中的字符串数据[特殊:JSON]操作程序...

网友评论

      本文标题:驱动中的文件操作

      本文链接:https://www.haomeiwen.com/subject/sqfcwctx.html