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.
V operačním systému se systémem NT jsou ovladače vícevláknové; mohou současně přijímat více vstupně-výstupních požadavků z různých vláken. Při návrhu ovladače musíte předpokládat, že bude spuštěn v systému SMP, a přijmout příslušná opatření k zajištění integrity dat.
Konkrétně platí, že pokaždé, když ovladač změní data globálního objektu nebo objektu souboru, musí použít zámek nebo vzájemně uzamčenou sekvenci, aby se zabránilo vzájemné výlučnosti.
Při odkazování na globální data nebo data specifická pro objekty souboru dochází k podmínce souběhu.
V následujícím fragmentu kódu může dojít k soutěži podmínek, pokud ovladač přistupuje ke globálním datům v Data.LpcInfo:
PLPC_INFO pLpcInfo = &Data.LpcInfo; //Pointer to global data
...
...
// This saved pointer may be overwritten by another thread.
pLpcInfo->LpcPortName.Buffer = ExAllocatePool(
PagedPool,
arg->PortName.Length);
Více vláken, která vstupují do tohoto kódu jako výsledek volání IOCTL, může způsobit únik paměti, protože ukazatel je přepsán. Aby se tomuto problému zabránilo, ovladač by měl při změně globálních dat použít rutiny ExInterlockedXxx nebo nějaký typ zámku. Požadavky řidiče určují přijatelné typy zámků. Další informace naleznete v tématu Spin Locks, Kernel Dispatcher Objects a ExAcquireResourceSharedLite.
Následující příklad se pokouší upravit specifickou vyrovnávací paměť souboru (Endpoint-LocalAddress>) tak, aby obsahovala adresu koncového bodu:
Endpoint = FileObject->FsContext;
if ( Endpoint->LocalAddress != NULL &&
Endpoint->LocalAddressLength <
ListenEndpoint->LocalAddressLength ) {
FREE_POOL (Endpoint->LocalAddress,
LOCAL_ADDRESS_POOL_TAG
);
Endpoint->LocalAddress = NULL;
}
if ( Endpoint->LocalAddress == NULL ) {
Endpoint->LocalAddress =
ALLOCATE_POOL (NonPagedPool,
ListenEndpoint->LocalAddressLength,
LOCAL_ADDRESS_POOL_TAG);
}
V tomto příkladu může dojít k závodní podmínce při přístupu k objektu souboru. Vzhledem k tomu, že ovladač neudržuje žádné zámky, mohou tuto funkci zadat dva požadavky na stejný objekt souboru. Výsledkem mohou být odkazy na uvolněnou paměť, více pokusů o uvolnění stejné paměti nebo úniky paměti. Aby se těmto chybám zabránilo, měly by být dva příkazy if uzavřeny do zámku otáčení.