Rtl* Function

Тема в разделе "WASM.NT.KERNEL", создана пользователем BrooVizor, 20 мар 2011.

  1. BrooVizor

    BrooVizor New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2011
    Сообщения:
    9
    Наткнулся на некоторую проблему, в работе со строками. На сколько я понимаю в r0, для этого есть только функции Rtl*. Задача, самое простое - объединять строки и обрезать.
    Для 1го существует функция RtlAppendUnicodeToString, чтобы её использовать нужно выделять пул с подходящим размером, статическая строка не подойдёт, иначе STATUS_BUFFER_TOO_SMALL .
    Код (Text):
    1. NewDir=(PUNICODE_STRING)ExAllocatePoolWithTag(PagedPool,PAGE_SIZE,'rDN');
    2.  
    3. RtlZeroMemory(NewDir,PAGE_SIZE);
    4.  
    5. NewDir->Length=0x0;
    6. NewDir->MaximumLength=0x10;
    7. //RtlAppendUnicodeToString видемо проверяет размер строки и нужно как-то обозначить размер
    8.  
    9. status=RtlAppendUnicodeToString(NewDir,L"123");
    10.  
    11. DbgPrint("NewDir->Buffer:%ws",&NewDir->Buffer);
    12. ExFreePool(NewDir);
    В результате чего bsod на RtlAppendUnicodeToString.
    Также строки можно объединять используя RtlCopyMemory.
    Код (Text):
    1. NewDir=(PUNICODE_STRING)ExAllocatePoolWithTag(PagedPool,PAGE_SIZE,'rDN');
    2.  
    3. RtlZeroMemory(NewDir,PAGE_SIZE);
    4.  
    5. RtlCopyMemory(&NewDir->Buffer,
    6.                            Name.Buffer,
    7.                            Name.Length );
    8.  
    9. NewDir->Length+=Name.Length;
    10.  
    11. DbgPrint("NewDir->Buffer:%ws",&NewDir->Buffer);
    12. ExFreePool(NewDir);
    Вроде работает, но если хочу добавить не в начало:
    Код (Text):
    1. RtlCopyMemory(&NewDir->Buffer[NewDir->Length/sizeof(WCHAR)],
    2.                            Name.Buffer,
    3.                            Name.Length );
    bsod, возможно указатель неверно передаю..
    Есть ли ещё другие споспобы объединения строк? Может более оптимальные, т.к. в коде будет использоваться много раз, скорость важна. Есть ли смысл свои писать?
    ---
    Для 2го, можно просто обрезать строку нулями, или если это структура UNICODE_STRING, подсатавлять в размер нужные значения. Будет ли это хорошим решением? Потому как в целом безопасность кода тоже важна, охото найти хорошее решение, которое потом можно будет юзать в различных ситуациях.
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Судя по коду, UNICODE_STRING обрабатывается неправильно. Структура выглядит так:
    Код (Text):
    1. typedef struct _LSA_UNICODE_STRING {
    2.   USHORT Length;
    3.   USHORT MaximumLength;
    4.   PWSTR  Buffer;
    5. } LSA_UNICODE_STRING, *PLSA_UNICODE_STRING, UNICODE_STRING, *PUNICODE_STRING;
    Т.е. третий ее член -- указатель на строку, а не сама строка Т.к. после RtlZeroMemory там лежит 0, то RtlAppendUnicodeToString пытается записать по этому адресу, после чего происходит BSoD. Вообще, для работы с UNICODE_STRING самое правильное (чаще всего) -- объявить саму структуру в стеке, а вот Buffer уже выделять динамически. Т.е. должно быть что-то вроде:

    Код (Text):
    1. UNICODE_STRING UnicodeString;
    2.  
    3. UnicodeString.Buffer = ExAllocatePool(..., N);
    4. UnicodeString.MaxLength = N;
     
  3. BrooVizor

    BrooVizor New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2011
    Сообщения:
    9
    Mika0x65, Спасибо. Если выделить динамически только буфер, работают обе функции. Как-то я не внимательно структуру смотрел =\
    Что насчет второго пункта? Есть вариаты лучше, чем искать определённое сочетани символов в строке и затем уменьшать USHORT Length?
     
  4. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Для инициализации паолей Unicode-структуры полезнее юзать RtlInitUnicodeString и т.п.
    + wcscat, wcsncat для объединения строк, содержащихся в буфере. Обычно редко именно UNICODE_STRING приходится юзать, WCHAR - другое дело.
     
  5. BrooVizor

    BrooVizor New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2011
    Сообщения:
    9