|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 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);
复制代码
今天的收获还不错,温故了内存、字符串等,学习了一个创建文件,和复制文件。
今天的问题是不知道如何剪切一个文件。 |
评分
-
查看全部评分
|