如何从内核模式设备驱动程序中打开文件以及如何读取或写入文件

news/2024/11/9 16:34:21

对象名称来引用文件
内核模式设备驱动程序引用到一个文件及其对象的名称。此名称是与该文件的完整路径一起 /DosDevices。例如对于 C:/Windows/Example.txt 文件的对象名称是 /DosDevices/C:/Windows/Example.txt。然后通过调用 InitializeObjectAttributes 函数的为 OBJECT_ATTRIBUTES 结构封装为对象的名称。

注意如果早期加载的设备驱动程序,不可能还存在 /DosDevices 命名空间。因此,/DosDevices 命名空间是设备驱动程序将无法访问,因为没有驱动器号公开的。仅可保证在文件系统的部分是 /SystemRoot 的命名空间。/SystemRoot 命名空间映射到操作系统安装位置文件夹。例如对于此文件夹可能是 C:/Windows 或 D:/Winnt。

下面的代码示例阐释了如何通过其对象名称来引用到一个文件 
    UNICODE_STRING     uniName;
    OBJECT_ATTRIBUTES  objAttr;

    RtlInitUnicodeString(&uniName, L"//DosDevices//C://WINDOWS//example.txt");  // or L"//SystemRoot//example.txt"
    InitializeObjectAttributes(&objAttr, &uniName,
                               OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
                               NULL, NULL);

回到顶端
获取文件句柄
若要获取文件句柄,您可以将一个 OBJECT_ATTRIBUTES 结构传递给 ZwCreateFile 函数。可以 GENERIC_READ、 GENERIC_WRITE,或 GENERIC_ALL,设置 DesiredAccess 参数,具体取决于要执行的内容。如果将 CreateOptions 参数设置为 FILE_SYNCHRONOUS_IO_NONALERT 或 FILE_SYNCHRONOUS_IO_ALERT,文件系统跟踪的当前文件位置偏移量。因此,您可以按顺序读取或写入的文件更高版本。此外,您可以访问随机位置上的文件。

下面的代码示例阐释了如何获取文件句柄 
    HANDLE   handle;
    NTSTATUS ntstatus;
    IO_STATUS_BLOCK    ioStatusBlock;

    // Do not try to perform any file operations at higher IRQL levels.
    // Instead, you may use a work item or a system worker thread to perform file operations.

    if(KeGetCurrentIrql() != PASSIVE_LEVEL)
        return STATUS_INVALID_DEVICE_STATE;

    ntstatus = ZwCreateFile(&handle,
                            GENERIC_WRITE,
                            &objAttr, &ioStatusBlock, NULL,
                            FILE_ATTRIBUTE_NORMAL,
                            0,
                            FILE_OVERWRITE_IF, 
                            FILE_SYNCHRONOUS_IO_NONALERT,
                            NULL, 0);

回到顶端
读取或写入到文件
您现在可以调用 ZwReadFile 函数或 ZwWriteFile 函数。完成修改文件后,请使用 ZwClose 函数来关闭该句柄。

下面的代码示例阐释了如何向文件写入 
    #define  BUFFER_SIZE 30
    CHAR     buffer[BUFFER_SIZE];
    size_t  cb;

    if(NT_SUCCESS(ntstatus)) {
        ntstatus = RtlStringCbPrintfA(buffer, sizeof(buffer), "This is %d test/r/n", 0x0);
     if(NT_SUCCESS(ntstatus)) {
           ntstatus = RtlStringCbLengthA(buffer, sizeof(buffer), &cb);
            if(NT_SUCCESS(ntstatus)) {
                ntstatus = ZwWriteFile(handle, NULL, NULL, NULL, &ioStatusBlock,
                    buffer, cb, NULL, NULL);
            }
     }
        ZwClose(handle);
    }

下面的代码示例阐释了如何从文件中读取 
    LARGE_INTEGER      byteOffset;

    ntstatus = ZwCreateFile(&handle,
                            GENERIC_READ,
                            &objAttr, &ioStatusBlock,
                            NULL,
                            FILE_ATTRIBUTE_NORMAL,
                            0,
                            FILE_OPEN, 
                            FILE_SYNCHRONOUS_IO_NONALERT,
                            NULL, 0);
    if(NT_SUCCESS(ntstatus)) {
        byteOffset.LowPart = byteOffset.HighPart = 0;
        ntstatus = ZwReadFile(handle, NULL, NULL, NULL, &ioStatusBlock,
                              buffer, BUFFER_SIZE, &byteOffset, NULL);
        if(NT_SUCCESS(ntstatus)) {
            buffer[BUFFER_SIZE-1] = '/0';
            DbgPrint("%s/n", buffer);
        }
        ZwClose(handle);
    }


http://www.niftyadmin.cn/n/4644365.html

相关文章

擦香水常用部位

2019独角兽企业重金招聘Python工程师标准>>> 擦香水常用部位:耳后,手腕,手肘,腰部,小腿内侧。 转载于:https://my.oschina.net/jingshishengxu/blog/16030

‘gbk‘ codec can‘t decode byte 0x80 in position 9: illegal multibyte sequence

问题描述: python里使用with函数打开文件,文件里有中文字符时,报错: ‘gbk’ codec can’t decode byte 0x80 in position 9: illegal multibyte sequence 代码写法如下: with open(..\test.txt) as a:报错如下&#…

PHP+APACHE+MYSQL+WINDOWS 环境配置秘笈,一定行!!!!

三、配置过程:(一)http.conf 把PHP直接作为apache的一个模块运行,我在里面加了两句:LoadModule php5_module "E:/php/php5apache2.dll"AddType application/x-httpd-php .php我在E:\apache2目录下建立了一个www的目录用于存放我的站点文件,在h…

minifilter开发文件过滤驱动、以及syser调试的经验

minifilter开发文件过滤驱动、以及syser调试的经验。 刚刚完成一个产品的开发,用了两个月,真不容易,像我这种菜鸟,为了搞 清一个常识,得从老谭的那本古董级C程序设计翻起。 首先说驱动教程。 楚狂人谭文的《寒江独钓…

算法-字符串之全排列

字符串的全排列是字符串类的算法题的一个考察点,属于普通问题,它有两种实现方法,递归算法和非递归算法,非递归的方法要稍微难一点,以下会依次进行介绍。 全排列的递归算法 算法思想:求n位的字符串的全排列&…

栈的数组实现和链式实现

1,堆栈ADT StackADT packageStack;publicinterfaceStackADT {publicvoidpush(Object element);//压栈publicObject pop();//出栈publicbooleanisEmpty();publicintsize();publicObject peek();//返回栈顶对象的一个引用publicString toString();}2,链式…

Python 使用pyinstaller打包后,print打印颜色乱码

问题描述: Python 使用pyinstaller打包后,print打印颜色乱码,如图: 代码如下,直接运行是正常的,使用pyinstaller打包后运行乱码 class bcolors:OKRED \033[1;31mEND \033[0mprint(bcolors.OKRED红色字体…

javascript面向对象-组合使用构造函数和原型模式时在原型对象添加init函数

JavaScript面向对象的写法中为什么喜欢在原型对象添加init函数,在函数里添加对象属性,然后构造函数再apply() 为什么不直接把属性添加进构造函数里,而要apply原型的init函数,让我们一起来探讨这个问题 按照你的描述,…