Windows内核编程(或者说驱动编程,因为本人喜欢这个霸气的名字,以后都这样说了。。)确实有一定的难度和神秘性,但不是遥不可及的!现在,就让我带您进入Windows内核编程的乐园! 您愿意玩驱动,那么我默认您不是计算机小白,即使我的文章会尽量让所有人看明白,但是有些问题我还是会一带而过。 首先,我们必须做好准备工作。我们需要的工具:Visual studio 2013(win8使用2013版本更好一些),WDK,VMware虚拟机(再下一个win8.1官方原版的ISO镜像安装,不要第三方的,否则VM装不上),DbgView,DriverInstall,WinDbg。 下载地址:vs2013各位自行百度下载,激活码也一堆堆的。 VM网上也不少,不过各位不要弄什么精简版的,要官方原版的。 WDK等工具:去微软官网下即可。http://msdn.microsoft.com/en-US/windows/hardware/gg454513 DbgView:我自己找的一个绿色破解版的,就一个exe文件:Dbgview.rar
115网盘礼包码:5lbdl1pg0fir
http://115.com/lb/5lbdl1pg0fir DriverInstall:一个可以提示中文的兼容x64的驱动加载工具:http://download.csdn.net/detail/tc00tc/7997733 WinDbg:http://support.icafe8.com/technologynews/focus/932.html 好了,下载完成就是繁琐的安装过程了,这里不赘述。 安装好VM和内部的虚拟Win8后,我们要让Windbg和虚拟机建立通信。也就是双机调试。 第一步:设置Windbg,参考windbg的下载也没,那里有。windbg的启动参数:一般是在桌面建立一个快捷方式,在属性页的目标中windbg.exe后面添加 -b -k com:port=\\.\pipe\com_1,baud=11520,pipe 然后在设置虚拟机:
特别注意,设置完应该是这样的:
如果您那里显示的是 “串行端口2”,您首先要删除设备列别里面的打印机和这个串行端口2再新建才可以。不然您的Windbg连不上虚拟机! 好了,现在我们可以编写第一个驱动程序了! 打开visual studio,新建一个WDM空的驱动工程。
然后新建一个源文件,添加代码。 代码如下: [cpp] view plaincopyprint?
- #include <ntddk.h>
- extern "C" VOID DriverUnload(PDRIVER_OBJECT driver)
- {
- DbgPrint("TC");
- }
- extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
- {
- #if DBG
- _asm int 3
- #endif
- DbgPrint("firest sys!");
- driver->DriverUnload = DriverUnload;
- return STATUS_SUCCESS;
- }
我必须解释下:ntddk.h是驱动的头文件之一,大家都知道的。extern “C”是为什么被添加呢?因为我们使用的是VS2013新建的C++工程,编译器会按照C++的方式编译,这样我们的函数名字在编译后就面目全非了,有了extern “C就不会这样。没有的话会出现LINK错误。DriverEntry是驱动的入口函数,如同我们的main一样。DriverUnload是我们的驱动卸载函数,没有在DriverEntry中设置DriverUnload指针的话驱动一旦被加载就无法卸载了。这个条件编译是干什么的?这个是只有在调试模式下才运行的代码,非调试模式不会运行内部的代码。为什么int 3还要这样处理?因为非调试模式下运行int 3,会直接蓝屏!这是一个小技巧,希望大家注意。 好了,现在可以生成解决方案了。如果出现了 error C2220: 警告被视为错误 - 没有生成“object”文件的问题,去工程的属性页面修改下面的地方,把讲警告视为错误设置为否。
生成成功了,我们也成功一半了。要特别注意上面的图片,我们的环境是64位系统,我们的工程也必须是对于x64平台的! 现在去加载运行我们的驱动,用DriverInstall安装运行,是不是出现了 1275:此驱动程序被阻止的错误呢?如果出现了这个让所有x64平台下玩内核的人头疼的问题的时候,您需要把Win8的强制使用驱动签名的属性禁用。参看百度经验:http://jingyan.baidu.com/article/7c6fb42879543380642c9036.html 问题解决之后,再加载运行我们的驱动,是不是成功了?
大家好!我是TC王者很少写技术文档,水平一般技术有限,因为自己非常非常喜欢windows编程,喜欢内核编程,喜欢C++,限于国内关于驱动方面的书籍文档稀少,寒江独钓和天书夜读那两本书已经买不到了,而且它们是对于win32平台的,所有我愿意把我所学所知道的关于内核驱动的事情告诉大家,让更多的人能接触到windows内核编程,或者说是驱动编程,这一系列文章都是我亲自一个字一个字敲的,代码是经过多次验证的,请您尊重我的原创,不要随意转载,随意发布在其他社交平台或网络,鄙人不胜感激!
|