Control de datos almacenados en búfer
Varias de las funciones del proveedor de red toman la dirección y el tamaño de un búfer en el que la función coloca una estructura de datos de tamaño variable.
En cada caso, el mecanismo utilizado es el mismo. El autor de la llamada asigna un búfer y pasa su dirección a la función. También pasa la dirección de un DWORD que especifica el tamaño del búfer, en bytes.
A continuación, la función copia la mayor parte de la estructura de datos solicitada como puede en el búfer. Si todos los datos caben en el búfer, la función devuelve WN_SUCCESS. Si los datos no caben en el búfer, los datos se pueden dejar incompletos y la función establece el error WN_MORE_DATA. En cualquier caso, el DWORD que indica el tamaño del búfer se establece en el número de bytes que realmente requiere la estructura de datos. De este modo, si el búfer pasado era demasiado pequeño y se produjo un error en la función, el autor de la llamada puede asignar un nuevo búfer del tamaño necesario y volver a llamar a la función.
Cuando las estructuras de datos devueltas incluyen cadenas de longitud variable, las estructuras de datos individuales suelen contener punteros a estas cadenas. Las propias cadenas también deben colocarse dentro del búfer. Sin embargo, es importante colocarlos al final del búfer. De lo contrario, hará que la indexación a la estructura Nth sea imposible. En otras palabras, todas las estructuras se encuentran de forma contigua al principio del búfer. Los punteros a cadenas o datos de longitud variable deben ser punteros reales, no desplazamientos en el búfer.
Cuando se usa un búfer para pasar y devolver datos que constan solo de cadenas, el DWORD que especifica el tamaño del búfer debe establecerse en el número total de caracteres que caben en estas cadenas, no en el número de bytes.