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

驱动中的文件操作

作者: 温柔倾怀 | 来源:发表于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是成功,跟三环应用程序相反
    
    }
    
    
    

    相关文章

      网友评论

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

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