驱动开发:蓝屏BSOD 0x3B 内存访问错误

mac2025-08-22  7

寻找错误的原因每次都是漫长而艰辛的

这次的0x3B错误是内存访问错误,通过windbg我们很容易定位到了错误语句

LONG search(UNICODE_STRING input) { if (path_num_count > 0) { ULONG left = 0; ULONG right = path_num_count - 1; while (left <= right && right<=path_num_count) { ULONG middle = (left + right) / 2; if (wcscmp(manu[middle].Buffer, input.Buffer)==0)//error code { return 1; } ...省略...

这是一个很平常的二分搜索算法,函数用的也很简单,实在是不像是会出错的地方。 然后我们分析dump文件,输出了一些变量在蓝屏时候的值

16.kd:x86> dt path_num_count Eprocess!path_num_count 0x39c7

16.kd:x86> dt manu Eprocess!manu [500000] “” +0x000 Length : 0 +0x002 MaximumLength : 0 +0x008 Buffer : (null)

可以看出在蓝屏时,manu数组已经被清空了,而仍然走到search函数,因此对比时manu[middle].Buffer内没有任何东西,导致了蓝屏。

此时再看到卸载函数

NTSTATUS EprocessUnload(_In_ FLT_FILTER_UNLOAD_FLAGS Flags) { if (path_num_count > 0) { for (LONG i = path_num_count-1; i>=0; i--) { KStrFreeUni(&manu[i], KSTR_TAG); } } FltCloseCommunicationPort(serverPort); FltUnregisterFilter(gFilterHandle); return STATUS_SUCCESS; }

由于我们的驱动是一个微过滤器,因此在卸载时需要取消过滤器注册和释放内存。而此时我们的卸载函数里是先释放的内存,再取消的过滤。 因此就出现了manu数组的内存已经被释放完了,而过滤却仍在进行。

解决方法很简单,只要交换一下取消过滤和释放内存的顺序就可以了。当然你也可以采取增加标识、增加判断等其他方法。只是以后采用微过滤器编写驱动一定要注意这个方面。

最新回复(0)