首页 > 安全资讯 >

驱动笔记3:在驱动中读写文件

09-01-10

文章作者:grayfox作者主页:http://nokyo.blogbus.com原始出处:http://nokyo.blogbus.com/logs/33307633.html     对文件的读写操作一直是我们需要熟练掌握的内容,在ring3我们可以使用CreateFile、ReadFile、WriteFi


文章作者:grayfox
作者主页:http://nokyo.blogbus.com
原始出处:http://nokyo.blogbus.com/logs/33307633.html

    对文件的读写操作一直是我们需要熟练掌握的内容,在ring3我们可以使用CreateFile、ReadFile、WriteFile等API,在ring0同样很相似,不过函数变成了ZwCreateFile、ZwReadFile、ZwWriteFile等函数。
    在“【驱动笔记1】第一个驱动程序”一文中我们曾经用到过ZwCreateFile,并且成功使用它创建了一个新文件,但那个文件里面什么内容也没有。本节我们就对那个程序进行扩充,实现一个MyCopyFile函数,通过文件的读写来复制文件。
    下面的代码来自楚狂人的《Windows驱动编程基础教程》,我把它前面省略的文件打开和缓冲区分配过程都补充完整了,下面是该函数的完整代码。

BOOLEAN
MyCopyFile(
           IN PUNICODE_STRING    ustrDestFile,
           IN PUNICODE_STRING    ustrSrcFile
            )
{
    HANDLE    hSrcFile, hDestFile;
    PVOID    buffer = NULL;
    ULONG    length = 0;
    LARGE_INTEGER    offset = {0};
    IO_STATUS_BLOCK Io_Status_Block = {0};
    OBJECT_ATTRIBUTES obj_attrib;
    NTSTATUS status;
    BOOLEAN  bRet = FALSE;

    do
    {
        // 打开源文件
        InitializeObjectAttributes(    &obj_attrib,
            ustrSrcFile,
            OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
            NULL,
            NULL);
        status = ZwCreateFile(    &hSrcFile,
            GENERIC_READ,
            &obj_attrib,
            &Io_Status_Block,
            NULL,
            FILE_ATTRIBUTE_NORMAL,
            FILE_SHARE_READ,
            FILE_OPEN,
            FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,
            NULL,
            0 );
        if (!NT_SUCCESS(status))
        {
            bRet = FALSE;
            goto END;
        }

        // 打开目标文件
        InitializeObjectAttributes(    &obj_attrib,
                                ustrDestFile,
                                OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
                                NULL,
                                NULL);
        status = ZwCreateFile(    &hDestFile,
            GENERIC_WRITE,
            &obj_attrib,
            &Io_Status_Block,
            NULL,
            FILE_ATTRIBUTE_NORMAL,
            FILE_SHARE_READ,
            FILE_OPEN_IF,
            FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,
            NULL,
            0 );
        if (!NT_SUCCESS(status))
        {
            bRet = FALSE;
            goto END;
        }

        // 为buffer分配4KB空间
        buffer = ExAllocatePool(NonPagedPool, 1024 * 4);
        if (buffer == NULL)
        {
            bRet = FALSE;
            goto END;
        }

        // 复制文件
        while (1)
        {
            length = 4 * 1024;
            // 读取源文件
            status = ZwReadFile(hSrcFile,
                            NULL,
                            NULL,
                            NULL,
                            &Io_Status_Block,
                            buffer,
                            length,
                            &offset,
    

相关文章
最新文章
热点推荐