На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
  
> Сабклассинг в чужой программе Win10, Проблема с сабклассингом в чужой программе Win10
Доброго времени суток
Бьюсь второй день с одной проблемой :wall:
Делаю инжект Dll в игру
Дилка при нажатии комбинации горячих клавиш открывает созданное при загрузке дочернее окно с дополнительными функциями
Все прекрасно работает на Windows7
НО на Windows10 никак в момент инжекта вылетает ошибка типа память не может быть read
притом если рисовать контролллы прямо в окне не создавая обработчик и не регистрируя класс нового окна то работает и на десятке

Вот кусок кода моей DLL с сабклассингом
ExpandedWrap disabled
    LRESULT CALLBACK WowAProc(HWND, UINT, WPARAM, LPARAM);
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
     
    LRESULT CALLBACK WowAProc(HWND Hwnd, UINT Mes, WPARAM WParam, LPARAM LParam)
    {
     
        char* header[3] = { "Логин", "Пароль", "Заметка" };
        char buf[256] = "";
        DWORD dw = 0;
        int const textMaxLen = 256;
        LPNMLISTVIEW pnmLV = NULL;
        HDC hdc;
     
        if (Mes == WM_CREATE)
        {
            hDC = GetDC(Hwnd);
            back = (HBITMAP)LoadBitmap(GetModuleHandle("WowADll.dll"), MAKEINTRESOURCE(BG));
            hdcMem = CreateCompatibleDC(hDC);
            SelectObject(hdcMem, back);
            GetObject(back, sizeof(BITMAP), (LPVOID)&bm);
            LV = CreateWindow(WC_LISTVIEW, TEXT(""), WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_NOCOLUMNHEADER, 14, 65, 477, 300, Hwnd, (HMENU)999, ::GetModuleHandle(NULL), NULL);;
            ListView_SetExtendedListViewStyleEx(LV, 0, LVS_EX_FULLROWSELECT);
            ListView_SetBkColor(LV, 0x000000);
            ListView_SetTextBkColor(LV, 0x000000);
            ListView_SetTextColor(LV, 0x00FFFF);
            SetListViewColumns(LV, 3, 256, header);
     
            CBox = CreateWindow(WC_COMBOBOX, TEXT(""), CBS_DROPDOWN | CBS_HASSTRINGS | WS_VISIBLE | WS_CHILD | WS_OVERLAPPED, 14, 15, 150, 400, Hwnd, (HMENU)1001, ::GetModuleHandle(NULL), NULL);
            Edit1 = CreateWindow(TEXT("edit"), TEXT(""), WS_CHILD | WS_VSCROLL | ES_MULTILINE, 14, 65, 477, 300, Hwnd, NULL, ::GetModuleHandle(NULL), NULL);
     
     
            hButton2 = CreateWindow("button", "Редактировать", WS_CHILD | WS_VISIBLE | BS_BITMAP, 14, 396, 65, 15, Hwnd, (HMENU)1002, ::GetModuleHandle(NULL), NULL);
            SendMessage(hButton2, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)Edit);
     
            hButton3 = CreateWindow("button", "Сохранить", WS_CHILD | BS_BITMAP, 420, 396, 65, 15, Hwnd, (HMENU)1003, ::GetModuleHandle(NULL), NULL);
            SendMessage(hButton3, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)Save);
     
            CheckBox1 = CreateWindow("BUTTON", "", WS_CHILD | WS_VISIBLE | BS_CHECKBOX | ES_CENTER, 17, 370, 14, 14, Hwnd, (HMENU)1004, NULL, NULL);
            //Label = CreateWindowEx(WS_EX_CLIENTEDGE,"edit", "Output", WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE , 20, 523, 710, 50, Hwnd, (HMENU)1055, NULL, NULL);
     
     
     
     
     
     
     
     
            return 0;
        }
        return CallWindowProc(WndProc, Hwnd, Mes, WParam, LParam);
    }
     
     
     
     
    LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        DWORD dw = 0;
        HDC hdc;
     
     
     
        RegisterHotKey(hw, 1, MOD_CONTROL, 0x4B);
        RegisterHotKey(hw, 2, MOD_CONTROL, 0x4C);
        if (uMsg == WM_USER_UNIQUE)
        {
            HMODULE Dllh = GetModuleHandle("WowADll.dll");
            Open = (HBITMAP)LoadBitmap(Dllh, MAKEINTRESOURCE(OPENB));
            Close = (HBITMAP)LoadBitmap(Dllh, MAKEINTRESOURCE(CLOSEB));
            Edit = (HBITMAP)LoadBitmap(Dllh, MAKEINTRESOURCE(EDITB));
            Save = (HBITMAP)LoadBitmap(Dllh, MAKEINTRESOURCE(SAVEB));
     
            WNDCLASS w;
            memset(&w, 0, sizeof(WNDCLASS));
            w.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
            w.lpfnWndProc = WowAProc;
            w.hInstance = ::GetModuleHandle(NULL);
            w.hbrBackground = CreateSolidBrush(RGB(0, 0, 0));
            w.lpszClassName = "WowAClass";
            w.hCursor = LoadCursor(NULL, IDC_ARROW);
            if (!RegisterClass(&w))
            {
                MessageBox(NULL, "Canot register class", "Error", MB_OK);
                return 0;
            }
     
            BP = CreateWindow("WowAClass", (LPCTSTR)NULL, WS_CHILD, 0, 17, 500, 419, hw, (HMENU)1056, ::GetModuleHandle(NULL), NULL);
            if (!BP)
            {
                MessageBox(NULL, "Cannot create window", "Error", MB_OK);
                return 0;
            }
            hButton = CreateWindow("button", "---->", WS_CHILD | WS_VISIBLE | BS_BITMAP, 4, 0, 68, 19, hw, (HMENU)BTN, ::GetModuleHandle(NULL), NULL);
            CheckBox2 = CreateWindow("BUTTON", "Check target", WS_CHILD | WS_VISIBLE | BS_CHECKBOX | ES_CENTER, 78, 0, 68, 17, hw, (HMENU)1006, NULL, NULL);
            HFONT hFont = ::CreateFont(10, 0, 0, 0, 0, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, "Arial");
            SendMessage(CheckBox2, WM_SETFONT, (LPARAM)hFont, TRUE);
            SendMessage(hButton, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)Open);
     
     
        }
     
        return CallWindowProc(OldWndProc, hwnd, uMsg, wParam, lParam);
    }
     
    extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
    {
        switch (fdwReason)
        {
        case DLL_PROCESS_ATTACH:
            hw = GetForegroundWindow();
            if (hw != NULL)
            {
                WM_USER_UNIQUE = RegisterWindowMessage(TEXT("UI_WOWs_Launcher"));
                OldWndProc = (WNDPROC)SetWindowLongPtr(hw, GWLP_WNDPROC, (LONG_PTR)WndProc);
                PostMessage(hw, WM_USER_UNIQUE, 0, 0); // Создать контролы в окне
            }
            break;
     
        case DLL_PROCESS_DETACH:
            // detach from process
            break;
     
        case DLL_THREAD_ATTACH:
            // attach to thread
            break;
     
        case DLL_THREAD_DETACH:
            // detach from thread
            break;
        }
        return TRUE; // successful
    }


