codecook 发表于 2015-11-30 16:06:44

《Windows内核安全与驱动开发》书-学习笔记2

本帖最后由 codecook 于 2015-11-30 16:18 编辑

今天就没那么多废话了,今天学习第四章文件、注册表、线程。
先上一个例子来补充一下书中的ZwCreateFile,为什么要补充,是因为书中的例子省略了一句代码,出现了编译错误:
//打开或创建一个文件
        HANDLE file_handle=NULL;
        NTSTATUS status;
        IO_STATUS_BLOCK io_status_block;    //这里,书中的实例缺少了这个定义,造成代码不完整。
        OBJECT_ATTRIBUTES object_attributes;
        UNICODE_STRING ufile_name=RTL_CONSTANT_STRING(L"\\??\\C:\\a.txt");// C:是一个符号链接,符号链接一般都在\\??\\下
        //OBJ_CASE_INSENSITIVE目标文件不区分大小写OBJ_KERNEL_HANDLE文件需用内核句柄
        InitializeObjectAttributes(&object_attributes,&ufile_name,OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,NULL,NULL);
        status=ZwCreateFile(
                &file_handle,                                       
                GENERIC_READ|GENERIC_WRITE,
                &object_attributes,
                &io_status_block,
                NULL,
                FILE_ATTRIBUTE_NORMAL,
                FILE_SHARE_READ,
                FILE_OPEN_IF,
                FILE_NON_DIRECTORY_FILE|FILE_RANDOM_ACCESS|FILE_SYNCHRONOUS_IO_NONALERT,
                NULL,
                0
                );
        ZwClose(file_handle);

接着同样的问题。ZwReadFile与ZwWriteFile书中并没有给出单独用法,而是用了一个函数MyCopyFile,但是这个例子也是不齐全,需要读者自行完善,我简单处理,实现了这个例子的效果:

//复制一个已存在的文件到另一个新文件
        HANDLE aa_file_handle=NULL;
        NTSTATUS status;
        IO_STATUS_BLOCK io_status_block;
        OBJECT_ATTRIBUTES object_attributes;
        UNICODE_STRING ufile_name=RTL_CONSTANT_STRING(L"\\??\\C:\\aa.txt");
        //OBJ_CASE_INSENSITIVE目标文件不区分大小写OBJ_KERNEL_HANDLE文件需用内核句柄
        InitializeObjectAttributes(&object_attributes,&ufile_name,OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,NULL,NULL);
        status=ZwCreateFile(
                &aa_file_handle,
                GENERIC_READ|GENERIC_WRITE,
                &object_attributes,
                &io_status_block,
                NULL,
                FILE_ATTRIBUTE_NORMAL,
                FILE_SHARE_READ,
                FILE_OPEN_IF,
                FILE_NON_DIRECTORY_FILE|FILE_RANDOM_ACCESS|FILE_SYNCHRONOUS_IO_NONALERT,
                NULL,
                0
                );

        HANDLE bb_file_handle=NULL;       
        RtlInitUnicodeString(&ufile_name,L"\\??\\C:\\bb.txt");
        //OBJ_CASE_INSENSITIVE目标文件不区分大小写OBJ_KERNEL_HANDLE文件需用内核句柄
        InitializeObjectAttributes(&object_attributes,&ufile_name,OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,NULL,NULL);
        status=ZwCreateFile(
                &bb_file_handle,
                GENERIC_READ|GENERIC_WRITE,
                &object_attributes,
                &io_status_block,
                NULL,
                FILE_ATTRIBUTE_NORMAL,
                FILE_SHARE_READ,
                FILE_OPEN_IF,
                FILE_NON_DIRECTORY_FILE|FILE_RANDOM_ACCESS|FILE_SYNCHRONOUS_IO_NONALERT,
                NULL,
                0
                );

        PVOID buffe =NULL;
        LARGE_INTEGER offset={0};
        ULONG length = 1;
    buffe = ExAllocatePool(NonPagedPool, 1);//书中缺少了这句,不分配内存实例做不下去。
        while(1)
        {
                status = ZwReadFile(aa_file_handle,NULL,NULL,NULL,&io_status_block,buffe,length,&offset,NULL);

                if (!NT_SUCCESS(status))
                {
                        if(status==STATUS_END_OF_FILE)
                                status =STATUS_SUCCESS;
                        break;
                }
                ZwWriteFile(bb_file_handle,NULL,NULL,NULL,&io_status_block,buffe,length,&offset,NULL);               
                offset.QuadPart++;
        }
        ZwClose(aa_file_handle);
        ZwClose(bb_file_handle);
        if(buffe!=NULL)
                ExFreePool(buffe);
今天的收获还不错,温故了内存、字符串等,学习了一个创建文件,和复制文件。
今天的问题是不知道如何剪切一个文件。

康小泡 发表于 2015-12-1 18:15:55

都学内核了啊。
页: [1]
查看完整版本: 《Windows内核安全与驱动开发》书-学习笔记2