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.
Některé ovladače musí manipulovat s objekty předanými volajícími nebo musí zpracovávat dva objekty souboru najednou. Například ovladač modemu může přijímat popisovač objektu události nebo síťový ovladač může přijímat popisovače pro dva různé objekty souboru. Ovladač musí tyto popisovače ověřit. Vzhledem k tomu, že je volající předává, a ne prostřednictvím V/V manažera, nemůže správce vstupně-výstupních operací provádět žádné kontroly ověření.
Například v následujícím fragmentu kódu byl ovladači předán popisovač AscInfo->AddressHandle, ale nebyl ověřen před voláním ObReferenceObjectByHandle:
//
// This handle is embedded in a buffered request.
//
status = ObReferenceObjectByHandle(
AscInfo->AddressHandle,
0,
NULL,
KernelMode,
&fileObject,
NULL);
if (NT_SUCCESS(status)) {
if ( (fileObject->DeviceObject == DeviceObject) &&
(fileObject->FsContext2 == TRANSPORT_SOCK) ) {
I když volání ObReferenceObjectByHandle proběhne úspěšně, kód se nepodaří zajistit, aby vrácený ukazatel odkazoval na objekt souboru, a důvěřuje volajícímu, že předá správné informace.
I když jsou všechny parametry volání ObReferenceObjectByHandle správné a volání proběhne úspěšně, ovladač může stále získat neočekávané výsledky, pokud objekt souboru není určen pro jeho ovladač. V následujícím fragmentu kódu ovladač předpokládá, že úspěšné volání vrátí ukazatel na objekt souboru, který očekával:
status = ObReferenceObjectByHandle (
AcpInfo->Handle,
0L,
DesiredAccess,
*IoFileObjectType,
Irp->RequestorMode,
(PVOID *)&AcpEndpointFileObject,
NULL);
if ( !NT_SUCCESS(status) ) {
goto complete;
}
AcpEndpoint = AcpEndpointFileObject->FsContext;
if ( AcpEndpoint->Type != BlockTypeEndpoint )
I když ObReferenceObjectByHandle vrátí ukazatel na objekt souboru, ovladač nemá žádnou záruku, že ukazatel odkazuje na objekt souboru, který očekával. V tomto případě by ovladač měl před přístupem k datům specifických pro ovladač ověřit ukazatel na acpEndpointFileObject-FsContext>.
Aby se zabránilo takovým problémům, ovladač by měl zkontrolovat platná data následujícím způsobem:
Zkontrolujte typ objektu a ujistěte se, že je to, co ovladač očekává.
Ujistěte se, že požadovaný přístup je vhodný pro typ objektu a požadované úkoly. Pokud váš ovladač například provádí rychlé kopírování souborů, ujistěte se, že popisovač má povolen přístup pro čtení.
Nezapomeňte zadat správný režim přístupu (UserMode nebo KernelMode) a že režim přístupu je kompatibilní s požadovaným přístupem.
Pokud ovladač očekává popisovač objektu souboru, který samo vytvořilo, ověřte popisovač vůči objektu zařízení nebo ovladači. Dávejte ale pozor, abyste neporušili filtry, které odesílají vstupně-výstupní požadavky na podivná zařízení.
Pokud ovladač podporuje více druhů objektů souborů (například řídicí kanály, adresní objekty a připojení ovladačů TDI nebo svazků, adresářů a souborů systémů souborů), ujistěte se, že máte způsob, jak je odlišit.