调用:
KernelCopyFile(L"\??\C:\888.exe", L"\??\C:\567.exe");
注意点:
1、文件过大怎么读写?
readoffset.QuadPart = 0 这个是读取文件位置,如果读取的文件很大,可以通过这个参数来分批读入
2、ZwClose(hfile2); 最后不关闭句柄的效果
文件的打开,读取,创建,写入 都包含在这个函数
///KernelCopyFile内核拷贝函数
///执行流程基于旧文件的打开,旧文件内容的读取,新文件的创建最后新文件的写入
/// 参数1是新文件路径,参数2是旧文件路径
NTSTATUS KernelCopyFile(PWCHAR defile_path, PWCH sourcefile_path)
{
NTSTATUS status = STATUS_SUCCESS;// 定义一个返回值
HANDLE hfile1 = NULL; //定义一个句柄
UNICODE_STRING sourcefilepath = {
0 }; //源文件路径
OBJECT_ATTRIBUTES obja1 = {
0 }; //源文件参数
IO_STATUS_BLOCK iostack1 = {
0 };//旧文件操作记录
RtlInitUnicodeString(&sourcefilepath, sourcefile_path);//初始化一个文件路径
//初始化
InitializeObjectAttributes(&obja1, &sourcefilepath, OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE, NULL, NULL);
//打开文件旧文件
//参数1:文件句柄
//参数2:访问权限
//参数3:&iostack1 会记录这次操作的一些信息
//参数4:FILE_SHARE_READ 共享读、FILE_SHARE_WRITE共享写
status = ZwOpenFile(&hfile1, GENERIC_ALL, &obja1, &iostack1, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_SYNCHRONOUS_IO_NONALERT);
// 判断打开文件是否成功
if (!NT_SU