部分代码

#include "my_sys_fun.h"
#ifdef __cplusplus
extern "C"
{
#endif

//驱动加载函数
NTSTATUS DriverEntry(PDRIVER_OBJECT pPDriverObj, PUNICODE_STRING pPuniStr);

//驱动卸载函数
VOID UnLoadDriver(_In_ PDRIVER_OBJECT pPDriverObj);

#ifdef __cplusplus
}
#endif

NTSTATUS RegistryCallback(IN PVOID CallbackContext,
IN PVOID Argument1,
IN PVOID Argument2)
{
//KdPrint(("RegistryCallback Success\r\n"));
return STATUS_SUCCESS;
}

#define REGISTRY_POOL_TAG 'pRE'
typedef struct _CAPTURE_REGISTRY_MANAGER
{
PDEVICE_OBJECT deviceObject;
BOOLEAN bReady;
LARGE_INTEGER registryCallbackCookie;
LIST_ENTRY lQueuedRegistryEvents;
KTIMER connectionCheckerTimer;
KDPC connectionCheckerFunction;
KSPIN_LOCK lQueuedRegistryEventsSpinLock;
ULONG lastContactTime;
} CAPTURE_REGISTRY_MANAGER, *PCAPTURE_REGISTRY_MANAGER;

typedef struct _REGISTRY_EVENT {
REG_NOTIFY_CLASS eventType;
TIME_FIELDS time;
HANDLE processId;
ULONG dataType;
ULONG dataLengthB;
ULONG registryPathLengthB;
/* Contains path and optionally data */
UCHAR registryData[];
} REGISTRY_EVENT, *PREGISTRY_EVENT;

typedef struct _REGISTRY_EVENT_PACKET {
LIST_ENTRY Link;
PREGISTRY_EVENT pRegistryEvent;
} REGISTRY_EVENT_PACKET, *PREGISTRY_EVENT_PACKET;

PCAPTURE_REGISTRY_MANAGER pRegistryManager;
PDEVICE_OBJECT gpDeviceObject;

#pragma INITCODE
NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT pPDriverObj, _In_ PUNICODE_STRING pRegistryPath)
{

//指定卸载函数
pPDriverObj->DriverUnload = (PDRIVER_UNLOAD)UnLoadDriver;
KdPrint(("挂载\r\n"));

NTSTATUS status;
UNICODE_STRING uszDriverString;
PDEVICE_OBJECT pDeviceObject;
RtlInitUnicodeString(&uszDriverString, L"\\DEVICE\\DnfProtectRemove");

status = IoCreateDevice(
pPDriverObj,
sizeof(CAPTURE_REGISTRY_MANAGER),
&uszDriverString,
FILE_DEVICE_UNKNOWN,
0,
FALSE,
&pDeviceObject
);
if (!NT_SUCCESS(status))
{
DbgPrint("RegistryMonitor: ERROR IoCreateDevice -> %08x\n", status);
return status;
}
gpDeviceObject = pDeviceObject;
/* Get the registr manager from the extension of the device */
pRegistryManager = (PCAPTURE_REGISTRY_MANAGER)gpDeviceObject->DeviceExtension;
pRegistryManager->bReady = TRUE;

KeInitializeSpinLock(&pRegistryManager->lQueuedRegistryEventsSpinLock);
InitializeListHead(&pRegistryManager->lQueuedRegistryEvents);

KdPrint(("RegistryCallback = 0x%08X\r\n", RegistryCallback));
KdPrint(("pRegistryManager = 0x%08X\r\n", pRegistryManager));
KdPrint(("&pRegistryManager->registryCallbackCookie = 0x%08X\r\n", &pRegistryManager->registryCallbackCookie));
KdPrint(("pRegistryManager->registryCallbackCookie = 0x%08X\r\n", pRegistryManager->registryCallbackCookie));

status = CmRegisterCallback(RegistryCallback, pRegistryManager, &pRegistryManager->registryCallbackCookie);
if (!NT_SUCCESS(status))
{
KdPrint(("RegistryMonitor: ERROR CmRegisterCallback - %08x\n", status));
return status;
}

KdPrint(("&gpDeviceObject->DeviceExtension = 0x%08X\r\n", &gpDeviceObject->DeviceExtension));
KdPrint(("gpDeviceObject->DeviceExtension = 0x%08X\r\n", gpDeviceObject->DeviceExtension));
KdPrint(("&pRegistryManager = 0x%08X\r\n", &pRegistryManager));

//0xD
return STATUS_SUCCESS;
}

