21,597
社区成员
发帖
与我相关
我的任务
分享
/*
**********************************************************************************
*==文件名称:op_file.cpp
*==文件描述:该文件主要用于实现驱动下的文件读写
*==文件作者:jimmy
*==编写时间:2012-102
***********************************************************************************
*/
#include<ntddk.h>
//*================================================================================
//*==预处理定义
//*================================================================================
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT driver,IN PUNICODE_STRING registryPath);
#pragma alloc_text(INIT,DriverEntry)//INIT标识是指此函数是在驱动加载时使用,驱动加载完成后可以从内存卸载
//*==================================================================================
//*函数名称:DirverEntry
//*功能描述:驱动程序的入口函数
//*入口参数:PDRIVER_OBJECT,PUNICODE_STRING
//*出口参数:NTSTATUS
//*==================================================================================
NTSTATUS DriverEntry(IN PDRIVER_OBJECT driver,IN PUNICODE_STRING registryPath)
{
//用来接收函数的返回值,查看函数是否成功执行
NTSTATUS status=0;
OBJECT_ATTRIBUTES srcobjectAttribute={0};
OBJECT_ATTRIBUTES dstobjectAttribute={0};
UNICODE_STRING srcfile_name;
UNICODE_STRING dstfile_name;
//设置文件路径
RtlInitUnicodeString(&srcfile_name,L"\\??\\C:windows\\system.ini");
RtlInitUnicodeString(&dstfile_name,L"\\??\\C:windows\\dst.txt");
InitializeObjectAttributes(&srcobjectAttribute,&srcfile_name,OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,NULL,NULL);
InitializeObjectAttributes(&dstobjectAttribute,&dstfile_name,OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,NULL,NULL);
HANDLE srcfile_handle=NULL;
HANDLE dstfile_handle=0;
IO_STATUS_BLOCK blok={0};
status=ZwCreateFile(&srcfile_handle,GENERIC_ALL,&srcobjectAttribute,&blok,NULL,FILE_ATTRIBUTE_NORMAL,FILE_SHARE_READ,FILE_OPEN_IF,FILE_NON_DIRECTORY_FILE|FILE_RANDOM_ACCESS|FILE_SYNCHRONOUS_IO_NONALERT,NULL,0);
if(!NT_SUCCESS(status))
{
DbgPrint("打开源文件失败");
return status;
}
status=ZwCreateFile(&dstfile_handle,GENERIC_ALL,&dstobjectAttribute,&blok,NULL,FILE_ATTRIBUTE_NORMAL,FILE_SHARE_READ,FILE_OPEN_IF,FILE_NON_DIRECTORY_FILE|FILE_RANDOM_ACCESS|FILE_SYNCHRONOUS_IO_NONALERT,NULL,0);
if(!NT_SUCCESS(status))
{
DbgPrint("打开目的文件失败");
return status;
}
//读写文件开始
LARGE_INTEGER offset={0};
PVOID buf=NULL;//缓冲区
int length=4*1024;
while(1)
{
status=ZwReadFile(srcfile_handle,NULL,NULL,NULL,&blok,buf,length,&offset,NULL);
if(!NT_SUCCESS(status))
{
if(STATUS_END_OF_FILE==status)
{
status=STATUS_SUCCESS;
break;
}
}
//获取实际的读取长度
length=blok.Information ;
//已经读取了长度,写入文件
status=ZwWriteFile(dstfile_handle,NULL,NULL,NULL,&blok,buf,length,&offset,NULL);
if(!NT_SUCCESS(status))
{
break;
}
//改变偏移量,然后继续移动
offset.QuadPart +=length;
}
DbgPrint("复制文件完毕");
ZwClose(srcfile_handle);
ZwClose(dstfile_handle);
return STATUS_SUCCESS;
}
便会出现找不到指定文件错误,我不是很懂,驱动开发还是菜鸟,求助
RtlInitUnicodeString(&uniName, L"\\DosDevices\\C:\\WINDOWS\\example.txt"); // or L"\\SystemRoot\\example.txt"