鱼C论坛

 找回密码
 立即注册
查看: 3169|回复: 1

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

[复制链接]
发表于 2015-11-30 16:06:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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


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

  1. //复制一个已存在的文件到另一个新文件
  2.         HANDLE aa_file_handle=NULL;
  3.         NTSTATUS status;
  4.         IO_STATUS_BLOCK io_status_block;
  5.         OBJECT_ATTRIBUTES object_attributes;
  6.         UNICODE_STRING ufile_name=RTL_CONSTANT_STRING(L"\\??\\C:\\aa.txt");
  7.         //OBJ_CASE_INSENSITIVE目标文件不区分大小写  OBJ_KERNEL_HANDLE文件需用内核句柄
  8.         InitializeObjectAttributes(&object_attributes,&ufile_name,OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,NULL,NULL);
  9.         status=ZwCreateFile(
  10.                 &aa_file_handle,
  11.                 GENERIC_READ|GENERIC_WRITE,
  12.                 &object_attributes,
  13.                 &io_status_block,
  14.                 NULL,
  15.                 FILE_ATTRIBUTE_NORMAL,
  16.                 FILE_SHARE_READ,
  17.                 FILE_OPEN_IF,
  18.                 FILE_NON_DIRECTORY_FILE|FILE_RANDOM_ACCESS|FILE_SYNCHRONOUS_IO_NONALERT,
  19.                 NULL,
  20.                 0
  21.                 );

  22.         HANDLE bb_file_handle=NULL;       
  23.         RtlInitUnicodeString(&ufile_name,L"\\??\\C:\\bb.txt");
  24.         //OBJ_CASE_INSENSITIVE目标文件不区分大小写  OBJ_KERNEL_HANDLE文件需用内核句柄
  25.         InitializeObjectAttributes(&object_attributes,&ufile_name,OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,NULL,NULL);
  26.         status=ZwCreateFile(
  27.                 &bb_file_handle,
  28.                 GENERIC_READ|GENERIC_WRITE,
  29.                 &object_attributes,
  30.                 &io_status_block,
  31.                 NULL,
  32.                 FILE_ATTRIBUTE_NORMAL,
  33.                 FILE_SHARE_READ,
  34.                 FILE_OPEN_IF,
  35.                 FILE_NON_DIRECTORY_FILE|FILE_RANDOM_ACCESS|FILE_SYNCHRONOUS_IO_NONALERT,
  36.                 NULL,
  37.                 0
  38.                 );

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

  46.                 if (!NT_SUCCESS(status))
  47.                 {
  48.                         if(status==STATUS_END_OF_FILE)
  49.                                 status =STATUS_SUCCESS;
  50.                         break;
  51.                 }
  52.                 ZwWriteFile(bb_file_handle,NULL,NULL,NULL,&io_status_block,buffe,length,&offset,NULL);               
  53.                 offset.QuadPart++;
  54.         }
  55.         ZwClose(aa_file_handle);
  56.         ZwClose(bb_file_handle);
  57.         if(buffe!=NULL)
  58.                 ExFreePool(buffe);
复制代码

今天的收获还不错,温故了内存、字符串等,学习了一个创建文件,和复制文件。
今天的问题是不知道如何剪切一个文件。

评分

参与人数 1鱼币 +5 收起 理由
康小泡 + 5 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-12-1 18:15:55 | 显示全部楼层
都学内核了啊。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-6 13:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表