Perché è necessario Usare Il Tuok
I driver in modalità kernel devono convalidare le dimensioni di qualsiasi buffer di I/O passato da un'applicazione in modalità utente. Se un'applicazione a 32 bit passa un buffer contenente i tipi di dati di precisione del puntatore a un driver a 64 bit e non viene eseguita alcuna operazione di avvio, il driver prevede che il buffer sia più grande di quello effettivamente. Ciò è dovuto al fatto che la precisione del puntatore è a 32 bit in Microsoft Windows a 32 bit e 64 bit in Windows a 64 bit. Si consideri ad esempio la definizione di struttura seguente:
typedef struct _DRIVER_DATA
{
HANDLE Event;
UNICODE_STRING ObjectName;
} DRIVER_DATA;
In Windows a 32 bit, le dimensioni della struttura DRIVER_DATA sono di 12 byte. Questa tabella mostra le dimensioni dei membri membro Event e ObjectName della struttura DRIVER_DATA:
Evento | ObjectName (lunghezza USHORT) | ObjectName (lunghezza massima USHORT) | ObjectName (buffer PWSTR) |
---|---|---|---|
32 bit | 16 bit | 16 bit | 32 bit |
(4 byte) | (2 byte) | (2 byte) | (4 byte) |
In Windows a 64 bit, le dimensioni della struttura DRIVER_DATA sono pari a 24 byte. I 4 byte di spaziatura interna della struttura sono necessari in modo che il membro Buffer possa essere allineato su un limite di 8 byte.
Evento | ObjectName (lunghezza USHORT) | ObjectName (lunghezza massima USHORT) | Vuoto (spaziatura interna struttura) | ObjectName (buffer PWSTR) |
---|---|---|---|---|
64 bit | 16 bit | 16 bit | 32 bit | 64 bit |
(8 byte) | (2 byte) | (2 byte) | (4 byte) | (8 byte) |
Se un driver a 64 bit riceve 12 byte di DRIVER_DATA quando previsto 24 byte, la convalida delle dimensioni avrà esito negativo. Per evitare questo problema, il driver deve rilevare se una struttura di DRIVER_DATA è stata inviata da un'applicazione a 32 bit e, in tal caso, averlo eseguito correttamente prima di eseguire la convalida.
Ad esempio, è possibile definire una versione del DRIVER_DATA struttura precedente come indicato di seguito:
typedef struct _DRIVER_DATA32
{
VOID *POINTER_32 Event;
UNICODE_STRING32 ObjectName;
} DRIVER_DATA32;
Poiché contiene solo tipi di dati a precisione fissa, questa nuova struttura è la stessa dimensione in Windows a 32 bit e windows a 64 bit.
Evento | ObjectName (lunghezza USHORT) | ObjectName (lunghezza massima USHORT) | ULONG Buffer |
---|---|---|---|
32 bit | 16 bit | 16 bit | 32 bit |
(4 byte) | (2 byte) | (2 byte) | (4 byte) |