Uso dei buffer di memoria

I driver usano in genere buffer di memoria per passare dati da e verso il framework e altri driver o per archiviare le informazioni in locale. In questo argomento vengono descritti gli oggetti di memoria del framework, gli elenchi lookaside, gli elenchi MDL e i buffer locali.

Uso di oggetti di memoria framework

Il framework usa oggetti memoria per descrivere i buffer di memoria ricevuti da e passati al framework da un driver. Ogni oggetto memoria del framework rappresenta un buffer.

Per creare un oggetto memoria, il driver chiama uno dei metodi di oggetto seguenti:

Per ottenere un oggetto memoria che rappresenta i buffer di una richiesta di I/O ricevuta, il driver chiama WdfRequestRetrieveInputMemory e WdfRequestRetrieveOutputMemory. Per altre informazioni sul recupero dei buffer di una richiesta di I/O, vedere Accesso ai buffer dei dati in Framework-Based driver.

Per ottenere l'indirizzo e le dimensioni del buffer di un oggetto memoria, il driver chiama WdfMemoryGetBuffer.

Per spostare i dati nel buffer di un oggetto memoria, il driver chiama WdfMemoryCopyFromBuffer o WdfMemoryCopyToBuffer. Questi metodi oggetto controllano le dimensioni di origine e di destinazione e impediscono errori di sovraccarico del buffer.

Se il driver crea un oggetto memoria chiamando WdfMemoryCreatePreallocated, può successivamente assegnare un buffer diverso all'oggetto memoria chiamando WdfMemoryAssignBuffer.

Quando un driver invia una richiesta di I/O a una destinazione di I/O, in genere passa un buffer di input o output a un metodo oggetto di destinazione I/O del framework. Il driver specifica il buffer passando una struttura WDF_MEMORY_DESCRIPTOR che descrive il buffer o passando un handle di oggetto memoria. I metodi dell'oggetto di destinazione I/O che inviano richieste di I/O in modo sincrono richiedono una struttura di WDF_MEMORY_DESCRIPTOR e metodi che inviano richieste di I/O in modo asincrono richiedono un handle di oggetto memoria.

Per informazioni su quando un buffer di memoria è valido, vedere Memory Buffer Life Cycle.

Uso degli elenchi Lookaside

Se il driver richiederà molti buffer di circa le stesse dimensioni, deve allocarli da un elenco lookaside. Il driver crea un elenco lookaside chiamando WdfLookasideListCreate. Successivamente, il driver può ottenere buffer dall'elenco lookaside chiamando WdfMemoryCreateFromLookaside.

Ogni volta che il driver chiama WdfMemoryCreateFromLookaside, il framework crea un oggetto memoria, ottiene un buffer dall'elenco lookaside e assegna il buffer all'oggetto . Al termine dell'utilizzo di uno di questi oggetti di memoria, il driver chiama WdfObjectDelete, che elimina l'oggetto memoria e restituisce lo spazio del buffer all'elenco lookaside.

Il sistema operativo gestisce le risorse di memoria assegnate all'elenco lookaside. Se il driver richiede un buffer dall'elenco lookaside quando nessuno è disponibile, ad esempio la prima volta che il driver chiama WdfMemoryCreateFromLookaside, il sistema alloca un buffer e lo assegna all'elenco. Quando il driver chiama WdfObjectDelete (e lo spazio del buffer viene restituito all'elenco lookaside), il sistema mantiene il buffer non assegnato nell'elenco finché il driver non lo richiede di nuovo. Il sistema aumenta le dimensioni dell'elenco in base alle esigenze; Ad esempio, i driver che più frequentemente richiedono buffer ricevono elenchi lookaside più grandi. D'altra parte, il sistema potrebbe ridurre il numero di buffer nell'elenco se il driver non li usa tutti.

Uso di MDLs

Alcuni driver usano elenchi di descrittori di memoria (MDLs) per descrivere i buffer. Ad esempio, un driver per un dispositivo DMA (Direct Memory Access) deve passare un MDL al metodo WdfDmaTransactionInitialize , se chiama tale metodo.

Un driver che usa mdls può ottenere un MDL che rappresenta i buffer di una richiesta di I/O ricevuta chiamando WdfRequestRetrieveInputWdmMdl e WdfRequestRetrieveOutputWdmMdl.

La maggior parte dei driver basati su framework non usa mdls.

Allocazione di buffer locali

Un driver che richiede spazio del buffer interno locale che non passerà al framework non deve creare oggetti di memoria per rappresentare i buffer. Il driver può chiamare ExAllocatePoolWithTag per allocare buffer interni. Al termine dell'uso del buffer, il driver deve chiamare ExFreePoolWithTag.

Tuttavia, i driver possono anche usare oggetti di memoria per i buffer locali. Un vantaggio dell'uso dei buffer di memoria, anziché chiamare ExAllocatePoolWithTag, è che il framework elimina automaticamente gli oggetti memoria e i relativi buffer quando viene eliminato l'oggetto padre di ogni oggetto.

Importante

Le DDI di ExAllocatePool descritte in questo argomento sono state deprecate in Windows 10 versione 2004 e sono state sostituite da ExAllocatePool2 e ExAllocatePool3. Per altre informazioni, vedere Aggiornamento delle chiamate ExAllocatePool deprecate a ExAllocatePool2 e ExAllocatePool3.

Allineamento dei buffer

Il driver può usare la funzione WDF_ALIGN_SIZE_UP o WDF_ALIGN_SIZE_DOWN per calcolare una dimensione del buffer allineata a un offset di allineamento specificato. Questo calcolo è utile se il driver deve allocare più buffer contigui, se ogni buffer deve iniziare in corrispondenza di un limite di allineamento degli indirizzi.