Что ему нужно непонятно
Помогите разобратся
Сообщение отредактировано: Hrap -
Буду наверное переписывать под десятку без сабклассинга
эх.......
Цитата Hrap @
НО на Windows10 никак в момент инжекта вылетает ошибка типа память не может быть read

По текстам трудно сказать, что там происходит.
Надо отлаживаться.
Ты же сам говоришь, что проблема в момент инжекта.
Значит, где-то ошибка. Которая раньше не проявлялась.
Попробуй сделать инжект каким-нибудь другим способом.
Сообщение отредактировано: ЫукпШ -
Подпись была выключена в связи с наложенным заземлением.
Цитата Hrap @
Буду наверное переписывать под десятку без сабклассинга
эх.......

А на какой конкретно строчке падает?
падает как я понял
либо при регистрации класса
либо при создании окна с этим классом
сейчас скажу точнее
Кстати, здесь https://docs.microsoft.com/en-us/windows/de...-best-practices сказано

You should never perform the following tasks from within DllMain: ....Call functions in User32.dll or Gdi32.dll. Some functions load another DLL, which may not be initialized.
Вообщем регистрация класса проходит
а вот окно не создается падает на строчке

ExpandedWrap disabled
    BP = CreateWindow(TEXT("WowAClass"), TEXT(""), WS_CHILD, 0, 17, 500, 419, hw, (HMENU)1056, ::GetModuleHandle(NULL), NULL);, NULL);


Вроде все как положено
Сообщение отредактировано: Hrap -
А зачем у тебя из WowAProc вызывается WndProc и, соответственно OldWndProc? Ты же вроде новое окно создаёшь.
Попробуй убрать всё из WowAProc(), сделай просто return DefWindowProc(.....).
да я там че токо не писал
а вот
DefWindowProc еще вроде не пробовал )
сейчас попробую
Цитата Hrap @
да я там че токо не писал

Не, ты вообще всё убери
ExpandedWrap disabled
    LRESULT CALLBACK WowAProc(HWND Hwnd, UINT Mes, WPARAM WParam, LPARAM LParam)
    {
    return DefWindowProc(hWnd.......);
    }
Сообщение отредактировано: Олег М -
УРА ЗАРАБОТАЛО!!! :huh:
таки да оказалось DefWindowProc

Просто я думал Когда инжектишь сообщения идут от дочернего окна к его создавшему вот и вызывал функцию обработки родительского окна
а та в свою очередь OldWndProc
Ну типа субординация все дела :huh:

А оказалось что все стандартно для каждого нового окна свой обработчик который никому ничего не должен

Вообщем запутался слегка

Добавлено
СПАСИБО ОГРОМНОЕ
Сообщение отредактировано: Hrap -
M
Не забываем про использование функции "Вопрос решён!"
char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;


user posted image Чат Исходников в СкайпеЧат Исходников в ДискордеНе проходим, а заходим!
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:


Рейтинг@Mail.ru
[ Script Execution time: 0,1315 ]   [ 20 queries used ]   [ Generated: 23.09.18, 14:45 GMT ]