Sdílet prostřednictvím


Proč je přemostění nutné

Ovladače režimu jádra musí ověřit velikost jakékoli vstupně-výstupní vyrovnávací paměti předané z aplikace v uživatelském režimu. Pokud 32bitová aplikace předá vyrovnávací paměť obsahující datové typy s přesností ukazatele na 64bitový ovladač a nedojde k žádnému převodu, ovladač očekává, že vyrovnávací paměť bude větší, než je skutečně. Je to proto, že přesnost ukazatele je 32 bitů v 32bitovém systému Microsoft Windows a 64 bitů v 64bitovém systému Windows. Představte si například následující definici struktury:

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

V 32bitovém systému Windows je velikost struktury DRIVER_DATA 12 bajtů. V této tabulce jsou uvedeny velikosti člena události a členů ObjectName struktury DRIVER_DATA:

Událost Název_objektu (délka USHORT) Název_objektu (maximální délka USHORT) ObjectName (PWSTR Buffer)
32 bitů 16 bitů 16 bitů 32 bitů
(4 bajty) (2 bajty) (2 bajty) (4 bajty)

V 64bitovém systému Windows je velikost struktury DRIVER_DATA 24 bajtů. (Jsou vyžadovány 4 bajty odsazení struktury, aby bylo možné člen Buffer zarovnat na 8-byteovou hranici.)

Událost Název_objektu (délka USHORT) Název_objektu (maximální délka USHORT) Prázdný (odsazení struktury) ObjectName (PWSTR Buffer)
64 bitů 16 bitů 16 bitů 32 bitů 64 bitů
(8 bajtů) (2 bajty) (2 bajty) (4 bajty) (8 bajtů)

Pokud 64bitový ovladač obdrží 12 bajtů DRIVER_DATA, pokud očekává 24 bajtů, ověření velikosti se nezdaří. Aby tomu zabránil, musí ovladač zjistit, zda byla struktura DRIVER_DATA odeslána 32bitovou aplikací, a pokud ano, přizpůsobit ji odpovídajícím způsobem před provedením ověření.

Například neúčetná verze výše uvedené struktury DRIVER_DATA by mohla být definována takto:

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

Vzhledem k tomu, že obsahuje pouze datové typy s pevnou přesností, je tato nová struktura ve 32bitovém systému Windows a 64bitovém systému Windows stejná.

Událost Název_objektu (USHORT Délka) Název_objektu (maximální délka USHORT) ULONG Buffer
32 bitů 16 bitů 16 bitů 32 bitů
(4 bajty) (2 bajty) (2 bajty) (4 bajty)