SHFileOperation (x64)

Тема в разделе "WASM.BEGINNERS", создана пользователем Semiono, 26 ноя 2011.

  1. Semiono

    Semiono New Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    752
    Код (Text):
    1. include '%fasm%/win64ax.inc'
    2. section '.code' executable
    3. start:
    4.         stdcall del,'3d_maker_embeded'
    5.         stdcall del,'Coverlabel'
    6.         stdcall del,'GeoModule'
    7.         stdcall del,'MusicEditor'
    8.         stdcall del,'Online'
    9.         stdcall del,'PhotoDesigner'
    10.         stdcall del,'Video_deluxe_MX_Premium_en-GB_SetupRes'
    11.         stdcall del,'Video_deluxe_MX_Premium_en-GB_setup.exe'
    12.         stdcall del,'Video_deluxe_MX_Premium_en-GB_SetupInfo.ini'
    13.         stdcall del,'license.txt'
    14.         stdcall del,'support.rtf'
    15. exit:
    16.         invoke ExitProcess,NULL
    17.  
    18.         FO_DELETE = 3
    19.         FOF_SILENT = 4
    20.         FOF_NOCONFIRMATION = 10h
    21.  
    22. proc del a
    23.  
    24.         sub rsp,40 ; это я так на всякий случай, толку от выравнивания не вижу пока.
    25.  
    26.         mov qword [lpFileOp.fFlags],FOF_SILENT + FOF_NOCONFIRMATION
    27.         mov qword [lpFileOp.wFunc],FO_DELETE
    28.  
    29.         invoke RtlZeroMemory,x,MAX_PATH
    30.  
    31.         invoke ExpandEnvironmentStrings,\
    32.         '%ProgramFiles(x86)%\MAGIX\Movie_Edit_Pro_MX_Premium_Download_Version\',x,MAX_PATH
    33.         invoke lstrcat,x,qword [a]
    34.         mov qword [lpFileOp.pFrom],x
    35.         invoke SHFileOperation,lpFileOp
    36.         ret
    37. endp
    38.  
    39. section '.data' readable writeable
    40.  
    41.         a rb MAX_PATH
    42.         x rb MAX_PATH
    43.  
    44. struct SHFILEOPSTRUCT
    45.  
    46.         hwnd dq NULL
    47.         wFunc dq NULL
    48.         pFrom dq NULL
    49.         pTo dq NULL
    50.         fFlags dq NULL
    51.         fAnyOperationsAborted dq NULL
    52.         hNameMappings dq NULL
    53.         lpszProgressTitle dq NULL
    54. ends
    55.         lpFileOp SHFILEOPSTRUCT
    56.  
    57. section '.idata' import readable
    58.  
    59.         library kernel32,'KERNEL32.DLL',shell32,'SHELL32.DLL'
    60.         import kernel32,\
    61.                ExitProcess,'ExitProcess',\
    62.                ExpandEnvironmentStrings,'ExpandEnvironmentStringsA',\
    63.                lstrcat,'lstrcatA',RtlZeroMemory,'RtlZeroMemory'
    64.         import shell32,\
    65.                SHFileOperation,'SHFileOperationA'
    Чё-то тишина. Код работоспособный под x86. Если напрямую записать параметр
    в самой процедуре тогда работает, правда это ни на какую мысль не наводит.
     
  2. Semiono

    Semiono New Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    752
    Помогите с программой pastebin.com/jn8FAy4G

    где-то в районе [69] как-то не стабильно работает...
    Код (Text):
    1.         mov [lpFileOp.wFunc],FO_RENAME
    2.  
    3.         invoke RtlZeroMemory,x,MAX_PATH
    4.         invoke RtlZeroMemory,y,MAX_PATH
    5.  
    6.         invoke SHGetSpecialFolderPath,NULL,x,CSIDL_PROGRAM_FILESX86,NULL
    7.         invoke lstrcat,x,'\MAGIX\Movie_Edit_Pro_MX_Premium_Download_Version'
    8.         mov [lpFileOp.pFrom],x
    9.  
    10.         invoke SHGetSpecialFolderPath,NULL,y,CSIDL_PROGRAM_FILESX86,NULL
    11.         invoke lstrcat,y,'\MAGIX\Videodeluxe'
    12.         mov [lpFileOp.pTo],y
    13.         invoke SHFileOperation,lpFileOp
    14.  
    15.         mov [lpFileOp.wFunc],FO_MOVE
    16.  
    17.         invoke RtlZeroMemory,x,MAX_PATH
    18.         invoke RtlZeroMemory,y,MAX_PATH
    19.  
    20.         invoke SHGetSpecialFolderPath,NULL,x,CSIDL_PROGRAM_FILESX86,NULL
    21.         invoke lstrcat,x,'\MAGIX\Videodeluxe'
    22.         mov [lpFileOp.pFrom],x
    23.  
    24.         invoke SHGetSpecialFolderPath,NULL,y,CSIDL_PROGRAM_FILES,NULL
    25.         invoke lstrcat,y,'\'
    26.         mov [lpFileOp.pTo],y
    27.         invoke SHFileOperation,lpFileOp
    если у меня всё правильно, тогда дело в другом значит.
    Этот код у меня копирует папку после работы MSI инсталлера, и выполняет другие задачи походу.
    Пакет огромный, поэтому нагрузка на файловую систему идёт сильная.
    Честно говоря я не понимаю почему пакет 250мб так долго и мучительно устанавливается.
    Но возможности избавиться от msi нет, поэтому я сделал как бы постинстал конфиг на асме :)
    Запускается это во время t12 установки WinXP, хотя там как бы весь набор библиотек присутствует.
    На текущей системе иногда работает иногда нет, на установке win всегда сбой.
    Хотя по моему впечатлению здесь проблемма в скорости выполнения, как бы сбой из-за сильной нагрузки на фс.
    Разве нет? Либо я плохо код написал?
    Процедур у меня здесь нет, так как с ними в x64 вообще засада, к сожалению.

    Насчёт копирования есть не очевидная на первый взгляд проблемма, если выполнить A 2 B и при этом папка B существует,
    то получиться B\A поэтому сначала идёт переименование и затем копирование.
     
  3. Semiono

    Semiono New Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    752
    Всё нормально, это msi собака rollback врубает и удаляет себя, потому что я там подпортил кое чё :)
    Значится код я написал нормально, хотя жаль что без процедур пока.