Mengisolasi Kode yang Dapat Dipanggil Kembali

Rutinitas yang menggunakan kunci putar tidak dapat di-paged. Namun, dalam beberapa kasus Anda dapat mengisolasi operasi yang memerlukan kunci putaran dalam rutinitas terpisah yang tidak akan disertakan di bagian yang dapat di-pageable.

Misalnya, pertimbangkan fragmen berikut:

//  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 ); 
} 

Rutinitas sebelumnya dapat dibuat dapat di-pageable (menghemat sekitar 160 byte) dengan memindahkan beberapa baris kode yang mereferensikan kunci putar ke dalam rutinitas terpisah.

Selain itu, ingatlah bahwa kode driver tidak boleh ditandai sebagai pageable jika memanggil rutinitas dukungan KeXxx , seperti KeReleaseMutex atau KeReleaseSemaphore, di mana parameter Wait diatur ke TRUE. Panggilan seperti itu kembali dengan IRQL pada DISPATCH_LEVEL.