Share via


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)