Các mã sau hoạt động tốt trong chế độ người dùng:Đây có phải là một lỗi lớn trong việc thực hiện của tolower trong ntoskrnl.exe?
#include <stdio.h>
#include <ctype.h>
int main()
{
//
// 0x7f51 is the unicode code of Chinese character '网'
//
int n = tolower(0x7f51); // n will equal 0x7f51
}
Tuy nhiên, nếu chúng ta đang ở chế độ kernel, n
sẽ bằng 0x7f71
!!!
Mẫu mã đơn giản nhất:
#include <ntifs.h>
ULONG NTAPI DriverEntry(PDRIVER_OBJECT, PUNICODE_STRING)
{
int n = tolower(0x7f51); // n will equal 0x7f71 !!!
return 0;
}
Đây có phải là một lỗi lớn trong việc thực hiện tolower
trong ntoskrnl.exe?
Tôi nghĩ rằng nó chỉ có nghĩa là bạn có cài đặt miền địa phương khác nhau trong chế độ lõi. Hãy thử sử dụng 'tolower_l()' để thay thế. –
Có vẻ như nó chỉ làm giảm ASCII trên 7 bit thấp nhất: 0x51 -> 0x71. –
'tolower()' không thể làm việc với unicode. Nó sử dụng ngôn ngữ hiện tại để tìm chữ thường tương ứng. C99 có 'towlower()', nó có thể có ích. – JIghtuse