摘要:这两个函数不是返回该段内存是否可读写,而是当不可读写的时候引发一个异常(Exception)。这个异常需要用到微软的编译器提供的"结构化异常"处理变法。"结构化异常"机制会轻松的检测到这种异常进而做出相应的异常处理/************************************************************************* 函数名称:ProbeForRead* 功能描述:检查该内存是否可读* 参数列表: Address:血药被检查的内存的地址 Length:需要被检查的内存的长度,单位是字节 Alignment:描.
阅读全文
随笔分类 - windows Driver
摘要:/************************************************************************* 返回状态值*DDK大部分返回值类型是NTSTATUS类型。查看DDK.h文件,可以看到:*************************************************************************/typedef LONG NTSTATUS;//NTSTATUS就是一个32位的整数,其每位有着不同的含义在执行为内核函数后,应该查看该函数的返回状态如果状态码高位为0,无论其它位置是否设置,该状态码代表成功绝对不
阅读全文
摘要:/************************************************************************* 数据类型定义* c语言的定义 DDK中的定义* void VOID* char CHAR* short SHORT* long LONG* wchar_t WCHAR* ...
阅读全文
摘要:分配内核函数/************************************************************************* 函数名称:ExAllocatePool* 功能描述:分配内核内存* 参数列表: PoolType:是个枚举变量 NonPagedPool:分配非分页内存 PagedPool:分配分页内存 NonPagedPoolMustSucceed:指定分配非分页内存,必须成功 DontUseThisType:未指定 ...
阅读全文
摘要:注意:LIST_ENTRY ListEntry; //LIST_ENTRY需要作为_MYDATASTRUCT结构体的一部分判断链表是否为空IsListEmpty(&head)从首部插入链表InsertHeadList(&linkListHead, &pData->ListEntry);从尾部插入链表InsertTailList(&linkListHead, &pData->ListEntry);从首部删除链表PLIST_ENTRY pEntry = RemoveHeadList(&linkListHead);从尾部删除链表Remove
阅读全文
摘要:设备对象用于保存设备特征和状态的相关信息。一个设备对象表示一个逻辑的、虚拟的或物理的设备,设备对象的I/O请求由一个驱动对象操控着。每一个内核模式的驱动必须创建设备对象,它通过调用IoCreateDevice函数一次或多次来创建。设备对象用结构体DEVICE_OBJECT表示。每个设备对象有一个指针(NextDevice)指向下一个设备对象,从而形成一个设备对象链表。该链表的第一个设备是由驱动对象结构体中的DeviceObject成员指明的。设备对象结构体DEVICE_OBJECT的具体定义如下:typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_A
阅读全文
摘要:typedef struct{PDEVICE_OBJECT DeviceObject; //指向驱动程序创建的设备对象PUNICODE_STRING HardwareDatabase; //记录的是设备的硬件数据库名,这里同样用Unicode字符串记录PFAST_IO_DISPATCH FastIoDispatch;//文件驱动中用到的派遣函数PDRIVER_INITIALIZE DriverInit;//指向DriverEntry函数的,这是通过IO管理器来建立的。PDRIVER_STARTIO DriverStartIo;//记录StartIO例程的函数地址,用于串行化操作PDRIVER_
阅读全文
摘要:// LoadNTDriver.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include #include #include #define DRIVER_NAME TEXT("HelloDDK")#define DRIVER_PATH TEXT("..\\Driver Debug\\HelloDDK.sys")/************************************************************************* 函数名称:Loa
阅读全文
摘要:HelloWDM.h#pragma once#ifdef __cplusplusextern "C"{#endif#include <ntddk.h>#ifdef __cplusplus};#endif#define PAGEDCODE code_seg("PAGE")#define LOCKEDCODE code_seg()#define INITCODE code_seg("INIT")#define PAGEDDATA data_seg("PAGE")#define LOCKEDDATA data
阅读全文
摘要:HelloDDK.h#pragma once#ifdef __cplusplusextern "C"{#endif#include <ntddk.h>#ifdef __cplusplus};#endif#define PAGEDCODE code_seg("PAGE")#define LOCKEDCODE code_seg()#define INITCODE code_seg("INIT")#define PAGEDDATA data_seg("PAGE")#define LOCKEDDATA data
阅读全文
摘要:<?xml version="1.0" encoding="utf-8"?><Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ImportGroup Label="PropertySheets" /> <PropertyGroup Label="UserMacros" /> <PropertyG
阅读全文
摘要:1、文件->新建->项目->VisualC++->空项目名称:Driver2、生成->配置管理器活动解决方案配置:新建名称:DriverDebug从此处复制设置:Debug3、视图->属性管理器展开刚配置的DriverDebug|Win32->右击->添加新项目属性表名称:driverpropertyt4、右击driverpropertyt->属性4.1、C/C++ 常规 调试信息格式 程序数据库(/Zi)4.2、C/C++ 预处理器 预处理器定义 WIN32=100 ...
阅读全文
摘要:VS2008环境编译驱动A、VC9驱动编译配置B、VC9集成环境下编译驱动一、新建一个空的win32控制台程序1、选(文件→新建→项目→VisualC++项目→win32→win32控制台项目)创建一个填写上名称event然后按确定在弹出的win32应用程序向导里选应用程序设置→附加选项勾选空项目→完成。二选项目菜单→添加现有项→添加所有驱动相关的*.h,*.c,*.cpp,*.rc之类的文件。三、选工具(T)→选项(O)....→项目→VC++目录→1、在可执行文件目录中添加:D:\WINDDK\3790.1830\BIN\X862、在包含文件目录添加如下路径D:\WINDDK\3790.1
阅读全文
摘要:VS2003驱动开发环境配置A、VS2003驱动编译配置B、VS2003集成环境下编译驱一、新建一个空的win32控制台程序1、选(文件→新建→项目→VisualC++项目→win32→win32控制台项目)创建一个填写上名称event然后按确定在弹出的win32应用程序向导里选应用程序设置→附加选项勾选空项目→完成。二选项目菜单→添加现有项→添加所有驱动相关的*.h,*.c,*.cpp,*.rc之类的文件。三、选工具(T)→选项(O)....→项目→VC++目录→1、在可执行文件目录中添加:D:\WINDDK\3790.1830\BIN\X862、在包含文件目录添加如下路径D:\WINDD.
阅读全文
摘要:手动加载NT式驱动(非工具)A、观察注册表B、手动运行驱动C、手动停止驱动运行 regedit.exeHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ServicesImagePath \??\G:\驱动教程\018_读出SSDT表当前函数地址\mini_ddk\sys\i386\DDKHelloWorld.sys"DisplayName"="DDKHelloWorld""Type"=dword:00000001 //1表示载入驱动"Start"=dword:00000003
阅读全文
摘要:NT式驱动的卸载A、卸载驱动流程B、内核函数DeleteServiceC、内核函数ControlServiceD、构建UnLoadSys函数E、测试并查看调试信息一、卸载驱动流程1、用OpenSCManager函数打开服务控制管理器,取得SCM句柄,如果返回NULL,则结束,否则继续2.//hSCM2、用OpenService打开相应的服务,如果返回NULL,则结束,否则继续3.hSerVice3、用ControlService停止驱动服务,如果返回NULL,只有重新启动才能,再动态加载。4、用DeleteService动态卸载驱动程序,如果返回NULL,则打印出错调试信息,否则打印成功信息。
阅读全文
摘要:NT式驱动的安装A、OpenSCManagerB、CreateServiceC、OpenServiceD、StartServiceE、CloseServiceHandleF、集成到loadNTDriver函数#include<winsvc.h>正常加载驱动的步骤如下:1、调用OpenSCManager,打开SCM管理器。如果返回NULL,则返回失败,否则继续下一步;2、调用CreateService创建服务,如果用GetLastError获取的返回值为ERROR_IO_PENDING,说明服务已经创建过,此时用OpenService打开此服务.3、调用StartService开启服
阅读全文
摘要:1,打开系统的testsigning模式,使得非权威CA发放的签名可以使用bcdedit /set testsigning on (XP64:在boot.ini里面添加/testsigning)2,做一个签名证书出来。MakeCert –r –pe –ss PrivateCertStore –n CN=tao test.cer3,把证书加进本机信任根CA中去。CertMgr -add test.cer -s -r LocalMachine root4,给驱动签名。Signtool sign /v /s PrivateCertStore /n tao HelloDDK.sys或者直接关闭数字签.
阅读全文