Condividi tramite


Funzione WdfMemoryCreate (wdfmemory.h)

[Si applica a KMDF e UMDF]

Il metodo WdfMemoryCreate crea un oggetto memoria del framework e alloca un buffer di memoria di una dimensione specificata.

Sintassi

NTSTATUS WdfMemoryCreate(
  [in, optional]  PWDF_OBJECT_ATTRIBUTES Attributes,
  [in]            POOL_TYPE              PoolType,
  [in, optional]  ULONG                  PoolTag,
  [in]            size_t                 BufferSize,
  [out]           WDFMEMORY              *Memory,
  [out, optional] PVOID                  *Buffer
);

Parametri

[in, optional] Attributes

Puntatore a una struttura WDF_OBJECT_ATTRIBUTES che contiene attributi di oggetto per il nuovo oggetto memoria. Questo parametro è facoltativo e può essere WDF_NO_OBJECT_ATTRIBUTES.

[in] PoolType

Valore POOL_TYPE tipizzato che specifica il tipo di memoria da allocare.

[in, optional] PoolTag

Tag del pool definito dal driver per la memoria allocata. I debugger visualizzano questo tag. I driver specificano in genere una stringa di caratteri fino a quattro caratteri, delimitata da virgolette singole, in ordine inverso(ad esempio, 'dcba'). Il valore ASCII di ogni carattere del tag deve essere compreso tra 0 e 127. Il debug del driver è più semplice se ogni tag del pool è univoco.

Se PoolTag è zero, il framework fornisce un tag di pool predefinito che usa i primi quattro caratteri del nome del servizio in modalità kernel del driver. Se il nome del servizio inizia con "WDF" (il nome non è distinzione tra maiuscole e minuscole e non include le virgolette), vengono usati i quattro caratteri successivi. Se sono disponibili meno di quattro caratteri, viene usato "FxDr".

Per kmDF versione 1.5 e successiva, il driver può usare il membro DriverPoolTag della struttura WDF_DRIVER_CONFIG per specificare un tag di pool predefinito.

[in] BufferSize

Dimensione non zero specificata, in byte, del buffer.

[out] Memory

Puntatore a una posizione che riceve un handle per il nuovo oggetto memoria.

[out, optional] Buffer

Puntatore a una posizione che riceve un puntatore al buffer associato al nuovo oggetto memoria. Questo parametro è facoltativo e può essere NULL.

Valore restituito

WdfMemoryCreate restituisce STATUS_SUCCESS se l'operazione ha esito positivo. In caso contrario, questo metodo potrebbe restituire uno dei valori seguenti:

Codice restituito Descrizione
STATUS_INVALID_PARAMETER
È stato rilevato un parametro non valido.
STATUS_INSUFFICIENT_RESOURCES
Memoria insufficiente.
 

Per un elenco di altri valori restituiti che il metodo WdfMemoryCreate potrebbe restituire, vedere Errori di creazione dell'oggetto Framework.

Questo metodo potrebbe restituire anche altri valori NTSTATUS.

Commenti

Il metodo WdfMemoryCreate alloca un buffer delle dimensioni specificate dal parametro BufferSize e crea un oggetto di memoria del framework che rappresenta il buffer.

Per ottenere l'indirizzo del buffer, il driver può fornire un valore non NULL per il parametro Buffer della funzione WdfMemoryCreate oppure il driver può chiamare WdfMemoryGetBuffer.

È consigliabile zero memoria per l'allocazione della memoria, in particolare per le allocazioni copiate in una posizione non attendibile (modalità utente, tramite la rete e così via) per evitare la divulgazione di informazioni sensibili. WdfMemoryCreate non inizializza la memoria allocata per impostazione predefinita.

In base al modello di utilizzo del driver della memoria allocata, è consigliabile prendere in considerazione la raccomandazione per i writer di driver:

  • RtlZeroMemory immediatamente dopo aver chiamato WdfMemoryCreate
  • In alternativa, usare un'API di allocazione zero (ExAllocatePool2, ExAllocatePoolZero per la modalità kernel; HeapAlloc con il flag HEAP_ZERO_MEMORY per la modalità utente), seguito da WdfMemoryCreatePreallocated. Poiché il buffer pre-allocato non viene eliminato automaticamente come parte di WDFMEMORY o la relativa eliminazione padre, questo non è l'approccio migliore.

L'oggetto padre predefinito per ogni oggetto memoria è l'oggetto driver del framework che rappresenta il driver che ha chiamato WdfMemoryCreate. Se il driver crea un oggetto memoria usato con un oggetto dispositivo specifico, un oggetto request o un altro oggetto framework, deve impostare l'oggetto padre dell'oggetto memoria in modo appropriato. L'oggetto memoria e il relativo buffer verranno eliminati quando l'oggetto padre viene eliminato. Se non si modifica l'oggetto padre predefinito, l'oggetto memoria e il relativo buffer rimarranno finché il gestore di I/O scarica il driver.

Un driver può anche eliminare un oggetto memoria e il relativo buffer chiamando WdfObjectDelete.

Se BufferSize è minore di PAGE_SIZE, il sistema operativo fornisce al chiamante esattamente il numero di byte richiesti di memoria. Il buffer non è necessariamente allineato alla pagina, ma è allineato al numero di byte specificato dalla costante MEMORY_ALLOCATION_ALIGNMENT in Ntdef.h.

Se BufferSize è PAGE_SIZE o versione successiva, solo per KMDF il sistema alloca un buffer allineato a pagina. Se il parametro PoolType è NonPagedPool, il sistema alloca il numero di pagine necessarie per contenere tutti i byte. Tutti i byte inutilizzati nell'ultima pagina allocata sono essenzialmente sprecati.

Per altre informazioni sugli oggetti di memoria del framework, vedere Uso dei buffer di memoria.

Se il driver specifica PagedPool per PoolType, il metodo WdfMemoryCreate deve essere chiamato in IRQL <= APC_LEVEL. In caso contrario, il metodo può essere chiamato in IRQL <= DISPATCH_LEVEL.

Esempio

Nell'esempio di codice seguente viene creato un oggetto memoria del framework e viene allocato un buffer le cui dimensioni sono WRITE_BUFFER_SIZE. L'oggetto padre della memoria è un oggetto request.

NTSTATUS  status;
WDF_OBJECT_ATTRIBUTES  attributes;
WDFMEMORY  writeBufferMemHandle;
PVOID  writeBufferPointer;

WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
attributes.ParentObject = requestHandle;
status = WdfMemoryCreate(
                         &attributes,
                         NonPagedPool,
                         0,
                         WRITE_BUFFER_SIZE,
                         &writeBufferMemHandle,
                         &writeBufferPointer
                         );

Requisiti

Requisito Valore
Piattaforma di destinazione Universale
Versione KMDF minima 1.0
Versione UMDF minima 2,0
Intestazione wdfmemory.h (include Wdf.h)
Libreria Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF)
IRQL Vedere La sezione Osservazioni.
Regole di conformità DDI DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), ParentObjectCheck(kmdf)

Vedi anche

POOL_TYPE

WDF_OBJECT_ATTRIBUTES

WDF_OBJECT_ATTRIBUTES_INIT

WdfMemoryCreateFromLookaside

WdfMemoryCreatePreallocated

WdfMemoryGetBuffer

WdfObjectDelete