На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное 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
                          Не забываем про использование функции "Вопрос решён!"
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0394 ]   [ 17 queries used ]   [ Generated: 16.04.24, 20:26 GMT ]