Gestione dei dati memorizzati nel buffer
Diverse funzioni del provider di rete accettano l'indirizzo e le dimensioni di un buffer in cui la funzione inserisce una struttura di dati di dimensioni variabili.
In ogni caso, il meccanismo usato è lo stesso. Il chiamante alloca un buffer e ne passa l'indirizzo alla funzione. Passa anche l'indirizzo di un DWORD che specifica le dimensioni del buffer, in byte.
La funzione copia quindi la maggior parte della struttura dei dati richiesta che può entrare nel buffer. Se tutti i dati rientrano nel buffer, la funzione restituisce WN_SUCCESS. Se i dati non rientrano nel buffer, i dati potrebbero essere lasciati incompleti e la funzione imposta l'errore WN_MORE_DATA. In entrambi i casi, la DWORD che indica le dimensioni del buffer è impostata sul numero di byte effettivamente richiesti dalla struttura dei dati. In questo modo, se il buffer passato era troppo piccolo e la funzione non è riuscita, il chiamante può allocare un nuovo buffer delle dimensioni necessarie e chiamare di nuovo la funzione.
Quando le strutture di dati restituite includono stringhe a lunghezza variabile, le singole strutture di dati in genere contengono puntatori a queste stringhe. Anche le stringhe devono essere posizionate all'interno del buffer. Tuttavia, è importante inserirli alla fine del buffer. In caso contrario, renderanno impossibile l'indicizzazione alla Nesima struttura. In altre parole, tutte le strutture si trovano in modo contiguo all'inizio del buffer. I puntatori a stringhe o dati a lunghezza variabile devono essere puntatori effettivi, non offset nel buffer.
Quando un buffer viene utilizzato per passare e restituire dati costituiti solo da stringhe, la DWORD che specifica le dimensioni del buffer deve essere impostata sul numero totale di caratteri che verranno inseriti in queste stringhe, non sul numero di byte.