Установил нотификатор на загрузку DLL в процесс(PsSetLoadImageNotifyRoutine). Далее пытаюсь выделить кусок памяти при загрузке длл. не понятно почему ZwAllocateVirtualMemory подвисает( не отдает управление) а с ней и вся система виснет... В чем тут проблема ?.. Code (Text): VOID ProcNotify( __in PUNICODE_STRING FullImageName, __in HANDLE ProcessId, // pid into which image is being mapped __in PIMAGE_INFO ImageInfo ) { AllocMemInProcess(1024,hProcess); }; PVOID AllocMemInProcess(ULONG size,HANDLE hProcess){ NTSTATUS status = 0; PVOID base = NULL; LARGE_INTEGER isize = {0}; CLIENT_ID id = {0}; OBJECT_ATTRIBUTES ObjAttr = {0}; HANDLE hOpenProcess = 0; LONG ZeroBits = 0; id.UniqueProcess = hProcess; isize.QuadPart = size; status = ZwOpenProcess(&hOpenProcess, PROCESS_ALL_ACCESS, &ObjAttr, &id ); if (! NT_SUCCESS(status)) return NULL; status = ZwAllocateVirtualMemory(hOpenProcess, &base, ZeroBits, &size, MEM_COMMIT, PAGE_EXECUTE_READWRITE); ZwClose(hOpenProcess); if (! NT_SUCCESS(status)){ return NULL; }; return base; };
http://www.wasm.ru/forum/viewtopic.php?id=38892 http://www.wasm.ru/forum/viewtopic.php?id=38896 http://www.wasm.ru/forum/viewtopic.php?id=38895
Так нельзя делать в принципе, будет дедлок. Расскажи больше о задаче, зачем выделяешь память и т.д. Тогда сможем посоветовать что-то более конкретное.
JCronuz Небыло такого, ну или я не помню. Не нравятся мне его решения: После описания необходимости аллокации памяти последует ответ: APC юзайте, можно тред создать UM и из него юзать.. и это учитывая асинхронность апк.)
С другой стороны, это ведь хорошо. Должны быть и альтернативные мнения. Чтобы был выбор решений. И сейчас пока он есть.
x64 Не, на самом деле я даже и не думал над проблемой освобождения мьютекса, меня интересует общее решение. У вас видимо сказать по сабжу нечего, пичаль.
Внедрить нужную длл в АП процесса. пока что есть несколько вариантов: 1. проверить ZwCreateSection может через нее выйдет. 2. Создать дополнительный(PsCreateSystemThread) поток который будет открывать процесс и выделять память. 3. следовать совету клерка, и делать бектрейс(идея очень интересная проблема в том что подобным не занимался еще ни разу, в инете статей еще не нашол на тему анализка стека или бектрейса).
В какой именно момент необходимо внедрить эту .dll? Это зависит от того, что именно предполагается делать в этой .dll? Например, требуется ли там перехватывать какие-либо API-функции? Не выйдет, там та же проблема в итоге. Пока непонятно, подойдёт ли тебе этот вариант. Ответь на вопросы выше. Да, тема не для новичков. Но со временем разберёшься, не волнуйся. Вопрос в том, нужно ли это тебе именно сейчас? Мне кажется, нет.
В целом момент не особо принципиален. В целом можно и без потоков обойтись память ведь можно получить в нотификации о создании процесса, а в нотификации о подгрузке длл можно поставить апс. А можно с процессом ассоциировать какой то указатель ?..
Тогда я вообще не понимаю, зачем нотификатор, если можно тупо запустить ядерный поток, когда надо, и не париться. Нет, так не надо делать. Память можно выделить там же в APC, при чём, как в ядре, так и вне его. Ну так а в чём проблема? Создай карту на базе примитивов списков и обновляй её в нотификаторе или когда там надо.
А как выделить память под саму APC ?... ведь apc нужен как я понимаю юзермодный, который сделает вызов LdrLoadDll Я ведь не могу передать юзермодной apc управление на адресс больше 0x7fffffff Надо от самого начала и до конца. облом делать вручную списки )...
У пользовательской APC есть две функции. Одна выполняется в режиме ядра (KernelRoutine), другая в режиме пользователя (NormalRoutine). При чём ядерная выполняется всегда строго перед пользовательской. Соответственно, в ядерной можешь уже звать и ZwAllocateVirtualMemory(), и всё остальное, что тебе там нужно, никаких блокировок не будет. Что значит "от самого начала"? Не вводи людей в заблуждение, описывай задачу сразу чётко, ясно и подробно.
x64 Вы уверены что поток не освободит блокировку апк(RundownProtection) до возврата на нужное место(KiServiceExit()) и ядерная апк не будет развёрнута при приходе рандомного прерывания ?
Clerk ты о чем ?.. А что будет если в момент когда будет вызвана АРС проц. произойдет прерывание ? Обработается прерывании и нам отдадут управление ?