1.1 内核不接受一个字符串文件路径,必须填写一个OBJECT_ATTRIBUTES结构。
这个结构,在InitializeObjectAttributes初始化 typedef struct _OBJECT_ATTRIBUTES {
ULONG Length;
HANDLE RootDirectory;
PUNICODE_STRING ObjectName; //路径
ULONG Attributes;
PVOID SecurityDescriptor;
PVOID SecurityQualityOfService;
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
typedef CONST OBJECT_ATTRIBUTES *PCOBJECT_ATTRIBUTES; VOID
InitializeObjectAttributes(
OUT POBJECT_ATTRIBUTES InitializedAttributes,
IN PUNICODE_STRING ObjectName, //路径
IN ULONG Attributes, //OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE 忽略大小写 |打开内核句柄
IN HANDLE RootDirectory,
IN PSECURITY_DESCRIPTOR SecurityDescriptor //打开的是内核句柄 传NULL
); NTSTATUS
ZwCreateFile(
__out PHANDLE FileHandle,
__in ACCESS_MASK DesiredAccess, //申请的权限GENERIC_ALL
__in POBJECT_ATTRIBUTES ObjectAttributes,
__out PIO_STATUS_BLOCK IoStatusBlock, //
__in_opt PLARGE_INTEGER AllocationSize,
__in ULONG FileAttributes,
__in ULONG ShareAccess,
__in ULONG CreateDisposition,
__in ULONG CreateOptions,
__in_opt PVOID EaBuffer,
__in ULONG EaLength
); 如果CreateOptions 带有FILE_NO_INTERMEDIATE_BUFFERING CreateOptions 表示不通过缓冲区 直接操作磁盘,所以每次
操作读写都必须以磁盘扇区大小(通常为512字节)对齐,否则返回错误,
typedef struct _IO_STATUS_BLOCK {
union {
NTSTATUS Status; //成功则为STATUS_SUCCESS
PVOID Pointer;
} DUMMYUNIONNAME;
ULONG_PTR Information; //返回的更多信息
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; NTSTATUS
ZwReadFile(
IN HANDLE FileHandle,
IN HANDLE Event OPTIONAL, //用于异步完成时
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, //异步完成时的回调例程
IN PVOID ApcContext OPTIONAL,
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID Buffer, //缓冲区
IN ULONG Length, //缓冲区长度
IN PLARGE_INTEGER ByteOffset OPTIONAL, //
IN PULONG Key OPTIONAL
); 读取的实际长度在ioStatusBlock.Information里
读取完 返回STATUS_END_OF_FILE NTSTATUS
ZwWriteFile(
IN HANDLE FileHandle,
IN HANDLE Event OPTIONAL,
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
IN PVOID ApcContext OPTIONAL,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PVOID Buffer,
IN ULONG Length,
IN PLARGE_INTEGER ByteOffset OPTIONAL,
IN PULONG Key OPTIONAL
);
 下面是实现代码:
/***************************************************************************************
* AUTHOR : icqw
* DATE : 2015-7-30
* MODULE : FileOption.H
*
* IOCTRL Sample Driver
*
* Description:
* Demonstrates communications between USER and KERNEL.
*
****************************************************************************************
* Copyright (C) 2010 icqw.
****************************************************************************************/
#ifndef CXX_FILEOPTION_H
#define CXX_FILEOPTION_H
#include <ntifs.h>
#include <devioctl.h>
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObj, IN PUNICODE_STRING pRegistryString);
VOID DriverUnload(IN PDRIVER_OBJECT pDriverObj);
HANDLE OpenFile(WCHAR* wzFilePath);
NTSTATUS ReadFile(HANDLE hFile,CHAR* szBuffer,PULONG ulLength,PLARGE_INTEGER Offset);
NTSTATUS WriteFile(HANDLE hFile,CHAR* szBuffer,PULONG ulLength,PLARGE_INTEGER Offset);
NTSTATUS FileCopy(WCHAR* wzDest,WCHAR* wzSour);
#endif
#ifndef CXX_FILEOPTION_H
# include "FileOption.h"
#endif
NTSTATUS
DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING pRegisterPath)
{
NTSTATUS status = STATUS_SUCCESS;
// #if DBG
// _asm int 3
//
// #endif
DriverObject->DriverUnload = DriverUnload;
FileCopy(L"\\??\\D:\\Dest.txt",L"\\??\\D:\\Sour.txt"); DbgPrint("[FileOption] DriverEntry Success\r\n");
return STATUS_SUCCESS;
}
NTSTATUS FileCopy(WCHAR* wzDest,WCHAR* wzSour)
{
HANDLE hSourFile = OpenFile(wzSour);
HANDLE hDestFile = OpenFile(wzDest);
ULONG ulLength = ;
CHAR* szBuffer = NULL;
NTSTATUS Status = STATUS_UNSUCCESSFUL;
LARGE_INTEGER Offset = {};
if (hSourFile==NULL||hDestFile==NULL)
{
return STATUS_UNSUCCESSFUL;
}
szBuffer = (char*)ExAllocatePool(NonPagedPool,*+);
while(TRUE)
{
RtlZeroMemory(szBuffer,*+);
ulLength = *;
//读
Status = ReadFile(hSourFile,
szBuffer,
&ulLength,
&Offset);
if (!NT_SUCCESS(Status))
{
break;
}
//写
Status = WriteFile(hDestFile,
szBuffer,
&ulLength,
&Offset);
if (!NT_SUCCESS(Status))
{
break;
}
}
DbgPrint("Copy Success!");
ZwClose(hSourFile);
ZwClose(hDestFile);
return STATUS_SUCCESS;
}
HANDLE OpenFile(WCHAR* wzFilePath)
{
UNICODE_STRING uniName;
OBJECT_ATTRIBUTES Ob;
HANDLE hFile = NULL;
NTSTATUS Status = STATUS_UNSUCCESSFUL;
IO_STATUS_BLOCK ioStatus = {}; RtlInitUnicodeString(&uniName,wzFilePath);
InitializeObjectAttributes(&Ob,
&uniName,
OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,
NULL,
NULL);
Status = ZwCreateFile(&hFile,
GENERIC_ALL|SYNCHRONIZE,
&Ob,
&ioStatus,
NULL,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ,
FILE_OPEN_IF,
FILE_NON_DIRECTORY_FILE|
FILE_RANDOM_ACCESS|
FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
);
if (!NT_SUCCESS(Status))
{
return NULL;
}
return hFile;
}
//读文件 ulLength 为读取实际长度
NTSTATUS ReadFile(HANDLE hFile,CHAR* szBuffer,PULONG ulLength,PLARGE_INTEGER Offset)
{
//这里用
NTSTATUS Status = STATUS_UNSUCCESSFUL;
IO_STATUS_BLOCK ioStatus = {}; Status = ZwReadFile(hFile,
NULL,
NULL,
NULL,
&ioStatus,
szBuffer,
*ulLength,
Offset,
NULL);
if (!NT_SUCCESS(Status))
{
//Status==STATUS_END_OF_FILE) return STATUS_UNSUCCESSFUL; }
*ulLength = ioStatus.Information;
return Status;;
}
//写文件
NTSTATUS WriteFile(HANDLE hFile,CHAR* szBuffer,PULONG ulLength,PLARGE_INTEGER Offset)
{
NTSTATUS Status = STATUS_UNSUCCESSFUL;
IO_STATUS_BLOCK ioStatus = {}; Status = ZwWriteFile(hFile,
NULL,
NULL,
NULL,
&ioStatus,
szBuffer,
*ulLength,
Offset,
NULL);
if (!NT_SUCCESS(Status))
{
return STATUS_UNSUCCESSFUL; //!!!!
}
(*Offset).QuadPart += *ulLength; //Offset移动
return Status;;
}
VOID
DriverUnload(IN PDRIVER_OBJECT pDriverObj)
{
DbgPrint("[FileOption] Unloaded Success\r\n");
return;
}

实现FileCopy(Ring0 x86 x64)的更多相关文章

  1. 数据库管理工具GUI - PremiumSoft Navicat Premium Enterprise 11.2.15 x86/x64 KEY

    转载自: 数据库管理工具GUI - PremiumSoft Navicat Premium Enterprise 11.2.15 x86/x64 KEY Navicat Premium(数据库管理工具 ...

  2. [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装

    [原创] [2014.12.02更新网盘链接]基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装 joinlidong 发表于 2014-11-29 14:25:50 ...

  3. 关于VS项目平台的x86,x64,Any CPU以及Debug和Release的区别

    相信对于很多刚接触打包程序的同志来说,关于x86,x64,Any CPU这三个项目平台,以及解决方案配置Debug和Release有什么区别?这个问题一定有许多的困惑,甚至不乏一些已经工作了很久的老程 ...

  4. SQL Server 2008 R2 Developer (x86, x64, ia64) – DVD (Chinese-Simplified)

    http://blog.sina.com.cn/s/blog_4aedf6370101j9tz.html 1. SQL Server 2008 R2 Developer (x86, x64, ia64 ...

  5. System Address Map Initialization in x86/x64 Architecture Part 2: PCI Express-Based Systems

      原文  http://resources.infosecinstitute.com/system-address-map-initialization-x86x64-architecture-pa ...

  6. VOL.2 IE6,7,8(windows vista/7 x86/x64 )单文件版三连发,欢迎大家分享

    在上期 VOL.1 利用vmware ThinApp 制作非XP下可以运行的IE6 [无插件版](windows vista/7/8  x86/x64 )中,简要介绍了如何利用vmware Thina ...

  7. [Tool]利用Advanced Installer建立x86/x64在一起的安装程式

    原文 [Tool]利用Advanced Installer建立x86/x64在一起的安装程式 之前使用InstallShield做安装程式时,如果要将程式放在Program Files的话,需要分别针 ...

  8. 『开源重编译』System.Data.SQLite.dll 自适应 x86 x64 AnyCPU 重编译

    背景: > System.Data.SQLite.dll 程序集 不能良好的支持 AngCPU 格式 System.Data.SQLite.dll 在 适应 x86 和 x64 有三个方案: & ...

  9. 关于.NET编译的目标平台(AnyCPU,x86,x64) (转)

    关于.NET编译的目标平台(AnyCPU,x86,x64)(转) 今天有项目的代码收到客户的反馈,要求所有的EXE工程的目标平台全部指定成x86,而所有DLL工程的目标平台全部指定成AnyCPU . ...

随机推荐

  1. SQL Server 2008 忘记sa密码的解决办法

    由于某些原因,sa和windows验证都不能登录 sql server,可以用独占模式,修改sa密码先在服务管理器停止Sql Server服务,然后打开命令行,进入 SQL Server安装目录,进入 ...

  2. 反射操作辅助类ReflectionUtil

    这篇文章的目的是介绍这样一种方式,就是在写一个函数的时候,传递的参数是object类型的,在这个函数里面想访问这个参数对象的某一属性值,我们知道这个属性值的name,但是一般情况下,object对象是 ...

  3. HDU 5740 - Glorious Brilliance

    题意: 给出已0 1染色的无向图(不一定联通),一次操作为一对相邻点颜色互换. 问使任意相邻点颜色不同,最少需要多少次操作 分析: 交换两点的代价即为两点间最短路. 故用BFS找出所有点到任意点的最短 ...

  4. linux修改rm指令执行(数据安全)

    引用文章A:http://hi.baidu.com/jlusuoya/item/32ae398958088755840fabfb 引用介绍:将rm替换为mv. 引用文章B:http://blog.cs ...

  5. php中数字和字母生成随机字符串

    function strrand($len) { $arr = array( "0", "1", "2", "3", & ...

  6. shopnc 导出Excel数据问题实例 && ajax 获取当前值并传递

    任务:从商家中心导出数据,各个商品所属情况. 商品导出到Excel文件功能 /导出exel 功能make-in-lemon public function createExcelOp(){ $mode ...

  7. java 使用pem密钥进行RSA加解密

    1.使用openssl生成私钥和公钥 openssl下载地址:http://www.openssl.org/source openssl生成私钥命令:  genrsa -out rsa_private ...

  8. 怎么查看mysql执行过的sql。

    有些时候当程序做了更新,数据库负载突然上来,或者并发翻了几倍.这个时候如果用show full processlist; 根本看不到完全的sql.怎么才能看是哪些sql导致的呢,在网上查了资料,有一下 ...

  9. python 序列类型

    1.不可变的序列类型:tuple.range.str.set 001:对于tuple 类型有如下几种构造方式 1.() 构造一个空的元组. 2.a | (a,) 构造一个只有一个元素的元组. 3.tu ...

  10. gdal vc++ 配置说明

      1在VC中,打开菜Tool-Option,在Directories页面中的Library files中和Include files中分别添加GDAL的LIB文件目录和INCLUDE文件目录2打开菜 ...