Est-ce un gros bogue dans l’implémentation de tolower dans ntoskrnl.exe?

Le code suivant fonctionne correctement en mode utilisateur:

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

Cependant, si nous sums en mode kernel, n sera égal à 0x7f71 !!!

Le code échantillon le plus simple:

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

Est-ce un gros bogue dans l’implémentation de tolower dans ntoskrnl.exe?

tolower(int c) est défini uniquement pour les entiers c , qui sont EOF ou représentent un caractère non signé. 0x7f51 n’est ni l’un ni l’autre. Par conséquent, le comportement de tolower(0x7f51) est indéfini.

tolower () est conçu pour les caractères ANSI, pas pour Unicode. Les parameters régionaux du programme C affectent son comportement. Il est préférable d’utiliser des fonctions de conversion spécifiques à Windows dans le kernel NT.