以下代码在用户模式下可以正常工作:

#include <stdio.h>
#include <ctype.h>

int main()
{
    //
    // 0x7f51 is the unicode code of Chinese character '网'
    //
    int n = tolower(0x7f51); // n will equal 0x7f51
}

但是,如果我们处于内核模式,n将等于0x7f71 !!!

最简单的示例代码:
#include <ntifs.h>

ULONG NTAPI DriverEntry(PDRIVER_OBJECT, PUNICODE_STRING)
{
    int n = tolower(0x7f51); // n will equal 0x7f71 !!!

    return 0;
}

这是ntoskrnl.exe中tolower的实现中的大错误吗?

最佳答案

tolower(int c) 仅为EOF或可表示为无符号字符的整数c定义。 0x7f51都不是。因此,tolower(0x7f51)的行为是不确定的。

08-16 06:22