Windows内核安全 ---串口过滤驱动(3) 相关知识总结

时间:2021-01-20 04:52:26

 

1、  内核中字符串的用法

在Windows内核环境不要使用printf之类的字符串处理函数,一定要是使用内核已经定义了相应API的函数来处理。

// Step1
WCHAR          wName[32];
UNICODE_STRING strName;
ULONG          id = 1;

// Step2 初始化WCHAR STRING
status = RtlStringCchPrintfW(
                wName,
                32*sizeof(WCHAR),
                L"\\Device\\Serial%d",
                id);
                
// Step3 将初始化完了的WCHAR 赋值到UNICODE_STRING中
RtlInitUnicodeString(&strName, wName);

按照上述三步初始化一个UNICODE_STRING,这是一个结构体,可以从MSDN中查它的相关结构,由于驱动相关的书籍并不是很多,所以需要多查MSDN,有问题多想一下。如果上述三步没有看明白,那就把C语言处理字符串相关的章节看看。

 

2、  内核驱动的架构

通过前两篇我们看见了过滤驱动可以截取对应功能驱动的内容,但是为什么可以截取,这个和Windows驱动的架构是有关系的,如下图

Windows内核安全 ---串口过滤驱动(3) 相关知识总结

在驱动栈中,Windows提供上层和下层过滤驱动的位置,这种类型的驱动可以有多个也可以没有,在我们串口过滤驱动的例子中就是属于上层过滤驱动,这两种类型的驱动可以实现的功能也是有差别的,下层过滤驱动可以用来过滤下层功能驱动返回的数据,解决下层设备产生的问题,而上层过滤驱动则可以解决上层应用发下的数据,将这些数据截取后处理,模拟上层应用数据。

所以过滤驱动在Windows系统内核使用的范围很广泛,例如USB转串口中就使用了一个UpperFilter,将USB转成一个COM设备,还有一些文件系统的过滤驱动,安全软件也会使用过滤驱动防范病毒等。

过滤驱动可以过滤某个设备或者某一类设备或者从总线端直接进行过滤处理,在串口过滤(2)中示范的就是通过串口类去过滤该类设备,并从中获取信息,其实也可以将设备的ID信息放在inf中,通过过滤这个设备去处理。

 

3、  结构体Device_Extension

这个结构体内容是有驱动开发者自己定义的,在创建DeviceObject的时候,它会被放置到对应的位置,而我们在处理驱动的例程中都可以获取设备对象,这样就保证我们可以从DeviceExtension中获取我们所需要的参数,例如设备名称、相关的内核事件、内核所需要的一些参数、注册表信息,等等。这个结构体的存在贯穿整个驱动的运行过程,一定要好好使用。