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


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


if(NT_SUCCESS(stat)) { // Теперь поле ansiString.Buffer указывает на выделенный буфер, // куда помещена строка ANSI символов, полученная из строки // UNICODE_STRING, изначально находившейся по адресу, куда // указывает переменная ptrToUNICODE_STRING. // Поле ansiStr.Length уже содержит информацию о длине строки. int len= (ansiStr.Length &#62 99? 99: ansiStr.Length); strncpy(str, ansiStr.Buffer, len); str[len+1]=0;

DbgPrint("SZ string = %s(len=%d).", str, len);

// Освобождаем буфер, выделенный под хранение ANSI строки: RtlFreeAnsiString(&ansiStr); }

Заметим, что переменная str будет хранить строку 8-битных символов до выхода из данного программного модуля, поскольку str &#8212 локальная переменная.

Прототип вызова функции RtlUnicodeStringToAnsiString описан в таблице ниже. В том случае, если третий параметр указан как TRUE, то будет выполнено выделение памяти для хранения строки, полученной из строки UNICODE_STRING. Соответственно, по окончании использования строки ANSI_STRING следует освободить числящуюся за драйвером область памяти, что выполняется вызовом RtlFreeAnsiString.

Таблица 7.38. Прототип вызова RtlUnicodeStringToAnsiString

NTSTATUS RtlUnicodeStringToAnsiString IRQL == PASSIVE_LEVEL
Параметры Преобразует информацию строки UNICODE_STRING в строку ANSI_STRING
IN OUT PANSI_STRING ansiStringPtr Указатель на строку ANSI_STRING, которая должна быть получена в результате вызова
IN PUNICODE_STRING Source Указатель на исходную строку UNICODE_STRING

BOOLEAN AllocFlag TRUE &#8212 выделить память под буфер строки ANSI_STRING
Возвращаемое значение STATUS_SUCCESS или код ошибки

Работа с текстом в драйверах случается нечасто, но, тем не менее, следует быть к ней готовым. Например, при работе с файлами.




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