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. Asp.net MVC5中Html.DropDownList的使用

    一.静态下拉列表项的绑定 在下拉列表中绑定静态项,我们可以通过 SelectListItem 的集合作为数据源的下拉列表. @Html.DropDownList("dropRoles&quo ...

  2. PHP学习笔记五【方法】

    <?php $num1=34; $num2=90; $oper="+"; $res=0; switch($oper) { case "+": $res=$ ...

  3. java static关键字

    方便在没有创建对象的情况下来进行调用(方法/变量). 很显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问. static可以用来修饰类的 ...

  4. activity的生命周期详解

    刚在看mars老师的视频,看到activity的生命周期,就看了一下,总结了一下.下面是各函数的调用时机 为了更清楚的看清楚工作的具体过程,举例如下: ,建立两个activity,一个main,一个a ...

  5. Naive Bayes(朴素贝叶斯算法)[分类算法]

    Naïve Bayes(朴素贝叶斯)分类算法的实现 (1) 简介: (2)   算法描述: (3) <?php /* *Naive Bayes朴素贝叶斯算法(分类算法的实现) */ /* *把. ...

  6. 【python学习笔记02】python的数据类型2

    列表和元组之间的主要区别是:列表括在括号([])和它们的元素和大小是可以改变的,而元组在圆括号(),不能被更新.元组可以被认为是只读列表. 存储在一个列表中的值可以使用切片操作符来访问([]和[:]) ...

  7. FMDB将对象放进数据库[二](使用runtime)

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  8. Oracle EBS-SQL (CST-2):检查有BOM但成本不基于累积的数据.sql

    select c.segment1                                                                          物料编码,     ...

  9. 全国计算机等级考试二级教程-C语言程序设计_第5章_循环结构

    for循环结构的嵌套 外层循环每循环一次,内层循环会完整循环一次. 外层循环是竖. 内层循环是横. for, do...while, while的选择: 如果有固定次数,如阶乘! ,判断素数,用 fo ...

  10. Ice_cream’s world III(prime)

    Ice_cream’s world III Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Othe ...