Функция SHFileOperation - вызов из консольного приложения

Тема в разделе "WASM.BEGINNERS", создана пользователем Adrax, 18 фев 2007.

  1. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    Вот код:
    Код (Text):
    1. format PE console
    2. include 'win32axp.inc'
    3. include 'shellapiA.inc'
    4.  
    5. .data
    6. ns dd ?
    7. hout dd ?
    8. buffer db 262 dup (?)
    9. help db 'Usage: shdel.exe path_to_file',0
    10. Retry db 'Program fails. Please, retry',0
    11.  
    12. sh _SHFILEOPSTRUCT NULL,FO_DELETE,NULL,NULL,FOF_SILENT or FOF_FILESONLY or FOF_NOCONFIRMATION,NULL,NULL,NULL
    13.  
    14. .code
    15. fuck:
    16. invoke GetStdHandle,STD_OUTPUT_HANDLE
    17. mov [hout],eax
    18. invoke GetCommandLine
    19. mov esi,eax
    20. cycle1:
    21.  cmp byte [esi],20h
    22.  je parameter
    23.  cmp byte [esi],0Dh
    24.  je najobka
    25.  inc esi
    26.  jmp cycle1
    27. parameter:
    28.  mov edi,buffer
    29.  mov ecx,260
    30.    cycle2:
    31.      inc esi
    32.      mov al,byte [esi]
    33.      cmp al,0Dh
    34.      je konets
    35.      mov byte [edi],al
    36.      inc edi
    37.      loop cycle2
    38.  
    39. konets:
    40.   mov word [edi],0
    41.   invoke lstrlen,buffer
    42.   test eax,eax
    43.   jz najobka
    44.  
    45. mov eax,buffer
    46. mov [sh.pFrom],eax
    47. invoke SHFileOperation,sh
    48. test eax,eax
    49. jz exit
    50.  
    51. retry:
    52.  invoke WriteConsole,[hout],Retry,28,ns,NULL
    53.  
    54.  
    55. exit:
    56.  invoke ExitProcess,0
    57.  
    58. najobka:
    59.  invoke WriteConsole,[hout],help,29,ns,NULL
    60.  jmp exit
    61.  
    62. .end fuck
    Структуру _SHFILEOPSTRUCT определяю в отдельной инклуде
    Код (Text):
    1. struct _SHFILEOPSTRUCT
    2.   hwnd     dd ?
    3.   wFunc    dd ?
    4.   pFrom    dd ?
    5.   pTo      dd ?
    6.   fFlags   dd ?
    7.   fAnyOperationsAborted dd ?
    8.   hNameMappings    dd ?
    9.   lpszProgressTitle   dd ?
    10. ends
    11.  
    12. FO_MOVE = 1h
    13. FO_COPY = 2h
    14. FO_DELETE = 3h
    15. FO_RENAME = 4h
    16.  
    17. FOF_MULTIDESTFILES = 1h
    18. FOF_CONFIRMMOUSE = 2h
    19. FOF_SILENT = 4h
    20. FOF_RENAMEONCOLLISION = 8h
    21. FOF_NOCONFIRMATION = 10h
    22. FOF_WANTMAPPINGHANDLE = 20h
    23. FOF_ALLOWUNDO = 40h
    24. FOF_FILESONLY = 80h
    25. FOF_SIMPLEPROGRESS = 100h
    26. FOF_NOCONFIRMMKDIR = 200h
    Получаю в eax 402h - что не так?
     
  2. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    Ну неужели трудно скомпилить этот код и подсказать мне, в чём косяк??
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Adrax
    скомпилить этот код не трудно, не хватает информации:
    1) ос;
    2) полное имя исполняемого файла;
    3) передаваемый параметр.
     
  4. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    WinXP SP1 Pro Rus
    FASM 1.67.12
    Файл обзываю shdel.exe, передаю и путь к файлу, и имя файла, лежащего в текущей директории - одна и та же ошибка
     
  5. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    А ты сам лучше с дебаггерами подружись.
    *...и опыт - сын ошибок трудных...*(с)
    а так ошибка в парсере - в коммандной строке нету CR/LF (CR в данном случае).
    А вообще лучше взять готовый парсер, если не хочешь возиться с ним ибо очень много мелочей тама - типа ["] в параметрах-строках, содержащих пробелы. Короче Оля тебе в помощь, а так код симпатичный и без видимых) изъянов.
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Adrax
    Ответ на 1-ый вопрос ясен.
    Ответы на 2-ой и 3-тий вопросы не получил, поэтому спрошу по-другому.
    Покажи строчку, которая содержится по адресу, который вернула GetCommandLine, в ней я надеюсь увидеть _полное_ имя исполняемого файла и пераданный(ые) параметр(ы).
     
  7. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    2 asmfan
    Поподробнее, плиз, про CR - разве он там нужен? Я формирую чисто строку пути-имени с терминальным нулём - большинству файловых API так и надо! А что, SHFileOperation требует CR (0Dh)?? Это многое объяснило бы...
     
  8. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Итак, по порядку
    FOF_FILESONLY - Performs the operation only on files if a wildcard filename (*.*) is specified.
    Вывод - флаг излишен.
    Код
    Код (Text):
    1. cycle1:
    2.  cmp byte [esi],20h
    3.  je parameter
    4.  cmp byte [esi],0Dh
    5.  je najobka
    6.  inc esi
    7.  jmp cycle1
    0Dh - он самый CR, которого в нормальной коммандной строке не встретить.
    Далее - потрейс Олей с различными параметрами коммандной строки и увидишь, что её вид различен:
    Пример
    ["D:\yourapp.exe" ]
    ["D:\yourapp.exe" D:\somedir\somefile.ext]
    ["D:\yourapp.exe" D:\somedir\somefile.ext "D:\som edir2\somefile2.ext" D:\somedir\somefile.ext]
    Это всё командные строки. И парсить аргументы надо по-разному, т.к. фигурируют пробелы, ["]...
    В общем поиск парсеров и работа с Олей - и бедет тебе опыт
     
  9. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    2 asmfan
    Простейший код пишу - т.е. параметром передаю имя или путь одного файла, либо маску...
    А по поводу CR и LF - они в командной строке есть! В Оле и гонял код... Парсер командной строки писал самостоятельно, уж изволь...
    С DeleteFile всё получается просто идеально, а к SHFileOperation никак не пристроюсь...
     
  10. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Как их увидеть тогда?)
    Выкладываю свои парсеры. Просто драг'н'дроп файлы на экзешку и посмоти результат. Всё в одну строку без CR/LF или их комбинаций. В общем серия экспериментов и результат будет, и кстати Оля иногда некорректно высталяет коммандную строку, когда параметры на дефолте - сам убедись:
    ["D:\yourapp.exe" ] - так должно быть (или не должно;), но есть в Виндоуз).
    ["D:\yourapp.exe"] - так выставляет Оля.
    Разница в символе 20h перед 0.
     
  11. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    2 asmfan
    Оля показывает CR и LF символами псевдографики, и они реально просачиваются в строки... Не знаю, как в случае с GetCommandLine, но ReadFile/ReadConsole считывает строку с ними - я с ориентиром на них и писал свой парсер...
    За твои парсеры спасибо - поизучаю