Получить хэндл msvcrt.dll...

Тема в разделе "WASM.BEGINNERS", создана пользователем KingT, 11 окт 2008.

  1. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    #include <stdio.h>
    #include <windows.h>

    char buffer[10];
    int main(int argc,const char** argv)
    {
    sprintf(buffer,"hello");
    HMODULE mod = GetModuleHandle("msvcrt.dll");
    }

    Почему функция GetModuleHandle не находит модуль msvcrt.dll(GetModuleHandle возвращяет ноль)?Если запустить код в цикле и посмотреть в Process Explorer(sysinternals.com) то видно что библиотека msvcrt.dll загружена в адресное пространство процесса.Модуль kernel32.dll находится без проблем.
     
  2. slavanap

    slavanap Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    А если 2 раза подряд вызвать GetModuleHandle ?
     
  3. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    Не работает.ПОясню зачем мне это надо.Необходимо использовать в masm32 функции printf,stcpy и прочие для работы со строками.Я так понимаю нужно получить хэндл модуля,затем вызвать GetProcAddress.В принципе можно загрузить модуль(LoadLibrary) тогда GetModuleHandle возвращает хэндл.Странно.
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    KingT
    Дамп загрузчика в студию.
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    а статический импорт обычный использовать никак?

    кстати учти, что printf и другие функции ввода вывода просто так не заработают. там надо будет дернуть __io_init кажется, которая автоматически вызывается из mainCRTStartup, но у тебя придется вызывать ее явно
     
  6. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    KingT
    А GetLastError что говорит?
     
  7. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    The GetModuleHandle function returns a module handle for the specified module if the file has been mapped into the address space of the calling process. Это так, к слову. The LoadLibrary function maps the specified executable module into the address space of the calling process. Словарь в помощь.
     
  8. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    >>The GetModuleHandle function returns a module handle for the specified module if the file has been mapped into the address space of the calling process

    Функция GetModuleHandle возвращает описатель на заданный модуль если файл был промаппирован в адресное пространство вызывающего процесса.

    Вызывающий процесс это моя программа.msvcrt.dll загружен в ее адресное пространство.Это видно в в Process Explorer.И вабще она всегда наверно грузится как ntdll.dll или kernel23.dll.

    >>А GetLastError что говорит?
    Cannot find specified module.

    >>Дамп загрузчика в студию
    Загрузчик это моя программа? Как сделать ее дамп не очень понимаю.Дамп это по идее описание всего что в памяти программы лежит?Это в OllyDebug можно сделать?
     
  9. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    KingT
    Во-первых, с чего Вы вообще взяли, что эта dll там должна быть?
    Во-вторых, если Process Explorer показывает, что она действительно там есть, то это не означает, что она там есть на момент вызова GetModuleHandle. Возможно msvcrt.dll подгружается позже какой-нибудь неродной dll.
     
  10. PE_Kill

    PE_Kill New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2006
    Сообщения:
    107
    KingT функции CRT есть в инклудах для статического импорта и идут в стандартной поставке с masm32 начиная с 9й версии.

    Почему не возвращается хэндл легко проверить. Выведите MessageBox перед вызовом GetModuleHandle и посмотрите есть ли на тот момент msvcrt.dll в процессе. Если умеете пользоваться отладчиком то еще проще, можно посмотреть стоя перед вызовом GetModuleHandle список загруженых модулей.

    Это заблуждение. Всегда грузятся лишь те DLL, которые нужны загрузчику, функции CRT загрузчику никак не нужны, скорее наоборот это для msvcrt.dll нужны ntdll.dll или kernel32.dll

    Наиболее вероятная ситуация в вашем случае это: