2013-11-22 6 views
5

Il seguente codice funziona bene in modalità utente:Si tratta di un grosso bug nell'implementazione di tolower in 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 
} 

Tuttavia, se siamo in modalità kernel, n sarà uguale 0x7f71 !!!

Il codice di esempio più semplice:

#include <ntifs.h> 

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

    return 0; 
} 

È questo un grande errore nella realizzazione di tolower in ntoskrnl.exe?

+3

Penso che significhi solo che si hanno impostazioni locali diverse nella modalità kernel. Prova invece a usare 'tolower_l()'. –

+0

Sembra che stia facendo solo una minuscola ASCII sui 7 bit più bassi: 0x51 -> 0x71. –

+1

'tolower()' non può funzionare con unicode. Usa le impostazioni locali correnti per trovare la lettera minuscola corrispondente. C99 ha 'towlower()', probabilmente può aiutare. – JIghtuse

risposta

5

tolower(int c) è definito solo per numeri interi c, che sono EOF o rappresentabili come un carattere senza segno. 0x7f51 non è né l'uno né l'altro. Pertanto, il comportamento di tolower(0x7f51) non è definito.

+0

Hmm. Mi chiedo se ci sono implementazioni dove 'char' è 16+ bit e hanno implementato' tolower() '? Certamente non comune. – chux

1

tolower() è progettato per caratteri ANSI, non per Unicode. Le impostazioni internazionali del programma C ne influenzano il comportamento. È meglio usare le funzioni di conversione specifiche di Windows nel kernel NT.