次のコードでは、ユーザーモードで正常に動作します:私たちは、カーネルモードである場合これはntoskrnl.exeのtolowerの実装における大きなバグですか?
#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_l()'を使ってみてください。 –
0x51 - > 0x71のように、最低7ビットでASCIIの小文字を使用しているようです。 –
'tolower()'はユニコードでは動作しません。現在のロケールを使用して対応する小文字を検索します。 C99には 'towlower()'があり、おそらく助けになるでしょう。 – JIghtuse