Получить имя самого себя

Тема в разделе "WASM.BEGINNERS", создана пользователем maestro-ant, 5 ноя 2006.

  1. maestro-ant

    maestro-ant Member

    Публикаций:
    0
    Регистрация:
    23 июл 2006
    Сообщения:
    112
    Как получить имя самого себя (файла exe), чтоб не парсить результаты работы GetModuleFileName?
     
  2. BUGOR

    BUGOR New Member

    Публикаций:
    0
    Регистрация:
    14 авг 2005
    Сообщения:
    44
    Пойдёт?:)

    Код (Text):
    1. .data?
    2.     MyName db 32 dup(?)
    3. .code  
    4. start:
    5.     call GetCurrentProcessId
    6.    
    7.     push offset MyName
    8.     push eax
    9.     call IsModule
    10.    
    11.     push 0
    12.     call ExitProcess
    13.  
    14. IsModule proc lpPID:DWORD,Buffer:DWORD
    15. local hSnapshot: DWORD
    16. local Module: MODULEENTRY32
    17.     mov Module.dwSize, sizeof MODULEENTRY32
    18.    
    19.     invoke CreateToolhelp32Snapshot,TH32CS_SNAPMODULE,lpPID
    20.     mov hSnapshot,eax
    21.     invoke Module32First, hSnapshot, addr Module
    22.     invoke lstrcpy, Buffer, addr Module.szModule
    23.     invoke CloseHandle, hSnapshot
    24.     ret
    25. IsModule endp
    Но что-то мне подсказывает, что имя исполняемого модуля есть где-то в пебе...
     
  3. maestro-ant

    maestro-ant Member

    Публикаций:
    0
    Регистрация:
    23 июл 2006
    Сообщения:
    112
    ...это немного нето, слишком уж громоздко
     
  4. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    GetCommandLine
     
  5. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    да вроде такой апи нет, но можно ещё и так, и я думаю парсинг, это чересчур громкое название для rep cmpsb :)
    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4.  
    5.  
    6. include kernel32.inc
    7.  
    8. includelib kernel32.lib
    9.  
    10. .data
    11.    
    12.     buf db 256 dup (?)
    13.     buf2 db 256 dup (?)
    14.     pFileName dd ?
    15. .code
    16. start:
    17.  
    18.     invoke GetModuleHandle,0
    19.     invoke GetModuleFileName,eax,offset buf,256
    20.     invoke GetCurrentDirectory,256,offset buf2
    21.    
    22.     mov esi,offset buf2
    23.     mov edi,offset buf
    24.     mov ecx,-1
    25.     repe cmpsb
    26.     mov pFileName,edi
    27.    
    28.     invoke ExitProcess,0
    29. end start
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    maestro-ant
    Что значит, не парсить? Отделить путь от имени файла? Это так сложно, да? :)
     
  7. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    смотри мсдн
     
  8. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    include \masm32\include\comdlg32.inc
    ...
    invoke GetModuleFileName, 0, offset File_Name, 255
    invoke GetFileTitle, offset File_Name, offset File_Name, 255
    invoke CharLower, offset File_Name ; а то GetFileTitle лепит имя файла заглавными бкувами ;)))
     
  9. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    дык смотрел канешн, но не нашёл :-( посему и наваял тот сорец
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    GetCommandLine есть даже в старом добром MS Help, параметров не имеет, возращает указатель на строку параметров переданных в командной сторке, правда что-то я не слышал, чтобы с её помощью имя файла самой программы передавалось :)))
     
  11. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    Попробуй, посмотри что там в строке в самом начале :)
     
  12. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    Y_Mur,FreeManCPM
    так ребята.. , GetCommandLine конечно же я видел потому что уж оч насто эта ф-ция везде мелькает, а не нашёл я именно GetFileTitle, а насёт сего:
    тут есть камень подводный, даже аж 2:
    1) если с консоли запусткать то всё ок, а вот если каким-нить проводником или олькой открыть то там будет что-то типа "с:\path\binary.exe -param1 -param2" (указатель указывает на кавычку)
    2) даже если в консоли имя бинарника содержит в себе пробел, то запустить его можно только заключив имя в кавычки, в результате опять облом
    так что говорить о том, что GetCommandLine возвращает указатель на имя бинарника не совсем коректно.
     
  13. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Посмотрел ;) в Win98 полный путь как в GetModuleFileName, только изуродованный форматом 8.3 ;), в XP имя + путь как в GetModuleFileName, так что как самостоятельное получение имени файла не катит - тут его не только от пути, но и от параметров чистить (в смысле парсить :))) треба, да и с "мильтивиндовостью" промах ;)
     
  14. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    BUGOR
    В NT есть и полный путь и короткое имя (в юникоде), но не в самом PEB, а в первой записи LDR_DATA.InLoadOrderModuleList. Как добраться см. Об упаковщиках, KmdKit и т.п.
     
  15. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    leo
    А в ProcessParameters разве нет?
    Код (Text):
    1.  mov eax, fs: [18h]
    2.  mov eax, [eax+30h]
    3.  mov eax, [eax+10h]
    4.  lea eax, [eax+38h]
    5.  mov eax, [eax+4h]
    В eax указатель на ImageName, в юникоде естественно.
     
  16. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Есть, причем строки из LDR как раз и ссылаются на ProcessParameters ;)
    Просто c LDR я как-то ковырялся по другому поводу, а до ProcessParameters руки не дошли ;)
     
  17. Udzhen

    Udzhen New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    25
    Адрес:
    Russia
    Обратите внимание на семейство функций с префиксом Path библиотеки shlwapi.dll.
    Код (Text):
    1. #pragma comment(lib, "shlwapi.lib")
    2. #include <shlwapi.h>
    3.  
    4. TCHAR szModuleFileName[MAX_PATH];
    5.  
    6. if (!GetModuleFileName(NULL, szModuleFileName, sizeof(szModuleFileName)))
    7.     return FALSE;
    8.  
    9. // Если необходимо получить имя файла без расширения раскомментируйте строку ниже...
    10. //PathRemoveExtension(szModuleFileName);
    11.  
    12. TRACE(PathFindFileName(szModuleFileName));
     
  18. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    Udzhen точно!
     
  19. Udzhen

    Udzhen New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    25
    Адрес:
    Russia
    Да, и кроме того, я где то читал (не могу вспомнить где), что Microsoft настоятельно рекомендует использовать эти функции для работы с файловыми путями, т.к. это сохранит совместимость с новыми версиями ОС в которых формат файловых путей может быть изменен (хотя я сомневаюсь что это может произойти)...

    P.S.
    Кстати, если я не ошибаюсь, то в семействе этих функций так же есть функции для парсинга/модификации командной строки полученной, например, с помощью GetCommandLine.
     
  20. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Udzhen
    CommandLineToArgvW