/**
*卸载驱动
**/
#pragma PAGECODE
VOID UnLoadDriver(_In_ PDRIVER_OBJECT pPDriverObj)
{

if (pRegistryManager->bReady == TRUE)
{
CmUnRegisterCallback(pRegistryManager->registryCallbackCookie);
pRegistryManager->bReady = FALSE;
}

while (!IsListEmpty(&pRegistryManager->lQueuedRegistryEvents))
{
PLIST_ENTRY head = ExInterlockedRemoveHeadList(&pRegistryManager->lQueuedRegistryEvents, &pRegistryManager->lQueuedRegistryEventsSpinLock);
PREGISTRY_EVENT_PACKET pRegistryEventPacket = CONTAINING_RECORD(head, REGISTRY_EVENT_PACKET, Link);
ExFreePoolWithTag(pRegistryEventPacket->pRegistryEvent, REGISTRY_POOL_TAG);
ExFreePoolWithTag(pRegistryEventPacket, REGISTRY_POOL_TAG);
}

if (pPDriverObj->DeviceObject != NULL)
{
IoDeleteDevice(pPDriverObj->DeviceObject);
}

KdPrint(("卸载\r\n"));

}

jpg 改 rar

CmRegisterCallback使用方法的更多相关文章

  1. javaSE27天复习总结

    JAVA学习总结    2 第一天    2 1:计算机概述(了解)    2 (1)计算机    2 (2)计算机硬件    2 (3)计算机软件    2 (4)软件开发(理解)    2 (5) ...

  2. mapreduce多文件输出的两方法

    mapreduce多文件输出的两方法   package duogemap;   import java.io.IOException;   import org.apache.hadoop.conf ...

  3. 【.net 深呼吸】细说CodeDom(6):方法参数

    本文老周就给大伙伴们介绍一下方法参数代码的生成. 在开始之前,先补充一下上一篇烂文的内容.在上一篇文章中,老周检讨了 MemberAttributes 枚举的用法,老周此前误以为该枚举不能进行按位操作 ...

  4. IE6、7下html标签间存在空白符,导致渲染后占用多余空白位置的原因及解决方法

    直接上图:原因:该div包含的内容是靠后台进行print操作,输出的.如果没有输出任何内容,浏览器会默认给该空白区域添加空白符.在IE6.7下,浏览器解析渲染时,会认为空白符也是占位置的,默认其具有字 ...

  5. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  6. [C#] C# 基础回顾 - 匿名方法

    C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...

  7. ArcGIS 10.0紧凑型切片读写方法

    首先介绍一下ArcGIS10.0的缓存机制: 切片方案 切片方案包括缓存的比例级别.切片尺寸和切片原点.这些属性定义缓存边界的存在位置,在某些客户端中叠加缓存时匹配这些属性十分重要.图像格式和抗锯齿等 ...

  8. [BOT] 一种android中实现“圆角矩形”的方法

    内容简介 文章介绍ImageView(方法也可以应用到其它View)圆角矩形(包括圆形)的一种实现方式,四个角可以分别指定为圆角.思路是利用"Xfermode + Path"来进行 ...

  9. JS 判断数据类型的三种方法

    说到数据类型,我们先理一下JavaScript中常见的几种数据类型: 基本类型:string,number,boolean 特殊类型:undefined,null 引用类型:Object,Functi ...

随机推荐

  1. C语言也能干大事1

    今天看了个视频,叫C语言也能干大事,写了第一个WIN项目的代码,感觉特别好,就像以前刚刚学会写C语言一样, 然后就恶搞出一个东西,最后的结果就是这个东西退出不了了

  2. Debian上安装Apache+Django全过程

    -->start sudo apt-get install apache2 libapache2-mod-wsgi #https://wiki.debian.org/zh_CN/Apache s ...

  3. ACM/ICPC 之 优先级队列+设置IO缓存区(TSH OJ-Schedule(任务调度))

    一个裸的优先级队列(最大堆)题,但也有其他普通队列的做法.这道题我做了两天,结果发现是输入输出太过频繁,一直只能A掉55%的数据,其他都是TLE,如果将输入输出的数据放入缓存区,然后满区输出,可以将I ...

  4. CCF I'm Stuck!

    问题描述 试题编号: 201312-5 试题名称: I'm stuck! 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一个R行C列的地图,地图的每一个方格可能是'#', ...

  5. mongoDB 3.0以前版本 - 入门指南、示例

    一.准备工作 1. 下载mongoDB 下载地址:http://www.mongodb.org/downloads 选择合适你的版本 相关文档:http://www.mongodb.org/displ ...

  6. JS判断IE版本并在页面显示内容

    <script type="text/javascript"> var isIE = function (ver) { var b = document.createE ...

  7. Swift - UIViewController

    UIViewController类详解: 通过Nib文件初始化 init(nibName nibName: String?, bundle nibBundle: NSBundle?) println( ...

  8. Android之IPC机制

    Android IPC简介 任何一个操作系统都需要有相应的IPC机制,Linux上可以通过命名通道.共享内存.信号量等来进行进程间通信.Android系统不仅可以使用了Binder机制来实现IPC,还 ...

  9. 学习hibernate @Entity该导入哪个包

    1.在@Entity时很容易顺手导入@org.hibernate.annotations.Entity这个包,结果导致了异常.其实应该导入的是@javax.persistence.Entity Alw ...

  10. IDT5V49EE904资料学习

    一.特性: 1.4个内部PLL 2.内部非易失EEPROM. 3.最快400k的I2C串行接口. 4.输入时钟范围:1M—200M. 5.输出时钟范围:4.9k—200M 6.输入晶振参数带有在线可编 ...