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


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

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

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

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

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

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