Поделиться через


Обработка буферизированных данных

Некоторые функции поставщика сети принимают адрес и размер буфера, в который функция помещает структуру данных переменной величины.

В каждом случае используется один и тот же механизм. Вызывающий объект выделяет буфер и передает его адрес функции. Он также передает адрес DWORD , указывающий размер буфера, в байтах.

Затем функция копирует в буфер как можно больше запрошенной структуры данных. Если все данные помещаются в буфер, функция возвращает WN_SUCCESS. Если данные не помещаются в буфер, данные могут остаться неполными, а функция задает ошибку WN_MORE_DATA. В любом случае значение DWORD , указывающее размер буфера, равно количеству байтов, которое фактически требуется для структуры данных. Таким образом, если переданный буфер был слишком мал и функция завершилась сбоем, вызывающий объект может выделить новый буфер требуемого размера и снова вызвать функцию.

Если возвращаемые структуры данных содержат строки переменной длины, отдельные структуры данных обычно содержат указатели на эти строки. Сами строки также должны быть помещены в буфер. Однако важно разместить их в конце буфера. В противном случае индексирование в N-й структуре будет невозможным. Другими словами, все структуры расположены непрерывно в начале буфера. Указатели на строки или данные переменной длины должны быть фактическими указателями, а не смещениями в буфере.

Если буфер используется для передачи и возврата данных, состоящих только из строк, параметр DWORD , указывающий размер буфера, должен быть установлен в соответствии с общим количеством символов, которые будут помещаться в этих строках, а не на количество байтов.