在上一篇的时候我学会了 读取文件 还有查询文件大小 写入文件等 然后想写一些代码 比如文件复制的 什么 的
然后 我昨天 决心学 X64的驱动了 然后昨天也把win7 X64的双机调试 搞定了 然后开始了 写win7 X64驱动的第一天
其实 x64 和x86都是差不多的 只不过 x64有些数据结构 重写了 如果 还用 x86 的 可能就凉了
然后 先看 个 win7x86 的 文件复制的效果把
效果就是 里面的log 1 多出了 log 2 说明是成功的
然后看看x64 的效果
win 7 x64 也是完美运行的
那么 下面就是代码
#include
VOID DriverUnload(PDRIVER_OBJECT driver)
{
KdPrint(("goodbye"));
}
BOOLEAN copyfile(UNICODE_STRING destfile, UNICODE_STRING srcfile)
{
HANDLE hdfile=NULL, hsrcfile=NULL;
PVOID buffer = NULL;
ULONG len = 0;
LARGE_INTEGER offset = { 0 };
IO_STATUS_BLOCK IO = { 0 };
OBJECT_ATTRIBUTES ob;
NTSTATUS status;
BOOLEAN bret = FALSE;
InitializeObjectAttributes(&ob,
&srcfile,
OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
NULL,
NULL);
status = ZwCreateFile(&hsrcfile,
GENERIC_READ,
&ob,
&IO,
NULL,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ,
FILE_OPEN,
FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0);
if (!NT_SUCCESS(status))
{
if (hsrcfile)
ZwClose(hsrcfile);
if (hdfile)
ZwClose(hdfile);
if (buffer != NULL)
ExFreePool(buffer);
KdPrint(("获取文件句柄失败 清观察一下是否存在此文件!\n"));
return FALSE;
}
InitializeObjectAttributes(&ob,
&destfile,
OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
NULL,
NULL);
status = ZwCreateFile(&hdfile,
GENERIC_WRITE,
&ob,
&IO,
NULL,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ,
FILE_OPEN_IF,
FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0);
if (!NT_SUCCESS(status))
{
if (hsrcfile)
ZwClose(hsrcfile);
if (hdfile)
ZwClose(hdfile);
if (buffer != NULL)
ExFreePool(buffer);
KdPrint(("获取文件句柄失败 清观察一下是否存在此文件!\n"));
return FALSE;
}
buffer = ExAllocatePool(NonPagedPool, 1024*4);
if (buffer == NULL)
{
KdPrint(("申请内存失败!\n"));
return FALSE;
}
while (1)
{
len = 4 * 1024;
status = ZwReadFile(hsrcfile,
NULL,
NULL,
NULL,
&IO,
buffer,
len,
&offset,
NULL);
if (!NT_SUCCESS(status))
{
if (status == STATUS_END_OF_FILE)
{
if (hsrcfile)
ZwClose(hsrcfile);
if (hdfile)
ZwClose(hdfile);
if (buffer != NULL)
ExFreePool(buffer);
KdPrint(("成功!\n"));
return TRUE;
}
}
len = (ULONG)IO.Information;
status = ZwWriteFile(hdfile,
NULL,
NULL,
NULL,
&IO,
buffer,
len,
&offset,
NULL);
if (!NT_SUCCESS(status))
{
if (hsrcfile)
ZwClose(hsrcfile);
if (hdfile)
ZwClose(hdfile);
if (buffer != NULL)
ExFreePool(buffer);
KdPrint(("写入失败!\n"));
return FALSE;
}
offset.QuadPart += len;
}
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
KdPrint(("first: Hello, my salary!"));
UNICODE_STRING log, log1;
RtlInitUnicodeString(&log, L"\\??\\C:\\2.log");
RtlInitUnicodeString(&log1, L"\\??\\C:\\1.log");
if (copyfile(log, log1))
{
KdPrint(("好嗨哟"));
}
else
{
KdPrint(("OMG"));
}
DriverObject->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
其实也不难 一边写 一边读