Закрываем ненужные вкладки...
Ищем функцию CreateDialogIndirectParamW.
Смотрим, кто на нее ссылается.
Тут у нас происходит создание диалогового окна из шаблона.
Ставим бряк на помещение первого параметра функции в стек.
Идем в начало текущей функции.
Смотрим, кто на нее ссылается.
Ставим бряк на начало кода загрузки шаблона диалога из ресурсов.
Сейчас мы посмотрим, чему равен идентификатор шаблона (lpName). Для этого выберем отладчик.
Запускаем отладку.
Видим, что регистр edi у нас указывает на __ImageBase.
Регистр esi имеет корректное значение.
Делаем шаг, и в окне 'Stack view' видим значение идентификатора шаблона.
Еще один шаг...
Получаем дескриптор информационного блока ресурса...
Получаем дескриптор ресурса...
По адресу в регистре eax можно увидеть данные шаблона.
Значение '01 00 ff ff' - это поля dlgVer и signature структуры DLGTEMPLATEEX.
Запускаем отладку до следующей точки останова.
Регистр ebx (dwInitParam) равен нулю.
Регистр edi указывает на данные шаблона.
Смотрим, кто кого вызвал.
Идем в самое начало...
Пока не дойдем до точки входа в приложение.
Ставим бряк на первую инструкцию.
Останавливаем отладку, и запускаем снова, с самого начала.
Мы в точке входа.
Открываем список бряков.
Идем в начало кода загрузки шаблона из ресурсов.
Устанавливаем регистр eip в текущую позицию, пропуская весь код от точки входа.
Помещаем параметр в стек.
Видим, что регистр esi равен нулю.
По этому, помещаем в стек еще одно значение, чтобы поправить его потом вручную.
В окне дампа памяти перемещаемся по адресу, на который ссылается указатель стека.
Прописываем значение идентификатора шаблона.
Видим, что значение параметра сохраненного на стеке поменялось.
Переходим к параметру hModule.
Видим, что регистр edi равен нулю, в то время как параметр hModule должен быть равен __ImageBase.
Прописываем в регистр верное значение.
Помещаем параметр на стек.
Видим, как функции возвращают верные значения.
Ставим бряк в точку, где шаблон уже загружен.
Выполняемся до этой точки.
Переходим к списку точек останова.
Идем в точку создания диалогового окна из шаблона.
Устанавливаем регистр eip в текущую позицию.
Обнуляем регистр ebx (dwInitParam).
В регистре eax у нас адрес шаблона. Помещаем в регистр edi.
В окне дампа памяти перемещаемся по адресу, на который ссылается регистр edi.
Видим поле style структуры DLGTEMPLATEEX.
Нас интересует поле exStyle.
В младший байт поля exStyle прописываем значение расширенного стиля WS_EX_TOPMOST,
чтобы мы могли увидеть созданное окно.
В противном случае, диалоговое окно окажется спрятанным
за окном отладчика.
Добавляем параметр (dwInitParam) на стек.
Добавляем параметр (lpDialogFunc) на стек.
В окне дампа памяти перемещаемся по адресу, на который ссылается указатель стека.
Обнуляем параметр lpDialogFunc.
Обнуляем регистр eax (hWndParent).
Помещаем параметр на стек.
Помещаем параметр lpTemplate на стек.
Помещаем параметр hInstance на стек.
Для формирования значения hInstance (__ImageBase) нам понадобится старшее слово из регистра eip.
В окне дампа памяти перемещаемся по адресу, на который ссылается указатель стека.
В параметр hInstance записываем значение __ImageBase.
Запускаем функцию, и видим диалоговое окно!
Останавливаем отладку.
