Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Det går inte att bläddra i en rutin som använder ett spinnlås. I vissa fall kan du dock isolera de åtgärder som kräver ett spinnlås i en separat rutin som inte tas med i den sidbara delen.
Tänk till exempel på följande fragment:
// PAGED_CODE();
KeInitializeEvent( &event, NotificationEvent, FALSE );
irp = IoBuildDeviceIoControlRequest( IRP_MJ_DEVICE_CONTROL,
DeviceObject,
(PVOID) NULL,
0,
(PVOID) NULL,
0,
FALSE,
&event,
&ioStatus );
if (irp) {
irpSp = IoGetNextIrpStackLocation( irp );
irpSp->MajorFunction = IRP_MJ_FILE_SYSTEM_CONTROL;
irpSp->MinorFunction = IRP_MN_LOAD_FILE_SYSTEM;
status = IoCallDriver( DeviceObject, irp );
if (status == STATUS_PENDING) {
(VOID) KeWaitForSingleObject( &event,
Executive,
KernelMode,
FALSE,
(PLARGE_INTEGER) NULL );
}
}
SPINLOCKUSE !
KeAcquireSpinLock( &IopDatabaseLock, &irql );
// Code inside spin lock ...
DeviceObject->ReferenceCount--;
if (!DeviceObject->ReferenceCount && !DeviceObject->AttachedDevice) {
//Unload the driver
.
.
.
} else {
KeReleaseSpinLock( &IopDatabaseLock, irql );
}
Den föregående rutinen kan göras växlingsbar (spara cirka 160 byte) genom att flytta de få kodrader som refererar till ett spinnlås till en separat rutin.
Kom dessutom ihåg att drivrutinskoden inte får markeras som växlingsbar om den anropar någon KeXxx supportrutin, till exempel KeReleaseMutex eller KeReleaseSemaphore, där Wait-parametern är inställd på TRUE. Ett sådant anrop returneras med IRQL vid DISPATCH_LEVEL.