Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Инициализация UNICODE_STRING  (Прочитано 14380 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
GG_shara
Постоялец

ua
Offline Offline
Пол: Мужской
Лицо под маской


« : 26-05-2010 18:11 » 

можно ли так проинициализировать юникод_стринг, когда нужен сринг ОПРЕДЕЛЕННОЙ длинны

   
Код:
  UNICODE_STRING Name;
  NTSTATUS status = STATUS_SUCCESS;
  RtlZeroMemory ( &ObjectName, sizeof (UNICODE_STRING) );
  ObjectName->Length = 128;
  ObjectName->MaximumLength = ObjectName->Length;
  ObjectName->Buffer = (PWSTR) ExAllocatePoolWithTag( PagedPool,
                                            ObjectName->Length,
                                            TAG_NAME_BUFFER );
  RtlZeroMemory (ObjectName->Buffer, ObjectName->Length );


потому-что насколько я понимаю обычный RtlInitUnicodeString() вроде как макрос, который просто инициирует поля структуры (проставляя указатель на строку вида L"unicode string constant")

а то я что-то смущаюсь  Скромно так...
Записан

Не смеши меня с точки зрения аэродинамики шмель не может летать
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 26-05-2010 19:41 » 

да вроде нет никакого криминала...
"RtlZeroMemory ( &ObjectName, sizeof (UNICODE_STRING) );" - это еще зачем?)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
GG_shara
Постоялец

ua
Offline Offline
Пол: Мужской
Лицо под маской


« Ответ #2 : 27-05-2010 17:04 » 

"RtlZeroMemory ( &ObjectName, sizeof (UNICODE_STRING) );" - это еще зачем?)

ааааа , это лишее, случайно затесалось я и не заметил ))))))
спасибо =)
Записан

Не смеши меня с точки зрения аэродинамики шмель не может летать
l_sunny
Участник

ru
Offline Offline

« Ответ #3 : 27-05-2010 17:09 » 

Я бы немного изменил строку: ObjectName->MaximumLength = ObjectName->Length;
на: ObjectName->MaximumLength = ObjectName->Length+2;
Поле MaximumLength, в отличии от Length, дополнительно включает завершающие нули, но похоже в этом примере, где размер строки выделяется с запасом, это не так важно.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 27-05-2010 20:55 » 

l_sunny, не совсем...например RtlUnicodeStringCopyString
Цитата
The string that the pszSrc parameter points to (excluding the terminating NULL) is copied into the buffer that the DestinationString parameter's UNICODE_STRING structure points to.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 28-05-2010 06:45 » 

l_sunny, не нужны в UNICODE_STRING никакие нули.
Записан
GG_shara
Постоялец

ua
Offline Offline
Пол: Мужской
Лицо под маской


« Ответ #6 : 28-05-2010 18:43 » 

а есть какой-нить аналог RtlInitUnicodeString() только чтобы размер буфера можно было задать руками  Учиться, учиться и еще раз учиться!   ?
ну  и чтобы было чем потом этот буфер освободить..


и вообще, кто как со юникод_стрингами работает? а то я что-то не могу  свой стиль   Copyright  выбрать, хочется чтобы было красиво и понятно  Сочиняю...
« Последнее редактирование: 28-05-2010 18:50 от GG_shara » Записан

Не смеши меня с точки зрения аэродинамики шмель не может летать
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 29-05-2010 12:56 » 

Память под буфер надо выделять самостоятельно. RtlInitUnicodeString ведь не выделяет буфер, а всего лишь устанавливает на него указатель. Т.е. фактически ей передается буфер (определяемого размера), содержащий строку (PCWSTR). Ну можно написать свою inline-функцию или макрос, так что проблем тут нет.
Записан
GG_shara
Постоялец

ua
Offline Offline
Пол: Мужской
Лицо под маской


« Ответ #8 : 29-05-2010 19:02 » 

хм, странно

кажется это весьма частая задача, повсеместно встречающаяся в программировании.. почему Microsoft'овцы не сделали пару функций для инициализации и безопасного удаления uicode строк? макрос на две строчки есть, а вот функции нету

буду свою функцию делать
Записан

Не смеши меня с точки зрения аэродинамики шмель не может летать
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 29-05-2010 22:15 » 

Ну не сделали потому, что надо вызывать ExAllocatePool. Они конечно могли бы написать макрос, но откуда им знать, например Paged или NonPaged пул нужен. Ну а если передавать его как параметр то слишком много чести, можно самому такой мини макрос сделать. К тому же в макросе обычно не проверяют возвращаемое значение. А inline функции для таких незначительных целей писать..... Ну это уже каждый сам себе. Если уж совсем фантазировать, то вдруг вызывающий захочет выделить под строку память из lookaside list, конечно на практике такое мало вероятно, но всё пишется так, чтобы это можно было поддерживать в следующих версиях винды. А вдруг в следующей версии появится еще какая функция для выделения памяти и как тогда. Кто знает какой функцией решит воспользоваться разработчик.

мелкая inline функция решит вопрос.
« Последнее редактирование: 29-05-2010 22:16 от resource » Записан
GG_shara
Постоялец

ua
Offline Offline
Пол: Мужской
Лицо под маской


« Ответ #10 : 30-05-2010 09:00 » 

resource, спасибо  Улыбаюсь
Записан

Не смеши меня с точки зрения аэродинамики шмель не может летать
supermaxus
Участник

ru
Offline Offline

« Ответ #11 : 06-11-2010 01:05 » new

Ну не сделали потому, что надо вызывать ExAllocatePool. Они конечно могли бы написать макрос, но откуда им знать, например Paged или NonPaged пул нужен. Ну а если передавать его как параметр то слишком много чести, можно самому такой мини макрос сделать. К тому же в макросе обычно не проверяют возвращаемое значение. А inline функции для таких незначительных целей писать..... Ну это уже каждый сам себе. Если уж совсем фантазировать, то вдруг вызывающий захочет выделить под строку память из lookaside list, конечно на практике такое мало вероятно, но всё пишется так, чтобы это можно было поддерживать в следующих версиях винды. А вдруг в следующей версии появится еще какая функция для выделения памяти и как-тогда. Кто знает какой функцией решит воспользоваться разработчик.

мелкая inline функция решит вопрос.

Строковые функции все только на PASSIVE_LEVEL работают, а значит могли бы вполне paged pool пользовать, как наименее ценный ресурс. ИМХО, программисту на PASSIVE_LEVEL все равно какой пул пользовать, а значит MS могла бы поудобнее че-то соорудить, поддерживаю идею.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines