Dela via


Hantera buffrade data

Flera av nätverksproviderfunktionerna har adressen och storleken på en buffert där funktionen placerar en datastruktur i variabel storlek.

I varje fall är den mekanism som används samma. Anroparen allokerar en buffert och skickar dess adress till funktionen. Den skickar också adressen till en DWORD- som anger buffertens storlek i byte.

Funktionen kopierar sedan så mycket av den begärda datastrukturen som möjligt till bufferten. Om alla data passar in i bufferten returnerar funktionen WN_SUCCESS. Om data inte passar in i bufferten kan data lämnas ofullständiga och funktionen anger WN_MORE_DATA fel. I båda fallen ställs DWORD, som anger buffertens storlek, in till det antal bytes som faktiskt krävs av datastrukturen. På så sätt, om bufferten som skickades in var för liten och funktionen misslyckades, kan anroparen allokera en ny buffert av den nödvändiga storleken och anropa funktionen igen.

När datastrukturerna som returneras innehåller strängar med variabel längd innehåller de enskilda datastrukturerna vanligtvis pekare till dessa strängar. Själva strängarna bör också placeras i bufferten. Det är dock viktigt att placera dem i slutet av bufferten. Annars kommer de att göra indexering till Nth-strukturen omöjlig. Med andra ord finns alla strukturer sammanhängande i början av bufferten. Pekare till strängar eller variabellängdsdata måste vara faktiska pekare, inte förskjutningar till bufferten.

När en buffert används för att skicka in och returnera data som endast består av strängar ska DWORD- som anger buffertens storlek anges till det totala antalet tecken som får plats i dessa strängar, inte till antalet byte.