在上一章中 Windows 10驱动开发入门(一):环境搭建我们发现,其实驱动开发中的Hello World
,并没有那么难写,而且还打成了一个驱动包,能够安装到测试机上了,成功的打印出了日志来。
我们的driver.cpp
的代码如下:
// driver.cpp
#include <ntddk.h>
extern "C" void DriverUnload(PDRIVER_OBJECT pDriverObject);
extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath)
{
DbgPrint("[GO2CODING_Driver] DriverEntry\n");
NTSTATUS status = STATUS_SUCCESS;
pDriverObject->DriverUnload = DriverUnload;
return status;
}
extern "C" void DriverUnload(PDRIVER_OBJECT pDriverObject)
{
DbgPrint("[GO2CODING_Driver] DriverUnload\n");
return;
}
对于驱动程序来说,可以发现他并不像传统的程序一样,入库是main
函数,这里的入库函数为DriverEntry
,DriverEntry
函数的参数为固定的参数形式,PDRIVER_OBJECT
的结构承载了驱动函数的入库,PDRIVER_OBJECT
能够做很多的事情,后面我们还会对这个结构进行详细的解释和使用,慢慢的熟悉这个结构体和驱动的开发过程。
我们发现所有的函数前面都出现了一个extern "C"
的,这不是驱动特有的,而是我们开发的时候使用的是cpp
的文件格式,cpp
在调用c函数的时候,需要做extern "C"
的声明,当然如果我们使用的是.c
文件开发,extern "C"
就不是必要的。
在pDriverObject
中,我们只做了DriverUnload
的处理,并没有实质性的东西,只是在驱动卸载的时候,会调用DriverUnload
。
在驱动安装的时候,调用DriverEntry
函数,被卸载的时候,调用了DriverUnload
函数,只是DriverUnload
是一个指针函数,在DriverEntry
被添加进来的。
驱动编译成了.inf
和.sys
两种文件,并不是像普通程序生成的为exe
或者dll
,其实.sys
也是PE
格式的,懂得exe
或者dll
的分析,自然就懂得.sys
的分析了。