Программирование драйверов Windows


Операции над строками UNICODE_STRING - часть 2


В следующем примере посредником при инициализации UNICODE_STRING выступает тип данных ANSI_STRING (счетная строка однобайтных символов):

ANSI_STRING myNewANSIString; UNICODE_STRING myNewUString; RtlInitAnsiString( &myNewUString, "My second text example." ); RtlAnsiStringToUnicodeString(&myNewUString, &myNewANSIString, TRUE);

Третий параметр, указанный как TRUE, заставляет данную функцию выделять память под буфер двухбайтных символов. Соответственно, по окончании работы с UNICODE_STRING (а в данном случае &#8212 при выходе из текущей функции, поскольку myNewUString определена как локальная переменная) следует выполнить освобождение буфера двухбайтных символов вызовом RtlFreeUnicodeString. To же необходимо проделать и в первом примере. Более того, аналогичное требование и к типу данных ANSI_STRING, для которого следует использовать RtlFreeAnsiString.

Сам тип ANSI_STRING определяется следующим образом (см. ntdef.h):

typedef struct _STRING { USHORT Length; USHORT MaximumLength; PCHAR Buffer; // Здесь 'PCHAR' - просто 'char' указатель } STRING, *PSTRING; typedef STRING ANSI_STRING;

Очевидно, второй способ более трудоемкий, и им редко кто пользуется.

После того как экземпляр UNICODE_STRING получен, над ним можно выполнять разнообразные операции. Предназначенные для этого системные функции описываются ниже.

Таблица 7.33. Прототип вызова RtlAppendUnicodeStringToString

NTSTATUS RtlAppendUnicodeStringToString IRQL &#8212 любой (если это допускает тип памяти буферов двухбайтных символов)
Параметры Объединяет строки UNICODE_STRING
IN OUT PUNICODE_STRING Destination Указатель на строку-получатель
IN OUT PUNICODE_STRING AppendString Указатель на присоединяемую строку
Возвращаемое значение STATUS_SUCCESS &#8212 строка присоединена и длина строки получателя обновлена

STATUS_BUFFER_TOO_SMALL &#8212 слишком мал размер буфера двухбайтных символов строки-получателя

При анализе приведенного выше описания возникает правомерный вопрос: что предпринимать, если объединение строк завершилось неудачей по причине недостаточно большого буфера принимающей строки UNICODE_STRING? Достойного ответа в пакете DDK на этот вопрос просто нет.


Начало  Назад  Вперед