Всем доброго времени суток! Вот такой вопрос, что нужно профиксить в ПЕБ, что бы нормально работал, загруженый через собственный лоадер, бинарник? Или хоть, если есть, дайте описание ПЕБ!? Структуру знаю а что там за что отвечает нипайму! Спасибо!
гугл точно не для тебя придумали http://google.ru/search?q=typedef+struct+_PEB+%7B хотя бы ImageBase PVOID ImageBaseAddress; /* 08h */
Cock Не работают например стили, то есть прога грузится без ХП стилей, как в Вин9х! И еще такая проблема, не знаю это в пеб или нет, но не грузятся многие проги которые юзают ВЦЛ, то есть прога написаная на чистом АПИ грузится на ура! И виндовые проги типа калькулятора и прочей шушары. А вот например любая запакованая сразу сдыхает! Great Ну имейджбейс я фиксил! первым делом И потом пролистал первые результаты гугла, там только описание структуры, безо всякого пописание ее полей, а именно за что они отвечают!
Так ясен пень, что проблема с чем-то! Рас не работает! Я же и прошу ОПИСАНИЕ СТРУКТУРЫ PEB ну если есть то и TEB! (под описанием я имею ввиду не саму структуру, а описание полей этой структуры!)
mrcrown Часть полей можно понять по смыслу, маленькую часть есть во "Внутреннее устройство Windows", часть в Шрайбере, немного тут http://undocumented.ntinternals.net/UserMode/Undocumented Functions/NT Objects/Process/PEB.html, совсем малость в Неббете. Много(!) о смысле полей можно найти в исходниках ReactOS (хотя у меня явно они не последней версии - сейчас качаю последнюю). Ну к примеру о поле Ldr можно узнать из функции ListUserModules в symbols.c. Delphi проги, которые юзают VCL имеют TLS - информация о статических TLS переменных хранится в PEB - как именно это поле используется загрузчиком можно прочитать в функции LdrpInitializeTlsForProccess из файла '\dll\ntdll\ldr\utils.c' исходников ReactOS. Также чуть о TlsBitmapBits, TlsExpansionBitmapBits, TlsSlots и о TlsExpansionSlots есть тут - http://www.wasm.ru/article.php?article=tls. Поле KernelCallbackTable в теории не должно использоваться, но заполненно валидным адресом. Вот как оно юзается VOID NTAPI Код (Text): KiUserCallbackDispatcher(ULONG Index, PVOID Argument, ULONG ArgumentLength) { /* Return with the result of the callback function */ ZwCallbackReturn(NULL, 0, ((USER_CALL)(NtCurrentPeb()->KernelCallbackTable[Index])) (Argument, ArgumentLength)); } Интересное поле, которое требует отдельных экспериментов по совместимости - PostProcessInitRoutine, немножко описывается Micro$oft'ом тут - http://msdn2.microsoft.com/en-us/library/aa813706(VS.85).aspx. Вполне очевидно, что куча инфы находится в самих исходниках Windows, но к сожалению их под рукой сейчас у меня нет (т.к. сижу в подвале и с низу капает вода). Распарсить диманичный PEB в удобном виде поможет windbg - так dt -r3 ntdll!_peb 7ffde000 (-r3 - глубина рекурсии структур). Тут - http://pasotech.altervista.org/delphi/PEB.htm о различиях PEB в разных ОС.
Ежели дело касается гуя (который не так работает) - посмотри отличия при вызове CsrClientCallServer, а вернее сообщение передаваемое туда (там в том числе ActivationContext - winsxs и иже с ними, имхо оттуда ноги растут у проблемы, т.к. варианты описанные для 2к в ХР не работают - даже если ты создаешь процесс из ядра и имеешь корректный хендл порта csrss - передаешь туда стандартное для 2к LPC message - а толку ноль, возвращается ошибка, т.к. формат сообщения другой - в ХР используется winsxs структуры) Другими словами, дело не в PEB имхо
У меня в одной гуевой программе даже MessageBox не пахает, хотя notepad сейчас уже грузится по полной, со стилями... копал весь мессажбокс, там похожу объект шрифта как не так выбирается =\\\ копаю дальше =\\\ p.s. эта вся хрень у меня в прогах на MFC пока выявляется (c TLS не забирался пока даже ещё)
После того как я поменял старое вхождение (от загрузчика) InInitializationOrderModuleList на новое у меня нацепились стандартные стили, и более правильно стал работать гуй. Но всё равно падает =\\\ Код (Text): pLDR->BaseAddress = (PVOID)Mapping; pLDR->EntryPoint = (LPVOID)( (DWORD)Mapping + poh->AddressOfEntryPoint ); pLDR->LoadCount = 1; pLDR->SizeOfImage = poh->SizeOfImage; pLDR->BaseDllName = wName; pLDR->FullDllName = wName; Может какие-то ещё поля надо? Поля брал из ReactOS, там ещё есть пару полей, но у меня в структуре _LDR_MODULE их нет
justru, а что надо фиксить в PEB, чтобы нацепились стандартные стили? А то у меня похожая проблема... стили не работают... совсем...
Проблема похожая. Некоторые загруженные из памяти бинарники падают в gdi32 (ReleaseDC, DeleteObject и т.д.). Что нужно фиксить дополнительно? EP, ImageBase в PEB и в LDR_DATA_TABLE_ENTRY для основного модуля правлю, но проблема та же. Дамп самого модуля полностью идентичен с загруженным системой, т.е. остается что-то в системных структурах.