我有一个NDIS 6过滤器驱动程序。我需要在IRQL = case-insensitive
时以DISPATCH_LEVEL
方式比较两个NDIS_STRING。我知道RtlEqualUnicodeString
函数可以case-insensitive
方式比较字符串。但它只能在PASSIVE_LEVEL
调用。
所以我必须使用基本的内存复制方式编写自己的函数。我发现我的函数运行不正常,因为我的一些用户抱怨该函数返回FALSE
时它应该返回TRUE
。所以我的代码中应该有一些错误。但我自己并没有找到它。
BOOLEAN
NPF_EqualAdapterName(
PNDIS_STRING s1,
PNDIS_STRING s2
)
{
int i;
BOOLEAN bResult;
TRACE_ENTER();
if (s1->Length != s2->Length)
{
IF_LOUD(DbgPrint("NPF_EqualAdapterName: length not the same, s1->Length = %d, s2->Length = %d\n", s1->Length, s2->Length);)
TRACE_EXIT();
return FALSE;
}
for (i = 0; i < s2->Length / 2; i ++)
{
if (s1->Buffer[i] >= L'A' && s1->Buffer[i] <= L'Z')
{
s1->Buffer[i] += (L'a' - L'A');
}
if (s2->Buffer[i] >= L'A' && s2->Buffer[i] <= L'Z')
{
s2->Buffer[i] += (L'a' - L'A');
}
}
bResult = RtlEqualMemory(s1->Buffer, s2->Buffer, s2->Length);
IF_LOUD(DbgPrint("NPF_EqualAdapterName: bResult = %d, s1 = %ws, s2 = %ws\n", i, bResult, s1->Buffer, s2->Buffer);)
TRACE_EXIT();
return bResult;
}
整个代码在这里:https://github.com/nmap/npcap/blob/master/packetWin7/npf/npf/Openclos.c,如果你想知道它。
所以我的问题很简单,上面的代码中是否有任何错误?谢谢!
更新
适配器名称(例如s1
和s2
)是一些GUID,如{1CC605D7-B674-440B-9D58-3F68E0529B54}
。它们可以是大写或小写。所以他们肯定是英语。
使用索引或键的想法是将名称存储在GUID
结构中而不是字符串中。我注意到Windows提供了RtlStringFromGUID
和RtlGUIDFromString
个功能。但是,这两个函数也仅适用于IRQL = PASSIVE_LEVEL
。
我的大部分代码都在DISPATCH_LEVEL
下运行。所以我担心在GUID中存储并不是一个好主意。