На главную Наши проекты:
Журнал   ·   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.
  
> uintptr_t vs HMODULE в GetModuleHandle()
    Добрый день.

    Есть некий пример кода, где результат работы GetModuleHandle() сохраняется в переменную типа uintptr_t. Если сохранять его в HMODULE (как на msdn) и использовать дальше - приложение крашится.

    Без примеров кода, кто-нибудь может порассуждать на эту тему?

    Почему GetModuleHandle() способна свой результат сохранять в переменной uintptr_t, вместо HMODULE?

    PS: весь код под win10, x86 app, msvs 2017.
      Способна, наверное, потому, что sizeof(uintptr_t) = sizeof(void*). А пример ломающегося кода лучше уж выложите, - там и посмотрим, в чём поломка. ;)
        Цитата barberan @
        Если сохранять его в HMODULE (как на msdn) и использовать дальше - приложение крашится.

        Без примеров кода, кто-нибудь может порассуждать на эту тему?

        Совсем без примера я не хочу.
        Ты сам попробуй сделать такой пример:
        ExpandedWrap disabled
          HMODULE   aH =  ::GetModuleHandle(NULL);
          uintptr_t uH = (uintptr_t)::GetModuleHandle(NULL);
           
          _tprintf(_T("aH=0x%p uH=0x%p\n"),aH,uH);
           
          ++aH;
          ++uH;
          _tprintf(_T("aH=0x%p uH=0x%p\n"),aH,uH);
        Сообщение отредактировано: ЫукпШ -
          Рассуждаю: в текущей версии вашей библиотеки HMODULE есть некое число, которое совпадает по размерности с указателем (или является указателем). В следующей версии авторы библиотеки захотят сделать HMODULE структурой, хранящей кучу дополнительной информации. Код, использующий явное приведение типа к uintptr_t, будет компилиться с новой версией вашей библиотеки, но работать не будет и вы потратите непредсказуемо большое количество времени на поиск причины.
          Сообщение отредактировано: Dushevny -
            Суть дела - я делаю inject dll и хочу вызвать свою ф-цию в моем .ехе файле из своей dll.

            Суть основного вопроса как раз в коде DLL, в теле потоковой ф-ции ThreadProc()
            Вот пример:

            Есть DLL:
            ExpandedWrap disabled
              #include <windows.h>
               
              typedef int (__stdcall *_funcA)();
              _funcA funcA;
              DWORD WINAPI ThreadProc(LPVOID lpParameter)
              {      
                      // если написать: HMODULE hBaseAddr = (uintptr_t)GetModuleHandle(NULL); - то все упадет, но я не понимаю почему
                  uintptr_t  hBaseAddr = (uintptr_t)GetModuleHandle(NULL);
                  funcA = (_funcA)(hBaseAddr + 0x11730);
                  funcA();
                  return 0;
              }
               
              BOOL WINAPI DllMain(
                  HINSTANCE hinstDLL,  // handle to DLL module
                  DWORD fdwReason,     // reason for calling function
                  LPVOID lpReserved)  // reserved
              {
                  // Perform actions based on the reason for calling.
                  switch (fdwReason)
                  {
                  case DLL_PROCESS_ATTACH:
                      CreateThread(0, 0, ThreadProc, hinstDLL, 0, 0);
                      break;
               
                  case DLL_THREAD_ATTACH:
                      // Do thread-specific initialization.
                      break;
               
                  case DLL_THREAD_DETACH:
                      // Do thread-specific cleanup.
                      break;
               
                  case DLL_PROCESS_DETACH:
                      // Perform any necessary cleanup.
                      break;
                  }
                  return TRUE;  // Successful DLL_PROCESS_ATTACH.
              }


            Есть EXE, ф-цию которого я вызываю:

            ExpandedWrap disabled
              #include <stdio.h>
              #include <windows.h>
               
              int funcA(void)
              {
                  const char * s = "for b";
                  printf("Message from FuncA()\n");
                  return 0;
              }
               
               
              int main(void)
              {
                      funcA();
                      getchar();
                  return 0;
              }
              Цитата barberan @
              Суть дела - я делаю inject dll и..

              Есть DLL:
              ExpandedWrap disabled
                      
                        // если написать: HMODULE hBaseAddr = (uintptr_t)GetModuleHandle(NULL); - то все упадет, но я не понимаю почему

              Чтобы понять разницу напиши такой тест - это же не сложно:
              ExpandedWrap disabled
                int __cdecl _tmain(void)
                {
                 _tprintf(_T("Hello, world!\n"));
                 
                HMODULE aH =  ::GetModuleHandle(NULL);
                uintptr_t uH = (uintptr_t)::GetModuleHandle(NULL);
                 
                _tprintf(_T("aH=0x%p uH=0x%p\n"),aH,uH);
                 
                aH += 0x11730;
                uH += 0x11730;
                 
                _tprintf(_T("aH=0x%p uH=0x%p\n"),aH,uH);
                }
                Да, я уже понял, спасибо
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0340 ]   [ 16 queries used ]   [ Generated: 28.03.24, 08:21 GMT ]