minifilter提供的FltGetFileSystemType可以获得对应FLT_INSTANCE或者FLT_VOLUME 对象的设备类型,但是该函数支持的最低平台为
Minimum supported client | Available in starting with Windows Vista. |
因此导致在Server 2003以及XP该驱动会出现启动错误,即在Server 2003 X86对应的DLL中无该函数,驱动加载时报错
解决方案:使用MmGetSystemRoutineAddress去获得函数地址,动态获得函数地址,避免加载驱动时加载该函数对应模块导致加载失败的问题
typedef
NTSTATUS
(*PFltGetFileSystemType) (
__in PVOID FltObject,
__out PFLT_FILESYSTEM_TYPE FileSystemType
);
PFltGetFileSystemType g_FltGetFileSystemType = NULL;
FLT_FILESYSTEM_TYPE
CheckFileSystemType( __in PCFLT_RELATED_OBJECTS FltObjects)
{
FLT_FILESYSTEM_TYPE fsFileSystemType = FLT_FSTYPE_UNKNOWN;
NTSTATUS Status = STATUS_SUCCESS;
if (g_FltGetFileSystemType==NULL)
{
UNICODE_STRING ustrFltGsftFunctionName = RTL_CONSTANT_STRING(L"FltGetFileSystemType");
g_FltGetFileSystemType = (PFltGetFileSystemType) MmGetSystemRoutineAddress(&ustrFltGsftFunctionName);
if (g_FltGetFileSystemType == NULL)
{
return FLT_FSTYPE_UNKNOWN;
}
}
if (g_FltGetFileSystemType!=NULL)
{
Status = g_FltGetFileSystemType((PVOID)FltObjects,&fsFileSystemType);
if (!NT_SUCCESS(Status))
{
return FLT_FSTYPE_UNKNOWN;
}
else
{
return fsFileSystemType;
}
}
return FLT_FSTYPE_UNKNOWN;
}