Windows 内核开发市面上流传的教程基本上都在写 CmRegisterCallback
函数的功能,而 CmRegisterCallbackEx
几乎没有(本人没有见到有描述比较清晰的)。看任何人写的教程都不如看一眼 MSDN 和 Example,跟着微软的例子我详细记录一下这个函数的每个参数,希望可以帮到后面要使用该函数的人,如果大家看到有什么不对的地方请指证,以免我误导他人。
函数原型
NTSTATUS CmRegisterCallbackEx(
_In_ PEX_CALLBACK_FUNCTION Function,
_In_ PCUNICODE_STRING Altitude,
_In_ PVOID Driver,
_In_opt_ PVOID Context,
_Out_ PLARGE_INTEGER Cookie,
_Reserved_ PVOID Reserved
);
参数详解
Function
这个参数不用多说,是回调的函数地址,根据微软的例子直接自己写一份函数把函数名传给这个参数就可以了,与 CmRegisterCallback
函数没什么区别。
Altitude
这是 CmRegisterCallbackEx
函数新增的参数,这个参数在 MSDN 中描述如下:
The Altitude parameter defines the position of the minifilter driver relative to other minifilters in the I/O stack when the minifilter is loaded. Allocation of altitudes to minifilters is managed by Microsoft. For more information about altitudes, see Load Order Groups and Altitudes for Minifilter Drivers.
大致意思是该参数决定了在内核中调用的优先级顺序,我们看微软的 Example 中使用了三个级别(级别的定义),分别是高、中、低:
#define CALLBACK_LOW_ALTITUDE L"380000"
#define CALLBACK_ALTITUDE L"380010"
#define CALLBACK_HIGH_ALTITUDE L"380020"
然后分别以三个级别创建了三个回调函数,目的就是让大家可以看清对注册表监控时的拦截顺序。
Driver
这个参数就是驱动对象的指针,直接传入即可。
Context
该参数可以当作是给回调函数的一个参数指针,可以在外部随意构造,然后在创建回调函数的时候传递进去即可。传递进去后转为 PVOID,在回调函数中再转移成你自己的结构就可以了。
Cookie
与 CmRegisterCallback
函数一样,都是记录了回调函数的传递句柄信息,用一个全局变量保存下来,取消回调时使用。
Reserved
微软保留,这个参数暂时无用,设置为 NULL 即可。