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