Шаред мемори

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

  1. billi12

    billi12 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    44
    Я искал, читал. Статьи Фор-Ф читал, искал вопросы, тыкал - не помогло. Пытаюсь наладить шадер мэмори между драйвером и юзермодным приложением. В драйвере:

    Код (Text):
    1.   shm=ExAllocatePool(NonPagedPool, PAGE_SIZE);
    2.   RtlZeroMemory (shm, PAGE_SIZE);
    3.   mdl=IoAllocateMdl(shm, PAGE_SIZE, FALSE, FALSE, NULL);
    4.   MmBuildMdlForNonPagedPool(mdl);
    5.   RtlZeroMemory (shm, PAGE_SIZE);
    6.   userAdr=MmMapLockedPagesSpecifyCache(mdl, UserMode, MmCached, NULL, FALSE, NormalPagePriority);
    7.   RtlZeroMemory (shm, PAGE_SIZE);
    8.   RtlCopyMemory(shm, &val, sizeof(DWORD));
    Приложение нормально получает буферизованным и/о адрес userAdr, но обращение по нему даёт шлак. Приложение:
    Код (Text):
    1.   PVOID addr=NULL;
    2.   DeviceIoControl(hDevice,IOCTL_GETADDR,NULL,0,&addr,sizeof(PVOID),&read,NULL);
    3.   DWORD v=0;
    4.   RtlCopyMemory(&v,addr,sizeof(DWORD));
    Выдает 200. Передаю 0x12345670. В чем косяк?
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    billi12
    А отображение MmMapLockedPagesSpecifyCache происходит в контексте того же процесса, что вызывает DeviceIoControl?
     
  3. billi12

    billi12 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    44
    А вот хз. Как узнать? Неужели нужно делать атач к стэку?
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    billi12
    Оформляйте код в тег code. В привденных кусках всё нормально. Ну за исключением отсутствия проверок/обработчиков исключения, а также избыточного количества вызовов RtlZeroMemory.
    Также важно учесть, чтобы отображение памяти происходило в контексте запрашивающего процесса (что так и есть, если это выделение происходит в обработчике IOCTL_GETADDR). Возможно, где-то косяк с передачей самого адреса, т.е. приложение получает в addr не то, что возвращает MmMapLockedPagesSpecifyCache в драйвере.

    Приаттачьтесь к приложению OllyDbg, а к машине Windbg. Под Windbg посмотрите, что возвращает MmMapLockedPagesSpecifyCache, потом в OllyDbg на выходе из DeviceIoControl обновите снимок памяти и посмотрите, где появилась новая страничка, и что в ней находится.
     
  5. billi12

    billi12 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    44
    Спасибо за ответы. Проверки убрал отсюда, чтоб лишнего кода не было. Щас попробую дебаггеры, но я выводил значения userAddr, addr, значения одинаковые.
     
  6. billi12

    billi12 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    44
    Святые угодники! Контекст процесса был не тот! Теперь другой вопрос. Я выделил страницу памяти, отмапил её. Вопрос - весь ли ПЭЙДЖ_САЙЗ мне доступен из приложения?

    И следом вопрос...про IRQL! Если указывается, что он должен быть ниже диспатч лэвэл, например, значит важно чтобы не было переключения контекста? Так? На меня озарения нахлынули :lol:
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    billi12
    В DriverEntry мапили что ли?
    Конечно, весь. Невозможно отобразить объём памяти, некратный размеру страницы.
     
  8. billi12

    billi12 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    44
    Да...прямо там)) Класс) А про IRQL ответите?)
     
  9. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    billi12
    Про IRQL -- не надо его повышать, значит. IRQL повышается при вызове ф-ий KeRaiseIrql, KeAcquireSpinLock, например. Ну или он уже может быть высоким, в completion routine, если IoCompleteRequest была вызвана из DPC. Как вариант, ф-ию, требующую низкий IRQL, нельзя вызывать из той же DPC. С переключением контекста это связано косвенно: при выполнении на DISPATCH_LEVEL контекст переключиться не может. А ф-ии требуют низкий IRQL обычно из-за обращения к выгружаемым данным: во время выполнения на DISPTACH_LEVEL запрещены страничные прерывания.
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    billi12
    Где указывается? Если в описании системной функции написано, что поток должен быть на IRQL < DISPATCH_LEVEL, это означает, что системной функции может быть необходимо переключение контекста, например, для подкачки памяти. От Вас в данном случае только требуется удовлетворение условию IRQL < DISPATCH_LEVEL, ничего более.
     
  11. billi12

    billi12 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    44
    Спасибо...А где еще почитать про функциональное значение IRQL можно? Вот честно, уже и в паре книг читал и на форумах, никак не пойму я его.
     
  12. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    IRQL показывает "уровень" потока.
    Всего таких уровня 32, от 0..31 .
    Это влияет на
    1. Чем выше IRQL тем больше ограничения накладываются на код.
    2. На IRQL DISPATCH_LEVEL работает "планировщик потоков" то есть пока ты не понизишь IRQL переключение на другой поток не будет. Это справедливо для одно процессорной системы, на двух и выше процессорах у каждого свой IRQL.
    3. Память которая может быть сброшенная в PageFile не будет работать при RQL DISPATCH_LEVEL и выше.
    Почитай вот что "Руссинович Соломон Внутреннее устройство Microsoft Windows"

    Мой встречный вопрос как организованная работа IRQL ? это есть набор прерываний в системе ??
     
  13. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
  14. billi12

    billi12 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    44
    Сэнкс