Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> инициализация UNICODE_STRING, драйверописание 
V
    Опции темы
shara
Дата 25.5.2010, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 29.6.2004
Где: печенье?

Репутация: нет
Всего: 2



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


  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") 


--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
EvilsInterrupt
Дата 28.5.2010, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 1
Всего: 9



Код

.text:004022A7 _RtlInitUnicodeString@8 proc near       ; CODE XREF: RtlAppendUnicodeToString(x,x)+17p
.text:004022A7                                         ; PopApplyProcessorPolicy(x,x,x,x)+1E477p ...
.text:004022A7
.text:004022A7 DestinationString= dword ptr  4
.text:004022A7 SourceString    = dword ptr  8
.text:004022A7
.text:004022A7                 push    edi
.text:004022A8                 mov     edi, [esp+4+SourceString]
.text:004022AC                 mov     edx, [esp+4+DestinationString]
.text:004022B0                 mov     dword ptr [edx], 0 ; Len
.text:004022B6                 mov     [edx+4], edi    ; Buf
.text:004022B9                 or      edi, edi
.text:004022BB                 jz      short fail
.text:004022BD                 or      ecx, 0FFFFFFFFh
.text:004022C0                 xor     eax, eax
.text:004022C2                 repne scasw
.text:004022C5                 not     ecx
.text:004022C7                 shl     ecx, 1
.text:004022C9                 cmp     ecx, 0FFFEh
.text:004022CF                 jbe     short loc_4022D6
.text:004022D1                 mov     ecx, 0FFFEh
.text:004022D6
.text:004022D6 loc_4022D6:                             ; CODE XREF: RtlInitUnicodeString(x,x)+28j
.text:004022D6                 mov     [edx+2], cx     ; MaxLen
.text:004022DA                 dec     ecx
.text:004022DB                 dec     ecx
.text:004022DC                 mov     [edx], cx       ; Len
.text:004022DF
.text:004022DF fail:                                   ; CODE XREF: RtlInitUnicodeString(x,x)+14j
.text:004022DF                 pop     edi
.text:004022E0                 retn    8
.text:004022E0 _RtlInitUnicodeString@8 endp

Как видно это всего-лишь заполнение структуры ;)

Это сообщение отредактировал(а) EvilsInterrupt - 28.5.2010, 16:24
PM MAIL WWW ICQ Jabber   Вверх
Dem_max
Дата 28.5.2010, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



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


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
EvilsInterrupt
Дата 28.5.2010, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 1
Всего: 9



shara, а смысл извращаться , когда есть уже готовое и хорошее решение ? Зачем самому то?
PM MAIL WWW ICQ Jabber   Вверх
shara
Дата 28.5.2010, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 29.6.2004
Где: печенье?

Репутация: нет
Всего: 2



Цитата(EvilsInterrupt @  28.5.2010,  15:34 Найти цитируемый пост)
shara, а смысл извращаться , когда есть уже готовое и хорошее решение ? Зачем самому то? 

ну дык, я в WDK больше ничего и не нашел...

EvilsInterrupt,   smile     а то RtlInitUnicodeString() не устраивает  smile 


--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
EvilsInterrupt
Дата 29.5.2010, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 1
Всего: 9



shara, Что ты хочешь добиться ? Какие конкретно изъяны у RtlInitUnicodeString()  тебя не устраивают?

Это сообщение отредактировал(а) EvilsInterrupt - 29.5.2010, 00:28
PM MAIL WWW ICQ Jabber   Вверх
shara
Дата 29.5.2010, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 29.6.2004
Где: печенье?

Репутация: нет
Всего: 2



читаем WDK 
Цитата

The RtlInitUnicodeString routine initializes a counted Unicode string.

VOID 
  RtlInitUnicodeString(
    IN OUT PUNICODE_STRING  DestinationString,
    IN PCWSTR  SourceString
    );


Parameters
DestinationString 
Pointer to the UNICODE_STRING structure to be initialized. 
SourceString 
Pointer to a null-terminated Unicode string with which to initialize the counted string.



второй параметр это уже заранее определенная константная строка типа L"bla bla bla". и она имеет фиксированный размер определяемый временем компиляции. к тому-же, кажется, ядро фиксирует попытку запись(изменения) этой строки и трактуя ее как попытку записи по не допустимому адресу (или еще чего-то там) и уходит в БСОД
т.е. это просто макрос который инициирует поля структуры UNICODE_STRING без выделения памяти под строку


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

топик создал для того чтобы не изобретать велосипед, может есть готовые решения которых я не знаю 


--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
Dem_max
Дата 30.5.2010, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



чем так не устроило ?
ZeroMemory (ObjectName->Buffer, ObjectName->Length);


Это сообщение отредактировал(а) Dem_max - 30.5.2010, 07:15


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
EvilsInterrupt
Дата 30.5.2010, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 1
Всего: 9



shara, В книге Уолтер Они про WDM есть глава работы со строками,рекомендед from me !!! По сути ты прав, надо выделить буфер задать поля структуры, но опять же вопрос почему выделение с тегом в апи-шке *WithTag ? ))) Более того,возникает проблема учета памяти,т.е. не  просто выделения но и корректного удаления. Зачем тебе следить за памятью там, где это в принципе можно  избежать ?
PM MAIL WWW ICQ Jabber   Вверх
bra1ny
Дата 30.5.2010, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 26.12.2008

Репутация: 2
Всего: 3



Цитата

По сути ты прав, надо выделить буфер задать поля структуры, но опять же вопрос почему выделение с тегом в апи-шке *WithTag ? )))

ExAllocatePool->ExAllocatePoolWithTag c тэгом None. 
Просто укороченная версия.


Это сообщение отредактировал(а) bra1ny - 30.5.2010, 13:13
--------------------
Что вас манит сюдаИз заморзких широт?Там гораздо сытней и красивей.Или воля не та, или воздух не тот -Знать и вам не прожить без России.
PM   Вверх
EvilsInterrupt
Дата 30.5.2010, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 1
Всего: 9



bra1ny, Это-то понятно, что всегда есть extented-версии АПИ-шек,  но мне хочется знать почему именно в этой ситуации юзается расширенная, когда вполне хватило бы нормальной не расширенной?!

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

Это сообщение отредактировал(а) EvilsInterrupt - 30.5.2010, 15:48
PM MAIL WWW ICQ Jabber   Вверх
bra1ny
Дата 30.5.2010, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 26.12.2008

Репутация: 2
Всего: 3



чего расширенная. RtlInitUnicodeString вообще не выделяет из пула ничего.
ExAllocatePool - обертка которая ничего не делает , кроме как вызывает ExAllocatePoolWithTag.
Цитата

но мне хочется знать почему именно в этой версии юзается расширенная, когда вполне хватило бы нормальной не расширенной?!

Да потому что так проще утечку найти пулмоном например.И ядро активно юзает это. Например когда хочет залогировать ошибку в журнал.И создает пакет через IoAllocateErrorLogEntry.Память  для пакета  выделяется из пула с тагом IoEr.




Это сообщение отредактировал(а) bra1ny - 30.5.2010, 15:58
--------------------
Что вас манит сюдаИз заморзких широт?Там гораздо сытней и красивей.Или воля не та, или воздух не тот -Знать и вам не прожить без России.
PM   Вверх
EvilsInterrupt
Дата 30.5.2010, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 1
Всего: 9



Цитата

ExAllocatePool - обертка которая ничего не делает , кроме как вызывает ExAllocatePoolWithTag.

При чтении кода, т.е. при знакомстве с алгоритмом на детали реализации обращаешь внимания в меньшей степени и это правильльно! Вгрызаешься в детали только, когда видишь, что именно в этом коде бага! Поэтому, всегда и во всем рекомендовал юзать именно переходники, т.е. "расширенные" версии!
PM MAIL WWW ICQ Jabber   Вверх
shara
Дата 30.5.2010, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 29.6.2004
Где: печенье?

Репутация: нет
Всего: 2



Цитата(Dem_max @  30.5.2010,  05:59 Найти цитируемый пост)
чем так не устроило ?
ZeroMemory (ObjectName->Buffer, ObjectName->Length);

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

а здесь
Цитата(shara @  25.5.2010,  20:47 Найти цитируемый пост)
RtlZeroMemory ( &ObjectName, sizeof (UNICODE_STRING) );
 
значение всех полей структуры сбрасываем в ноль

в общем итог таков что буду писать свои функции для выделения  и освобождения памяти из-под динамически создаваемых строк. всем спасибо  smile 


--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0622 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.