Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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) |