Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.224.53.202] |
|
Сообщ.
#1
,
|
|
|
Доброго времени суток
Бьюсь второй день с одной проблемой Делаю инжект Dll в игру Дилка при нажатии комбинации горячих клавиш открывает созданное при загрузке дочернее окно с дополнительными функциями Все прекрасно работает на Windows7 НО на Windows10 никак в момент инжекта вылетает ошибка типа память не может быть read притом если рисовать контролллы прямо в окне не создавая обработчик и не регистрируя класс нового окна то работает и на десятке Вот кусок кода моей DLL с сабклассингом 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 } Что ему нужно непонятно Помогите разобратся |
Сообщ.
#2
,
|
|
|
Буду наверное переписывать под десятку без сабклассинга
эх....... |
Сообщ.
#3
,
|
|
|
Цитата Hrap @ НО на Windows10 никак в момент инжекта вылетает ошибка типа память не может быть read По текстам трудно сказать, что там происходит. Надо отлаживаться. Ты же сам говоришь, что проблема в момент инжекта. Значит, где-то ошибка. Которая раньше не проявлялась. Попробуй сделать инжект каким-нибудь другим способом. |
Сообщ.
#4
,
|
|
|
Цитата Hrap @ Буду наверное переписывать под десятку без сабклассинга эх....... А на какой конкретно строчке падает? |
Сообщ.
#5
,
|
|
|
падает как я понял
либо при регистрации класса либо при создании окна с этим классом сейчас скажу точнее |
Сообщ.
#6
,
|
|
|
Кстати, здесь 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. |
Сообщ.
#7
,
|
|
|
Вообщем регистрация класса проходит
а вот окно не создается падает на строчке BP = CreateWindow(TEXT("WowAClass"), TEXT(""), WS_CHILD, 0, 17, 500, 419, hw, (HMENU)1056, ::GetModuleHandle(NULL), NULL);, NULL); Вроде все как положено |
Сообщ.
#8
,
|
|
|
А зачем у тебя из WowAProc вызывается WndProc и, соответственно OldWndProc? Ты же вроде новое окно создаёшь.
Попробуй убрать всё из WowAProc(), сделай просто return DefWindowProc(.....). |
Сообщ.
#9
,
|
|
|
да я там че токо не писал
а вот DefWindowProc еще вроде не пробовал ) сейчас попробую |
Сообщ.
#10
,
|
|
|
Цитата Hrap @ да я там че токо не писал Не, ты вообще всё убери LRESULT CALLBACK WowAProc(HWND Hwnd, UINT Mes, WPARAM WParam, LPARAM LParam) { return DefWindowProc(hWnd.......); } |
Сообщ.
#11
,
|
|
|
УРА ЗАРАБОТАЛО!!!
таки да оказалось DefWindowProc Просто я думал Когда инжектишь сообщения идут от дочернего окна к его создавшему вот и вызывал функцию обработки родительского окна а та в свою очередь OldWndProc Ну типа субординация все дела А оказалось что все стандартно для каждого нового окна свой обработчик который никому ничего не должен Вообщем запутался слегка Добавлено СПАСИБО ОГРОМНОЕ |
Сообщ.
#12
,
|
|
|
M Не забываем про использование функции "Вопрос решён!" |