驱动入门实战演练--在驱动下实现自己的CopyFile
一、一些废话
第一篇驱动类的博文,希望大家多多支持~!
入门驱动不久,感觉这一阶段还是遇到了挺多困难,看书的过程中书本上的知识多多少少会和亲身实践有差别,尤其是进到R0级后不再像R3下能那么'为所欲为'了,细节方面的东西特别多,而且一不小心就给蓝了,还好调试时在虚拟机下,鼠标点两下就能重启。其实驱动说难也难,说简单也简单,多动动手,多码几个字,多瞄两眼,熟悉了也就不难了。
废话不多说,先推荐些Windows驱动入门必备利器:
1.《天书夜读》Windows驱动编程基础教程 想要快速入门,这个当之无愧。
2.《从汇编语言到Windows内核编程》 很经典的一本书,本文就是在其基础上写成的(个人很喜欢的一本书)
3.《寒江独钓 Windows内核安全编程》.(谭文等) 相当不错的一本驱动入门书籍
4. 竹林蹊径:深入浅出Windows驱动开发 这本书个人觉得不如前几本好,跳跃性有点大
本文的目的是通过实现驱动下的CopyFile熟悉驱动编程。
关键词: 驱动(内核)编程 内核字符串 应用层与驱动的通信 IRP请求
VOID InitializeObjectAttributes( OUT POBJECT_ATTRIBUTES InitializedAttributes, //被初始化的OBJECT_ATTRIBUTES结构体 IN PUNICODE_STRING ObjectName, //如果是操作文件则为文件名 IN ULONG Attributes, IN HANDLE RootDirectory, //相对目录 IN PSECURITY_DESCRIPTOR SecurityDescriptor );主要内容已经注释,这里有一定要特别注意: 在内核中文件路径不能像在应用层那样 写"C:\\aa.txt" 而是写成"\\??\\C:\\aa.txt" 或 "\\DosDevices\\C:\\aa.txt" ,因为在内核中使用对象路径,"C:\\"只是一个符号链接对象(仅仅对用户而言有意义),链接对象一般都在\\??\\ (也可写成\\DosDevices\\) 所以在内核中要写完整的对象路径。
#include <stdio.h>#include <Windows.h>//用户自定义控制码 用于和应用层的通信#define MYCOPYFILE_CODE \(ULONG)CTL_CODE(FILE_DEVICE_UNKNOWN,\0xa01,METHOD_BUFFERED,FILE_READ_DATA|FILE_WRITE_DATA)typedef struct mymessage{PWSTR SourceFileName;PWSTR DestinFileName;}MyMessage,*PMyMessage;int main(){BOOL ret;DWORD length=0;MyMessage input_buffer;//用CreateFile打开驱动HANDLE device=CreateFileW(L"\\\\.\\MyCF", //应用层应写成这种形式GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);if (device==INVALID_HANDLE_VALUE){printf("open device error! %d",GetLastError());system("pause");return -1;}//填写自定义bufferinput_buffer.DestinFileName=L"D:\\MyCopyFile.txt";input_buffer.SourceFileName=L"D:\\output.txt";printf("%d",sizeof(input_buffer)); ret=DeviceIoControl(device,MYCOPYFILE_CODE,//我们自定义的控制码(PVOID)&input_buffer,//输入缓冲区sizeof(input_buffer),NULL,//没有输出缓冲区0,//输出缓冲区的长度&length,NULL);if (!ret){printf("Device IO error!");return -2;}CloseHandle(device);system("pause");return 0;}