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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Почему Mdl->Next всегда ноль?Как пройтись по списку MDL?  (Прочитано 6200 раз)
0 Пользователей и 1 Гость смотрят эту тему.
maaaaaad
Гость
« : 11-11-2003 01:37 » 

Хотел посмотреть на MDL
передаю буфер заведомо больший 4к, в результате такая фигня...

Testing IOCTL_XWDM_OUTDIRECT_TEST...
Va InBuf = 0x127F38 (0x4000 bytes)
Va OutBuf= 0x12BF38 (0x4000 bytes)
OK! 0 bytes processed
Press 'r' to return in menu

00000004   20:38:52    MdlAddress :0x824F07A8   
00000005   20:38:52    BytesCount :0x4000   
00000006   20:38:52    ByteOffset :0xF38   
00000007   20:38:52    MappedSysVa:0x831D4200   
00000008   20:38:52    MdlFlags   :0x8A   
00000009   20:38:52    Process    :0x80653940   
00000010   20:38:52    Size       :0x30   
00000011   20:38:52    StartVa    :0x12B000   
00000012   20:38:52    NextMdlAddr:0x0   

Testing IOCTL_XWDM_INDIRECT_TEST...
Va InBuf = 0x127F38 (0x4000 bytes)
Va OutBuf= 0x12BF38 (0x4000 bytes)
Process 0x0
OK! 0 bytes processed
Press 'r' to return in menu

00000020   20:40:49    MdlAddress :0x835CC808   
00000021   20:40:49    BytesCount :0x4000   
00000022   20:40:49    ByteOffset :0xF38   
00000023   20:40:49    MappedSysVa:0x816957C8   
00000024   20:40:49    MdlFlags   :0xA   
00000025   20:40:49    Process    :0x80653940   
00000026   20:40:49    Size       :0x30   
00000027   20:40:49    StartVa    :0x12B000   
00000028   20:40:49    NextMdlAddr:0x0




хм...может нада смотреть 0x824F07A8+sizeof(MDL), но когда как определить последний MDL? в ручную размеры высчитывать что ли??
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #1 : 11-11-2003 08:02 » 

Вобще-то этот NextMdlAddr предназначен для случая описания при помощи MDL кусков памяти, разрывных в виртуальном адресном пространстве. А адреса страниц, содержащих непрерывный в виртуальном пространстве буффер находятся после заголовка. Вот описание из заголовочного файла

// An MDL describes pages in a virtual buffer in terms of physical pages.  The
// pages associated with the buffer are described in an array that is allocated
// just after the MDL header structure itself.  In a future compiler this will
// be placed at:
//
//      ULONG Pages[];
//
// Until this declaration is permitted, however, one simply calculates the
// base of the array by adding one to the base MDL pointer:
//
//      Pages = (PULONG) (Mdl + 1);
Записан
maaaaaad
Гость
« Ответ #2 : 11-11-2003 16:54 » 

сорри за глупый вопрос, я когда читал об ЭТОМ никак не мог воткнуть где этот массив pages[]...проглядел строчку...
я надеюсь там (ULONG) *((ULONG) Mdl+sizeof(MDL)+PageNum*sizeof(ULONG))
не физические адреса, а номера страниц...
у мя че та очень короткие адреса (вордовые) и, хехе, пятая страница - нулевая =)
 Pg Pa:0x46B8  
 Pg Pa:0xAE3B
 Pg Pa:0x1644
 Pg Pa:0x1648
 Pg Pa:0x0
 Pg Pa:0x0
 Pg Pa:0x66778899

а буфер то на 16кил и оффсет != нулю...
черт айс не загружен, надо было проверить page...
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #3 : 12-11-2003 06:55 » 

Цитата

я надеюсь там (ULONG) *((ULONG) Mdl+sizeof(MDL)+PageNum*sizeof(ULONG))


почти попал, только зачем PageNum*sizeof(ULONG)? Это вышел указатель за пределы MDL.

Размер так вычисляют-
MemoryDescriptorList->Size = (CSHORT)(sizeof(MDL) + (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES((BaseVa), (Length))));


Цитата

не физические адреса, а номера страниц...


Вполне возможно, и скорее всего там не номера страниц, а номера записей в Page Frame Number Database, я себя этим вопросом не напрягал, и по моему у них(у PFN) взаимно однозначное соответствие с номерами физических страниц. То есть физический адрес равен номеру страницы, умноженному на 0x1000 (для 4 кб страниц).
Флаги у твоей MDL интересные - MDL_NETWORK_HEADER | MDL_PARTIAL .

С пятой страницей похоже что-то не то. Нулевой PFN маловероятен, он вроде уже ядром занят. Скорее всего ты проскочил первый номер страницы. Надо так было

PULONG Pages = (PULONG) (Mdl + 1);
DbgPrnt("PFN[0]= 0x%X \n", Page[0]);
DbgPrnt("PFN[1]= 0x%X \n", Page[1]);
и т.д.
Записан
maaaaaad
Гость
« Ответ #4 : 12-11-2003 14:42 » 

Не там скобочки поставил=)

Спасиб. Все вышло
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines