Varför thunking är nödvändigt

Drivrutiner i kernelläge måste verifiera storleken på en I/O-buffert som skickas från ett program i användarläge. Om ett 32-bitarsprogram skickar en buffert som innehåller datatyper med pekarprecision till en 64-bitarsdrivrutin, och ingen thunking sker, förväntar sig drivrutinen att bufferten är större än den faktiskt är. Detta beror på att pekarprecision är 32 bitar på 32-bitars Microsoft Windows och 64 bitar på 64-bitars Windows. Tänk till exempel på följande strukturdefinition:

typedef struct _DRIVER_DATA
{
    HANDLE           Event;
    UNICODE_STRING   ObjectName;
} DRIVER_DATA;

I 32-bitars Windows är storleken på DRIVER_DATA struktur 12 byte. Den här tabellen visar storleken på eventmedlemmen och ObjectName-medlemmarna i DRIVER_DATA-strukturen:

Evenemang ObjectName (USHORT-längd) ObjectName (USHORT Maximum Length) ObjectName (PWSTR Buffer)
32 bit 16 bit 16 bit 32 bitar
(4 byte) (2 byte) (2 byte) (4 byte)

I 64-bitars Windows är storleken på den DRIVER_DATA strukturen 24 byte. (4 byte strukturutfyllnad krävs så att buffertmedlemmen kan justeras på en gräns på 8 byte.)

Evenemang ObjektNamn (Längd i USHORT) ObjectName (USHORT Maximal längd) Tom (strukturutfyllnad) ObjectName (PWSTR Buffer)
64 bitar 16 bit 16 bit 32 bitar 64 bitar
(8 byte) (2 byte) (2 byte) (4 byte) (8 byte)

Om en 64-bitarsdrivrutin tar emot 12 byte av DRIVER_DATA när den förväntade sig 24 byte misslyckas storleksverifieringen. För att förhindra detta måste drivrutinen identifiera om en DRIVER_DATA struktur har skickats av ett 32-bitarsprogram och i så fall dunka in den på rätt sätt innan valideringen utförs.

En thunked-version av ovanstående DRIVER_DATA struktur kan till exempel definieras på följande sätt:

typedef struct _DRIVER_DATA32
{
    VOID *POINTER_32   Event;
    UNICODE_STRING32   ObjectName;
} DRIVER_DATA32;

Eftersom den endast innehåller datatyper med fast precision är den här nya strukturen samma storlek på 32-bitars Windows och 64-bitars Windows.

Evenemang ObjectName (USHORT-längd) ObjectName (USHORT Maximum Length) ULONG-buffert
32 bit 16 bit 16 bit 32 bit
(4 byte) (2 byte) (2 byte) (4 byte)