博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
win 64 文件操作
阅读量:4557 次
发布时间:2019-06-08

本文共 2386 字,大约阅读时间需要 7 分钟。

以下内容全部来自www.vbasm.com 中的WIN64驱动编程基础教程

1.文件复制

1 BOOLEAN ZwCopyFile  2 (  3 IN PUNICODE_STRING ustrDestFile, // \??\c:\1.txt  4 IN PUNICODE_STRING ustrSrcFile // \??\c:\0.txt  5 ) {  6 HANDLE hSrcFile, hDestFile;  7 PVOID buffer = NULL;  8 ULONG length = 0;  9 LARGE_INTEGER offset = {
0}; 10 IO_STATUS_BLOCK Io_Status_Block = {
0}; 11 OBJECT_ATTRIBUTES obj_attrib; 12 NTSTATUS status; 13 BOOLEAN bRet = FALSE; 14 do 15 { 16 // 打开源文件 17 InitializeObjectAttributes( &obj_attrib, 18 ustrSrcFile, 19 OBJ_CASE_INSENSITIVE | 20 OBJ_KERNEL_HANDLE, 21 NULL, 22 NULL); 23 status = ZwCreateFile( &hSrcFile, 24 GENERIC_READ, 25 &obj_attrib, 26 &Io_Status_Block, 27 NULL, 28 FILE_ATTRIBUTE_NORMAL, 29 FILE_SHARE_READ, 30 FILE_OPEN, 31 FILE_NON_DIRECTORY_FILE | 32 FILE_SYNCHRONOUS_IO_NONALERT, 33 NULL, 34 0 ); 35 if (!NT_SUCCESS(status)) 36 { 37 bRet = FALSE; 38 goto END; 39 } 40 // 打开目标文件 41 InitializeObjectAttributes( &obj_attrib, 42 ustrDestFile, 43 OBJ_CASE_INSENSITIVE | 44 OBJ_KERNEL_HANDLE, 45 NULL, 46 NULL); 47 status = ZwCreateFile( &hDestFile, 48 GENERIC_WRITE, 49 &obj_attrib, 50 &Io_Status_Block, 51 NULL, 52 FILE_ATTRIBUTE_NORMAL, 53 FILE_SHARE_READ, 54 FILE_OPEN_IF, 55 FILE_NON_DIRECTORY_FILE | 56 FILE_SYNCHRONOUS_IO_NONALERT, 57 NULL, 58 0 ); 59 if (!NT_SUCCESS(status)) 60 { 61 bRet = FALSE; 62 goto END; 63 } 64 // 为 buffer 分配 4KB 空间 65 buffer = ExAllocatePool(NonPagedPool, 1024 * 4); 66 if (buffer == NULL) 67 { 68 bRet = FALSE; 69 goto END; 70 } 71 // 复制文件 72 while (1) 73 { 74 length = 4 * 1024; 75 // 读取源文件 76 status = ZwReadFile(hSrcFile, 77 NULL, 78 NULL, 79 NULL, 80 &Io_Status_Block, 81 buffer, 82 length, 83 &offset, 84 NULL); 85 if (!NT_SUCCESS(status)) 86 { 87 // 如果状态为 STATUS_END_OF_FILE,说明文件已经读取到末尾 88 if (status == STATUS_END_OF_FILE) 89 { 90 bRet = TRUE; 91 goto END; 92 } 93 } 94 // 获得实际读取的长度 95 length = (ULONG)Io_Status_Block.Information; 96 // 写入到目标文件 97 status = ZwWriteFile( hDestFile, 98 NULL, 99 NULL,100 NULL,101 &Io_Status_Block,102 buffer,103 length,104 &offset,105 NULL);106 if (!NT_SUCCESS(status))107 {108 bRet = FALSE;109 goto END;110 }111 // 移动文件指针112 offset.QuadPart += length;113 }114 }115 while (0);116 END:117 if (hSrcFile)118 {119 ZwClose(hSrcFile);120 }121 if (hDestFile)122 {123 ZwClose(hDestFile);124 }125 if (buffer != NULL)126 {127 ExFreePool(buffer);128 }129 return bRet;130 }

 

转载于:https://www.cnblogs.com/freesec/p/7582531.html

你可能感兴趣的文章
2、文件夹
查看>>
11、求二进制中1的个数
查看>>
【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--请求处理结果适配篇(7/8)...
查看>>
CodeForces 731A Night at the Museum
查看>>
MySQL 删除数据库
查看>>
JavaScript 字符串(String) 对象
查看>>
How to use VisualSVN Server and TortoiseSVN to host your codes and control your codes' version
查看>>
微信小程序picker组件 - 省市二级联动
查看>>
Dynamics CRM 给视图配置安全角色
查看>>
Eclipse修改已存在的SVN地址
查看>>
(转)使用 python Matplotlib 库绘图
查看>>
进程/线程切换原则
查看>>
正则表达式语法
查看>>
20165301 2017-2018-2 《Java程序设计》第四周学习总结
查看>>
Vue的简单入门
查看>>
urllib 中的异常处理
查看>>
通过SQL Server的扩展事件来跟踪SQL语句在运行时,时间都消耗到哪儿了?
查看>>
比较:I/O成员函数getline() 与 get()(第二种用法)的用法异同
查看>>
7.内部类(一)之详解内部类
查看>>
1.messager消息提示框
查看>>