用Visual studio11在Windows8上开发内核驱动监视进程创建
在Windows NT中,80386保护模式的“保护”比Windows 95中更坚固,这个“镀金的笼子”更加结实,更加难以打破。在Windows 95中,至少应用程序I/O操作是不受限制的,而在Windows NT中,我们的应用程序连这点权限都被剥夺了。在NT中几乎不太可能进入真正的ring0层。
在Windows NT中,存在三种Device Driver:
1.“Virtual device Driver” (VDD)。通过VDD,16位应用程序,如DOS 和Win16应用程序可以访问特定的I/O端口(注意,不是直接访问,而是要通过VDD来实现访问)。
2.“GDI Driver”,提供显示和打印所需的GDI函数。
3.“Kernel Mode Driver”,实现对特定硬件的操作,比如说CreateFile, CloseHandle (对于文件对象而言), ReadFile, WriteFile, DeviceIoControl 等操作。“Kernel Mode Driver”还是Windows NT中唯一可以对硬件中断和DMA进行操作的Driver。SCSI 小端口驱动和 网卡NDIS 驱动都是Kernel Mode Driver的一种特殊形式。
Visual studio11与Windows8带来格外不同的新体验
1.启动Vs11
2.看见满目的驱动开发模板
3.选择一个驱动模式,有内核模式与用户模式两种的驱动
4.创建一个驱动程序,KMDF DriverMVP
5.我们选择的是内核模式的驱动程序,下面是创建成功后的界面,分别是驱动程序本身,与驱动安装包
6.按下F5,选择驱动编译,
插入下列代码实现内核的进程创建
#include "windows.h"#include "winioctl.h"#include "stdio.h"#include "../inc/ioctls.h"#define SYMBOL_LINK "\\\\.\\ProcMon"//#define SYMBOL_LINK "\\\\.\\slNTProcDrv"int main(){CALLBACK_INFO cbkinfo, cbktemp = {0};// 打开驱动设备对象HANDLE hDriver = ::CreateFile(SYMBOL_LINK,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if (hDriver == INVALID_HANDLE_VALUE){printf("打开驱动设备对象失败!\n");return -1;}// 打开内核事件对象HANDLE hProcessEvent = ::OpenEventW(SYNCHRONIZE, FALSE, EVENT_NAME);while (::WaitForSingleObject(hProcessEvent, INFINITE)){DWORDdwRet;BOOLbRet;bRet = ::DeviceIoControl(hDriver,IOCTL_PROC_MON,NULL,0,&cbkinfo,sizeof(cbkinfo),&dwRet,NULL);if (bRet){if (cbkinfo.hParentId != cbktemp.hParentId || \cbkinfo.hProcessId != cbktemp.hProcessId || \cbkinfo.bCreate != cbktemp.bCreate){if (cbkinfo.bCreate){printf("有进程被创建,PID = %d\n", cbkinfo.hProcessId);} else{printf("有进程被终止,PID = %d\n", cbkinfo.hProcessId);}cbktemp = cbkinfo;}} else{printf("\n获取进程信息失败!\n");break;}}::CloseHandle(hDriver);return 0;}