2013-11-22 14 views
5

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?

+3

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ế. –

+0

Có vẻ như nó chỉ làm giảm ASCII trên 7 bit thấp nhất: 0x51 -> 0x71. –

+1

'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

Trả lời

5

tolower(int c) được xác định chỉ cho số nguyên c, là EOF hoặc có thể biểu thị dưới dạng một thẻ chưa ký. 0x7f51 là không. Do đó, hành vi của tolower(0x7f51) không được xác định.

+0

Hmm. Tự hỏi nếu có những sự triển khai trong đó 'char' là 16 bit và đã thực hiện' tolower() '? Chắc chắn không phổ biến. – chux

1

tolower() được thiết kế cho các ký tự ANSI, không phải cho Unicode. Cài đặt ngôn ngữ của chương trình C ảnh hưởng đến hành vi của chương trình. Tốt hơn nên sử dụng các chức năng chuyển đổi cụ thể của Windows trong hạt nhân NT.

Các vấn đề liên quan