Распарсить путь к файлу (какая ф-ция АПИ ?)

Тема в разделе "WASM.BEGINNERS", создана пользователем gershkovich, 29 ноя 2006.

  1. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    Всем привет!

    Какая есть функция АПИ для того чтоп распарсить путь к файлу ?
    Чтоп из него отдельно получить имя файла, путь и букву диска ?

    Я помню что такая есть, но забыл как называется.

    Заранее спасибо.
     
  2. Miller Rabin

    Miller Rabin New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2006
    Сообщения:
    185
    За то время, которое ты ждешь ответа на этот вопрос. Уже можно было самому такую функцию написать.
    Она элементарная.
    Со строками, что ли не умеешь работать? :)

    FilePath - полное имя файла с путем
    FilePathLength - длина строки

    mov edi, FilePath
    mov ecx, FilePathLength
    std
    add edi, ecx
    mov al, '\'
    repne scasb
    lea esi, [edi-1]

    ВСЕ!!!
    С одной стороны получил имя файла. С другой стороны путь к нему

    По поводу буквы диска еще хуже
    Если второй символ ':', то первый символ, буква диска.

    Блин. :@
     
  3. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    Спасибо.
    Действительно просто...
    Правда некоторые инструкции непонятны (std, scasb)
    Но буду разбираться.

    А все таки - какая есть АПИ ф-ция ?
    Просто ради интереса...
     
  4. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    gershkovich
    Если ты имел в виду функции С, то в Visual C++ и Builder, например:

    Header File
    stdlib.h

    Category
    Directory Control Routines

    Prototype
    void _splitpath(const char *path, char *drive, char *dir, char *name, char *ext);
    void _wsplitpath(const wchar_t *path, wchar_t *drive, wchar_t *dir, wchar_t *name, wchar_t *ext);
     
  5. Cigan

    Cigan New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2003
    Сообщения:
    54
    Адрес:
    Моск.обл
    Вообщемто GetCommandLine и GetModuleFIleName
     
  6. green_newbie

    green_newbie New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2006
    Сообщения:
    51
    Смотрите в мсдн функции Path... (напр. PathGetShortPath)
     
  7. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    при самостоятельной работе со строками которые сгенерированы или введены вручную есть разные ньюансы, которые нужно учитывать, например, такие пути допустимы в винде:
    d:\fasm/include/apia.inc
    d:\\fasm\\fasmw.exe
    d:application.exe
    ===
    и даже такие:
    d:\\\\fasm\\\\\fasmw.exe
    d:/\/\/fasm\/\/\/\fasmw.exe
     
  8. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    Miller Rabin,
    похоже что не все так просто.
     
  9. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Если этот код для Windows, то надо восстановить флаг направления:
    Код (Text):
    1. mov edi, FilePath
    2. mov ecx, FilePathLength
    3. std
    4. add edi, ecx
    5. mov al, '\'
    6. repne scasb
    7. lea esi, [edi-1]
    8. cld    ; Restore direction flag
     
  10. IceStudent

    IceStudent Active Member

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

    Semiono New Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    752
    Код (Text):
    1. include '%fasm%\win32ax.inc'
    2. section '.code' executable
    3. start:
    4.         mov edi,FilePath
    5.         mov ecx,MAX_PATH ;$-FilePath ;FilePathLength
    6.         std
    7.         add edi,ecx
    8.         mov al,'\'
    9.         repne scasb
    10.         lea esi,[edi-1]
    11.         cld ; Restore direction flag
    12.         invoke MessageBox,NULL,FilePath,edi,MB_OK
    13. exit:
    14.         invoke ExitProcess,NULL
    15.  
    16. .end start
    17.  
    18. section '.data' readable
    19.  
    20.         FilePath db 'C:\Folder\Folder\virus.exe',NULL
    Результат: буква от папки + слеш + имя файла, почемууу?
    :dntknw:
     
  12. Semiono

    Semiono New Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    752
    Готово!
    Код (Text):
    1. include '%fasm%\win32ax.inc'
    2. section '.code' executable
    3. start:
    4.         invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows NT\CurrentVersion\Winlogon',NULL,KEY_READ,phkResult
    5.         invoke RegQueryValueEx,[phkResult],'shell',NULL,NULL,lpData,lpcbData
    6.         invoke RegCloseKey,[phkResult]
    7.         invoke PathStripPath,lpData
    8.         invoke MessageBox,NULL,lpData,'',MB_OK
    9. exit:
    10.         invoke ExitProcess,NULL
    11.  
    12. section '.data' readable writable
    13.  
    14.         lpData db MAX_PATH dup NULL
    15.         lpcbData dq MAX_PATH
    16.         phkResult dd NULL
    =)
     
  13. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    по первому коду:
    1.непонятно, почему ты прибавляешь к edi MAX_PATH, если неизвестно, что у тебя находится после конца строки, которая явно меньше, чем MAX_PATH?

    2.в чем смысл команды lea esi,[edi-1]? edi после поиска должно показывать на 'r\virus.exe',NULL , а esi, таким образом, на 'er\virus.exe',NULL
     
  14. Semiono

    Semiono New Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    752
    1. Меня вообще возмущает как правило тупое требование - длина буффера для пути который читается из реестра, если б я его знал зачем тогда парсить. Пробовал $-... но наверное не так как надо, не получилось. А что кроме MAX_PATH лучше придумать можно. :)

    2. Код написал автор выше.
    Я вообще команду LEА боюсь, и регистра edi тоже. Дальше eax не лезу никогда. ))
     
  15. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Не хотелось бы портить всю малину, но в MSDN есть куча оговорок на тему, что "если имя файла имеет вид \\.\дальше-попёрла-всякая-хрень", то всё становится намного грустнее. Это не говоря уже про имена файлов в сетях Микрософт. ИМХО имена файлов надо парсить с конца.
     
  16. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    аха.
    есть ещё потоки в NTFS. Превед Крису ;) , хотя он в Америке не слышит.
    тада.
    Код (Text):
    1. бла-бла\файлнейм.расширение:ИМЯ_ПОТОКА
     
  17. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    paralvic
    Ну потоки, положим, есть только на одной ФС, стандартными способами до них добраться непросто да и по большому счёту конечному пользователю они не нужны совершенно. А вот файлы в локальной сети нифига не редкость.
     
  18. Semiono

    Semiono New Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    752
    Меня спасёт то, что я не буду ...\explorer.exe по сети запускать )
     
  19. Semiono

    Semiono New Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    752
    А как сохранять правильно переменную, чтоб не модифицировалось...
    Я зделал тупо, дважды вызвав чтение из реестра

    Код (Text):
    1.         invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows NT\CurrentVersion\Winlogon',\
    2.                NULL,KEY_READ,phkResult
    3.         invoke RegQueryValueEx,[phkResult],'shell',NULL,NULL,lpDir,lpcbData
    4.         invoke RegCloseKey,[phkResult]
    5.         invoke PathRemoveFileSpec,lpDir
    6.  
    7.         invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows NT\CurrentVersion\Winlogon',\
    8.                NULL,KEY_READ,phkResult
    9.         invoke RegQueryValueEx,[phkResult],'shell',NULL,NULL,lpFile,lpcbData
    10.         invoke RegCloseKey,[phkResult]
    11.         invoke PathStripPath,lpFile
    Наверное надо было просто PUSH / POP сохранить? А как? %)

    Всмысле у меня идут PathStripPath и PathRemoveFileSpec на одну и ту же переменную.
    Или так нормально?
     
  20. Semiono

    Semiono New Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    752
    offtop: зачищаем окна
    Код (Text):
    1.         invoke FindWindow,'#32770','rundll32.exe - Application Error'
    2.         invoke SendMessage,eax,WM_COMMAND,(0 shl 16) or IDOK,NULL
    =)