在IRQL = DISPATCH_LEVEL时不区分大小写地比较NDIS_STRING?

时间:2016-03-25 01:51:00

标签: c windows driver device-driver ndis

我有一个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,如果你想知道它。

所以我的问题很简单,上面的代码中是否有任何错误?谢谢!

更新

适配器名称(例如s1s2)是一些GUID,如{1CC605D7-B674-440B-9D58-3F68E0529B54}。它们可以是大写或小写。所以他们肯定是英语

使用索引或键的想法是将名称存储在GUID结构中而不是字符串中。我注意到Windows提供了RtlStringFromGUIDRtlGUIDFromString个功能。但是,这两个函数也仅适用于IRQL = PASSIVE_LEVEL

我的大部分代码都在DISPATCH_LEVEL下运行。所以我担心在GUID中存储并不是一个好主意。

0 个答案:

没有答案