Я искал, читал. Статьи Фор-Ф читал, искал вопросы, тыкал - не помогло. Пытаюсь наладить шадер мэмори между драйвером и юзермодным приложением. В драйвере: Код (Text): shm=ExAllocatePool(NonPagedPool, PAGE_SIZE); RtlZeroMemory (shm, PAGE_SIZE); mdl=IoAllocateMdl(shm, PAGE_SIZE, FALSE, FALSE, NULL); MmBuildMdlForNonPagedPool(mdl); RtlZeroMemory (shm, PAGE_SIZE); userAdr=MmMapLockedPagesSpecifyCache(mdl, UserMode, MmCached, NULL, FALSE, NormalPagePriority); RtlZeroMemory (shm, PAGE_SIZE); RtlCopyMemory(shm, &val, sizeof(DWORD)); Приложение нормально получает буферизованным и/о адрес userAdr, но обращение по нему даёт шлак. Приложение: Код (Text): PVOID addr=NULL; DeviceIoControl(hDevice,IOCTL_GETADDR,NULL,0,&addr,sizeof(PVOID),&read,NULL); DWORD v=0; RtlCopyMemory(&v,addr,sizeof(DWORD)); Выдает 200. Передаю 0x12345670. В чем косяк?
billi12 А отображение MmMapLockedPagesSpecifyCache происходит в контексте того же процесса, что вызывает DeviceIoControl?
billi12 Оформляйте код в тег code. В привденных кусках всё нормально. Ну за исключением отсутствия проверок/обработчиков исключения, а также избыточного количества вызовов RtlZeroMemory. Также важно учесть, чтобы отображение памяти происходило в контексте запрашивающего процесса (что так и есть, если это выделение происходит в обработчике IOCTL_GETADDR). Возможно, где-то косяк с передачей самого адреса, т.е. приложение получает в addr не то, что возвращает MmMapLockedPagesSpecifyCache в драйвере. Приаттачьтесь к приложению OllyDbg, а к машине Windbg. Под Windbg посмотрите, что возвращает MmMapLockedPagesSpecifyCache, потом в OllyDbg на выходе из DeviceIoControl обновите снимок памяти и посмотрите, где появилась новая страничка, и что в ней находится.
Спасибо за ответы. Проверки убрал отсюда, чтоб лишнего кода не было. Щас попробую дебаггеры, но я выводил значения userAddr, addr, значения одинаковые.
Святые угодники! Контекст процесса был не тот! Теперь другой вопрос. Я выделил страницу памяти, отмапил её. Вопрос - весь ли ПЭЙДЖ_САЙЗ мне доступен из приложения? И следом вопрос...про IRQL! Если указывается, что он должен быть ниже диспатч лэвэл, например, значит важно чтобы не было переключения контекста? Так? На меня озарения нахлынули
billi12 В DriverEntry мапили что ли? Конечно, весь. Невозможно отобразить объём памяти, некратный размеру страницы.
billi12 Про IRQL -- не надо его повышать, значит. IRQL повышается при вызове ф-ий KeRaiseIrql, KeAcquireSpinLock, например. Ну или он уже может быть высоким, в completion routine, если IoCompleteRequest была вызвана из DPC. Как вариант, ф-ию, требующую низкий IRQL, нельзя вызывать из той же DPC. С переключением контекста это связано косвенно: при выполнении на DISPATCH_LEVEL контекст переключиться не может. А ф-ии требуют низкий IRQL обычно из-за обращения к выгружаемым данным: во время выполнения на DISPTACH_LEVEL запрещены страничные прерывания.
billi12 Где указывается? Если в описании системной функции написано, что поток должен быть на IRQL < DISPATCH_LEVEL, это означает, что системной функции может быть необходимо переключение контекста, например, для подкачки памяти. От Вас в данном случае только требуется удовлетворение условию IRQL < DISPATCH_LEVEL, ничего более.
Спасибо...А где еще почитать про функциональное значение IRQL можно? Вот честно, уже и в паре книг читал и на форумах, никак не пойму я его.
IRQL показывает "уровень" потока. Всего таких уровня 32, от 0..31 . Это влияет на 1. Чем выше IRQL тем больше ограничения накладываются на код. 2. На IRQL DISPATCH_LEVEL работает "планировщик потоков" то есть пока ты не понизишь IRQL переключение на другой поток не будет. Это справедливо для одно процессорной системы, на двух и выше процессорах у каждого свой IRQL. 3. Память которая может быть сброшенная в PageFile не будет работать при RQL DISPATCH_LEVEL и выше. Почитай вот что "Руссинович Соломон Внутреннее устройство Microsoft Windows" Мой встречный вопрос как организованная работа IRQL ? это есть набор прерываний в системе ??