Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Nie można stronicować procedury korzystającej z blokady spin. Jednak w niektórych przypadkach można wyodrębnić operacje wymagające blokady obrotowej w oddzielnej procedurze, która nie zostanie włączona do sekcji pamięci stronicowanej.
Rozważmy na przykład następujący 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 );
}
Poprzednia rutyna mogłaby być stronicowana (oszczędzając około 160 bajtów) poprzez przeniesienie kilku linii kodu odwołujących się do blokady spinlock do osobnej rutyny.
Ponadto należy pamiętać, że kod sterownika nie może być oznaczony jako stronicowalny, jeśli wywołuje jakiekolwiek funkcje pomocnicze KeXxx, takie jak KeReleaseMutex lub KeReleaseSemaphore, gdy parametr Wait jest ustawiony na TRUE. Takie wywołanie jest zwracane przy użyciu języka IRQL w DISPATCH_LEVEL.