Модульная установка Total Commander

Тема в разделе "WASM.PROJECTS", создана пользователем edemko, 24 окт 2010.

  1. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Привет.
    Наверняка слыхали об PadarokEdition и тд. паках.
    Достоинством их есть большой набор программ.
    Тягостью - частая несовместимость с интересами конечного пользователя, которому вы чините компютер, или чегось свое.
    Понятно можно один раз установить тот *.msi или *.exe(sfx), удалить ненужное и запаковать обычным zip.
    Обновляя конкретную софтину, приходится перепаковывать весь архив.
    Было [позавчерашней безсонной ночи] решено:
    -предоставить возможность выбора устанавливаемых компонентов
    -максимально упростить наращивание
    -никаких установщиков, писанины
    ...
    -то все слова, ниже расписан короткий алго программы, которую вы найдете в архиве пустышке - прототипе оригинального на нашей машине

    Запускаясь, тулзо ищет каталог "+", да, тот в который все и свалим, но систематично.
    Не найдя, висит в памяти и вникает из экрана вам в глаза кнопочкою "давай с начала".
    Заходит в тот каталог, перелистывает в нем все папки(так мы сортируем софт по категориям).
    Начинает лезть в каждую, спускаясь только на 1 этаж низ, в поисках файлика *.zip(сбрасывается ковырянием сорца).
    Аккуратным движением DWORD'a ищет одноименный *.txt файл-описание.
    С соображений экономии читает до 4095+1 байт.
    Выводим элемент в список, ассоциируя с ним тот коммент.
    Также показываем размер файла.
    Наконец, выходим из "+" для возможности рескана.

    Никаких файлов настроек, что и как запускать нас тоже не интерисует - мы автомата.
    Регистрация всего набора тулзочек - см. архив...
    Устал и не сделал последнее - установку, состоящую из циклического подсвечивания активного элемента и вызывания розархиватора, открытия папки назначения.
    ТС поддерживает запуск за конкретным файлом настроек - это весь фокус.
    Для этого нужен лончер(запускалка), в нас это totalcmd+.exe с вызовом ShellExecute.
    По понятным причинам в архив не кидал.

    Для компиляции нужен только фасм и этот файл.
    Прежде установите значение LNG на 1 из 4 языков(сейчас там LNG equ UA).
    Код (Text):
    1. тут был старый код - поэтому удален, обновленный смотри ниже
    Зачем это? - хз, но так проще.
     
  2. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    В этой версии появился установщик.
    Код (Text):
    1. тут был старый код - поэтому удален, обновленный смотри ниже
     
  3. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Добавлено возможность создания запускалки.
    У меня вопрос: IMAGE_DOS_HEADER.MinimumExtraParagraphs - где бы они располагались в ОЗУ?(см. метку "SCRATCH:")
    Переделывая сорсе, не используйте(осторожно используйте) "db ?", "rb x" тд:
    http://board.flatassembler.net/topic.php?t=12098
    http://board.flatassembler.net/topic.php?t=12098&start=9

    Удалил старый код: создание запускалки теперь максимально упрощено
    Код (Text):
    1. ;/*
    2. ;enu: Modular Total Commadner - installer for the Total Commander(www.ghisler.net).
    3. ;
    4. ;     On start it searches for a "totalcmd.zip" and its comment file - "totalcmd.zip.txt".
    5. ;     If found(comments are not important actually), it will be reflected in the package list.
    6. ;     Then it looks for a "+\" folder.
    7. ;     If found, lists all its subfolders(depth level=1) and files of those subfolders.
    8. ;     Matching a file or a folder with an exeption to *.txt files, "+\%FOLDER%.txt" for folders and "+\%FOLDER%\%FILE%.txt" will be read(up to 4096-1 bytes) if found as respective comments.
    9. ;
    10. ;     On setup original TC gets extracted into "%DESTINATION%\totalcmd\" and the rest from "+\" - into "%DESTINATION%\totalcmd\+\".
    11. ;     We use Igor Pavlov's free for use archiver: 7zG.exe, 7z.dll(www.7-zip.org).
    12. ;
    13. ;     You need "totalcmd.zip" installed only whenever basical service level required.
    14. ;
    15. ;     You might want creating your own tool set:
    16. ;     -install original Total Commander
    17. ;     -pack "%commader_path%\" directory's contents into "totalcmd.xxx"(any file type, supported by 7zG.exe)
    18. ;     -add some cosmetics :) if needed, creating "+\" folder and its subfolders("archivers", "editors", etc just not to mesh)
    19. ;                                       put packed programs you want to those subfolders
    20. ;                                       create respective comment files(described over)
    21. ;     -a sample:
    22. ;              7zG.exe
    23. ;              7z.dll
    24. ;              mtc.exe
    25. ;              -------
    26. ;              totalcmd.zip
    27. ;              totalcmd.zip.txt
    28. ;              +\
    29. ;                arch\
    30. ;                  file1.rar
    31. ;                  file1.rar.txt
    32. ;                  ...
    33. ;                compute\
    34. ;                  file1.7z
    35. ;                  file1.7z.txt
    36. ;                  file2.7z
    37. ;                  file2.7z.txt
    38. ;                  ...
    39. ;                ...
    40. ;
    41. ;     You are free modifying this tool source(mtc.asm). Use fasm(www.flatAssembler.net) to compile it.
    42. ;
    43. ;     Contact email: edemko@rambler.ru
    44. ;
    45. ;rus: Modular Total Commander - установщик Total Commander(www.ghisler.net).
    46. ;
    47. ;     Запускаясь, ищет файл "totalcmd.zip" и соответствующий комментарий к нему - "totalcmd.zip.txt".
    48. ;     Найдя, добавляет в список пакетов установки.
    49. ;     Ищет папку "+\", найдя входит в нее и перелистывает все подпапки, считывая соответствующие комментарии к ним - "%ПАПКА%.txt".
    50. ;     Заходит в каждую "+\%ПАПКУ%\"(далее не ходит :) и добавляет все имеющиеся файлы в список пакетов установки.
    51. ;     Соответственно комментарий к файлу с папки "+\%ПАПКУ%\" будет "+\%ПАПКУ%\%ФАЙЛ%.txt".
    52. ;     Поскольку *.txt-файлы - комментарии, их мы не добавляем(только читаем до 4096-1 байт).
    53. ;
    54. ;     В процессе установки оригинальний TC розархивируется в "%ВЫБРАННЫЙ КАТАЛОГ%\totalcmd\", а
    55. ;     все остальное - в "%ВЫБРАННЫЙ КАТАЛОГ%\totalcmd\+\".
    56. ;     Данная версия использует вольный архиватор Игоря Павлова: 7zG.exe, 7z.dll(www.7-zip.org).
    57. ;
    58. ;     Для стандартных функций хватит оригинального "totalcmd.exe", никаких сторонних продуктов можно не устанавливать.
    59. ;
    60. ;     Расширять комплекс очень легко:
    61. ;     -установите оригинальный Total Commander
    62. ;     -упакуйте все содержимое директории "%commander_path%\" в "totalcmd.xxx"(любой тип архивов, поддерживаемый 7zG.exe).
    63. ;     -за желанием создайте папку "+"(так мы классифицируем ПО), а в ней еще подпапки("архиваторы", "редакторы", чего угодно)
    64. ;                  в подпапки положите заархивированные программы на ваш вкус
    65. ;                  создайте файлы описаний(см. выше про *.txt)
    66. ;     -пример: 7zG.exe
    67. ;              7z.dll
    68. ;              mtc.exe
    69. ;              -------
    70. ;              totalcmd.zip
    71. ;              totalcmd.zip.txt
    72. ;              +\
    73. ;                arch\
    74. ;                  file1.rar
    75. ;                  file1.rar.txt
    76. ;                  ...
    77. ;                compute\
    78. ;                  file1.7z
    79. ;                  file1.7z.txt
    80. ;                  file2.7z
    81. ;                  file2.7z.txt
    82. ;                  ...
    83. ;                ...
    84. ;
    85. ;     Для сборки программы-установщика нужен только этот(mtc.asm) файл и fasm(www.flatAssembler.net).
    86. ;
    87. ;     Мой почтовый ящик: edemko@rambler.ru.
    88. ;*/
    89.  
    90.  
    91.  
    92.  
    93.  
    94.  
    95.  
    96.  
    97. format pe gui 4.0; on '..\stub\stub.exe'
    98. include 'win32ax.inc'
    99.  
    100.  
    101. LNG equ RU
    102.  
    103. match =BY,LNG{
    104.   include 'encoding\win1251.inc'
    105.  
    106.   STRING1 equ 'Дадатковыя архівы(<ctrl+m1> для выбару):'
    107.   STRING2 equ 'Каментарый(глядзі файлы *.txt):'
    108.   STRING3 equ 'Мэтавая тэчка(напр. c:\programs\, клік для выбару):'
    109.   STRING4 equ 'Абнавіць'
    110.   STRING5 equ 'Паехалі'
    111.   STRING6 equ 'Карэгаваць старт "totalcmd.exe":';
    112. }
    113.  
    114. match =EN,LNG{
    115.   STRING1 equ 'Detected packages(<ctrl+m1> to un|select):'
    116.   STRING2 equ 'Comment from respective .txt file:'
    117.   STRING3 equ 'Destination(e.g. c:\programs\), click to chose:'
    118.   STRING4 equ 'ReLoad'
    119.   STRING5 equ 'Start'
    120.   STRING6 equ 'Command line for "totalcmd.exe":'
    121. }
    122.  
    123. match =RU,LNG{
    124.   include 'encoding\win1251.inc'
    125.  
    126.   STRING1 equ 'Дополнительные архивы(<ctrl+m1> для выбора):'
    127.   STRING2 equ 'Комментарий(смотри файлы *.txt):'
    128.   STRING3 equ 'Целевая папка(напр. c:\programs\, клик для выбора):'
    129.   STRING4 equ 'Обновить'
    130.   STRING5 equ 'Поехали'
    131.   STRING6 equ 'Командная строка "totalcmd.exe":'
    132. }
    133.  
    134. match =UA,LNG{
    135.   include 'encoding\win1251.inc'
    136.  
    137.   STRING1 equ 'Додаткове ПЗ(<ctrl+m1> обрати):'
    138.   STRING2 equ 'Коментар з *.txt-файлу:'
    139.   STRING3 equ 'Папка призначення(напр. c:\programs\, клік - обрати):'
    140.   STRING4 equ 'Оновити'
    141.   STRING5 equ 'Запуск'
    142.   STRING6 equ 'Командний рядок "totalcmd.exe":'
    143. }
    144.  
    145. STRING7 equ '/i=%COMMANDER_PATH%\+\tc\ini\wincmd.ini /f=%COMMANDER_PATH%\+\tc\ini\wcx_ftp.ini'
    146. STRING0 equ 'Modular Total Commander'
    147.  
    148.  
    149.  
    150.  
    151.  
    152.  
    153.  
    154.  
    155. section '' code import executable readable writable
    156.   library comdlg32,'comdlg32.dll',\
    157.           kernel32,'kernel32.dll',\
    158.           shell32,'shell32.dll',\
    159.           user32,'user32.dll'
    160.  
    161.   include 'api\comdlg32.inc'
    162.   include 'api\kernel32.inc'
    163.   include 'api\shell32.inc'
    164.   include 'api\user32.inc'
    165.  
    166.  
    167.  
    168.  
    169.   si_       STARTUPINFO
    170.   pi        PROCESS_INFORMATION
    171.   bi        BROWSEINFO 0,0,0,0,1,0,0,0    ;1=только папки
    172.   wfd       WIN32_FIND_DATA
    173.   buf       rb MAX_PATH*2
    174.   targetDir rb MAX_PATH
    175.   ArrOfTxt  dd 0
    176.   ofn       OPENFILENAME \
    177.             sizeof.OPENFILENAME,\         ;lStructSize
    178.             0,\                           ;hwndOwner
    179.             0,\                           ;hInstance
    180.             filter,\                      ;lpstrFilter
    181.             0,\                           ;lpstrCustomFilter
    182.             0,\                           ;nMaxCustFilter
    183.             1,\                           ;nFilterIndex
    184.             buf,\                         ;lpstrFile
    185.             MAX_PATH,\                    ;sizeof.lpstrFile
    186.             0,\                           ;lpstrFileTitle
    187.             0,\                           ;nMaxFileTitle
    188.             targetDir,\                   ;lpstrInitialDir
    189.             0,\                           ;lpstrTitle
    190.             OFN_OVERWRITEPROMPT+OFN_LONGNAMES,\
    191.             0,\                           ;nFileOffset
    192.             0,\                           ;nFileExtension
    193.             0,\                           ;lpstrDefExt
    194.             0,\                           ;lCustData
    195.             0,\                           ;lpfnHook
    196.             0                             ;lpTemplateName
    197.   filter    db '32 bit Portable Executable',0,'*.exe',0
    198.             db 0
    199.  
    200.  
    201.   entry $
    202.         invoke  DialogBoxParamA,0,IDD_MTC,0,mtc,0
    203.         invoke  ExitProcess,eax
    204.  
    205.  
    206. proc mtc uses ebx esi edi, wnd,msg,wparam,lparam
    207.         mov     eax,[msg]
    208.         .if     eax=WM_CLOSE
    209.                 ;enu: free dialog
    210.                 ;rus: выгрузить диалог
    211.                 invoke  EndDialog,[wnd],eax
    212.  
    213.                 ;enu: free comments tree
    214.                 ;rus: выгрузить дерево комментариев
    215.                 call    .free_ArrOfTxt_items_
    216.                 jmp     .retz
    217.           .free_ArrOfTxt_items_:
    218.                 mov     eax,[ArrOfTxt]
    219.                 push    0 eax
    220.                 mov     ecx,[eax]
    221.             .free_ArrOfTxt_items:
    222.                 sub     ecx,4
    223.                 jz      .free_ArrOfTxt
    224.                 add     eax,4
    225.                 stdcall memory,dword[eax],0
    226.                 jmp     .free_ArrOfTxt_items
    227.             .free_ArrOfTxt:
    228.                 call    memory
    229.                 ret     0
    230.         .elseif eax=WM_INITDIALOG
    231.                 ;enu: destinative dir selection: set owner once instead of doing that every time a button pressed
    232.                 ;rus: выбор целевого каталога: назначим родителя только раз замись проделывания это каждое нажатие кнопки
    233.                 mov     eax,[wnd]
    234.                 mov     [bi.hwndOwner],eax
    235.                 mov     [ofn.hwndOwner],eax
    236.  
    237.         .wm_initdialog:
    238.                 ;enu: still an empty comments list
    239.                 ;rus: покамись пустой список комментариев каждого пункта IDC_LSTBUSH
    240.                 stdcall memory,0,4
    241.                 mov     byte[eax],4
    242.                 mov     [ArrOfTxt],eax
    243.  
    244.                 ;enu: searching for main archive, reflecting into the list
    245.                 ;rus: ищем главный архив и выводим в список
    246.                 invoke  FindFirstFileA,'totalcmd.zip',wfd
    247.                 cmp     eax,-1
    248.                 je      .no_totalcmd.zip
    249.                 invoke  FindClose,eax
    250.                 invoke  SendDlgItemMessageA,[wnd],IDC_LSTBUSH,LB_ADDSTRING,0,'   |totalcmd.zip'
    251.                 invoke  SendDlgItemMessageA,[wnd],IDC_LBLBUSH,LB_SETITEMDATA,0,0
    252.  
    253.                 ;enu: fetch its comment
    254.                 ;rus: считать соотв. комментарий
    255.                 call    .get_tc_comment_file
    256.                 db      'totalcmd.zip.txt',0
    257.           .get_tc_comment_file:
    258.                 pop     eax
    259.                 call    .add_comment
    260.  
    261.                 ;enu: entering archives dir "+"
    262.                 ;rus: заходим в "+" - каталог архивов
    263.           .no_totalcmd.zip:
    264.                 invoke  GetCurrentDirectoryA,MAX_PATH,buf
    265.                 cmp     eax,MAX_PATH
    266.                 ja      .retz
    267.                 mov     dword[buf+eax],'\+'
    268.                 invoke  SetCurrentDirectoryA,buf
    269.                 test    eax,eax
    270.                 jz      .retz
    271.  
    272.                 ;enu: list every SUBDIR and SUBDIR\FILE fetching respective comment files, depth=1
    273.                 ;rus: заходим в каждый_подкаталог\список_файлов, считывая комментарии в ArrOfTxt, вложенность просмотра = 1
    274.                 stdcall dirA,.dirA.cally,FILE_ATTRIBUTE_DIRECTORY
    275.  
    276.                 ;enu: step back making rescan possible(look at IDC_BTNRELOAD)
    277.                 ;rus: возвращаемся назад для возможности повторения(см. IDC_BTNRELOAD)
    278.                 invoke  SetCurrentDirectoryA,'..'
    279.                 jmp     .retz
    280.  
    281.                 ;enu: list every SUBDIR... of "+"
    282.                 ;rus: заходим в каждый_подкаталог... каталога "+"
    283.           .dirA.cally:
    284.                 lea     esi,[esp+4+11*4] ;WIN32_FIND_DATA.cFileName
    285.                 push    esi
    286.                 invoke  SendDlgItemMessageA,[wnd],IDC_LSTBUSH,LB_ADDSTRING,0,esi
    287.                 invoke  SendDlgItemMessageA,[wnd],IDC_LSTBUSH,LB_SETITEMDATA,eax,$8000'0000 ; test eax,eax -> js .папка
    288.  
    289.                 ;enu: read "FOLDER.txt" comment
    290.                 ;rus: считать комментарий к папке из "папка.txt"
    291.                 mov     edi,buf
    292.             .txt_name:
    293.                 lodsb
    294.                 cmp     al,0
    295.                 jz      .txt_done
    296.                 stosb
    297.                 jmp     .txt_name
    298.             .txt_done:
    299.                 mov     eax,'.txt'
    300.                 stosd
    301.                 mov     byte[edi],0
    302.                 mov     eax,buf
    303.                 call    .add_comment
    304.  
    305.                 ;enu: enter FOLDER([esp]=esi=folder) and get its files list
    306.                 ;rus: войти в папку([esp]=esi=папка) и получить список файлов
    307.                 invoke  SetCurrentDirectoryA
    308.                 push    ebx              ;!
    309.                 stdcall dirA,.filA.cally,0
    310.                 pop     ebx
    311.                 invoke  SetCurrentDirectoryA,'..'
    312.                 ret     0
    313.  
    314.                 ;enu: eax   -> file name to read(up to 4096-1 bytes) into ArrOfTxt as an element
    315.                 ;     eax   <- updated ArrOfTxt
    316.                 ;     ecx   <- [eax]
    317.                 ;     edx   <- ?
    318.                 ;     edi   <- fetched comment
    319.                 ;     flags <- ?
    320.                 ;rus: eax   -> имя файла для считывания его части(до 4096 байт) в ArrOfTxt
    321.                 ;     eax   <- обновленный ArrOfTxt
    322.                 ;     ecx   <- [eax]
    323.                 ;     edx   <- ?
    324.                 ;     edi   <- комментарий
    325.                 ;     flags <- ?
    326.             .add_comment:
    327.                 xor     edi,edi
    328.                 invoke  CreateFileA,eax,GENERIC_READ,edi,edi,OPEN_EXISTING,edi,edi
    329.                 cmp     eax,-1
    330.                 je      .register_comment
    331.                 push    eax
    332.                 invoke  GetFileSize,eax,edi
    333.                 test    eax,eax
    334.                 jz      .register_comment_
    335.                 mov     ecx,4096-1
    336.                 cmp     ecx,eax
    337.                 cmova   ecx,eax
    338.                 inc     ecx
    339.                 stdcall memory,edi,ecx
    340.                 dec     ecx
    341.                 push    edi wfd ecx eax dword[esp+4*4]
    342.                 mov     edi,eax
    343.                 invoke  ReadFile
    344.               .register_comment_:
    345.                 invoke  CloseHandle
    346.               .register_comment:
    347.                 mov     eax,[ArrOfTxt]
    348.                 mov     ecx,[eax]
    349.                 add     ecx,4
    350.                 stdcall memory,eax,ecx
    351.                 mov     [eax],ecx
    352.                 mov     [eax+ecx-4],edi
    353.                 mov     [ArrOfTxt],eax
    354.                 ret     0
    355.  
    356.                 ;enu: ...and get its files list
    357.                 ;rus: ...и получить список файлов
    358.             .filA.cally:
    359.  
    360.                 ;enu: creating a hierarchy: "   |name.zip"
    361.                 ;rus: создаем иерархию: "   |name.zip"
    362.                 lea     esi,[esp+4+11*4] ;WIN32_FIND_DATA.cFileName
    363.                 mov     edi,buf
    364.                 mov     eax,'   |'
    365.                 stosd
    366.               .nest_name:
    367.                 lodsb
    368.                 stosb
    369.                 cmp     al,0
    370.                 jnz     .nest_name
    371.  
    372.                 ;enu: *.txt-gate
    373.                 ;rus: *.txt-барьер
    374.                 mov     eax,[edi-5]
    375.                 or      eax,'    '
    376.                 cmp     eax,'.txt'
    377.                 jne     .filter_ok
    378.                 ret     0
    379.               .filter_ok:
    380.  
    381.                 ;enu: prepend file size: "   |name.zip(xxx B)"
    382.                 ;rus: вывести размер файла: "   |name.zip(xxx B)"
    383.                 mov     eax,[esp+4+8*4]  ;WIN32_FIND_DATA.nFileSizeLow
    384.                 xor     ecx,ecx
    385.               .dword2a:
    386.                 inc     ecx
    387.                 test    cl,11b
    388.                 jnz     .no_dummy
    389.                 push    " "
    390.                 jmp     .dword2a
    391.                 .no_dummy:
    392.                 mov     esi,eax
    393.                 mov     edx,$cccc'cccd
    394.                 mul     edx
    395.                 shr     edx,3
    396.                 lea     eax,[edx*8+edx-'0']
    397.                 xadd    edx,eax
    398.                 sub     esi,edx
    399.                 push    esi
    400.                 test    eax,eax
    401.                 jnz     .dword2a
    402.                 dec     edi
    403.                 mov     esi,edi
    404.                 mov     al,'|'
    405.                 stosb
    406.               .dword2a_:
    407.                 pop     eax
    408.                 stosb
    409.                 loop    .dword2a_
    410.                 mov     eax,' B'
    411.                 stosd
    412.  
    413.                 ;enu: add file to the tree
    414.                 ;rus: добавить файлик в дерево
    415.                 invoke  SendDlgItemMessageA,[wnd],IDC_LSTBUSH,LB_ADDSTRING,0,buf
    416.                 invoke  SendDlgItemMessageA,[wnd],IDC_LSTBUSH,LB_SETITEMDATA,eax,0
    417.  
    418.                 ;enu: fetch inserted file's comment
    419.                 ;rus: получить комментарий о добавленном файлике
    420.                 mov     dword[esi],'.txt'
    421.                 mov     byte[esi+4],0
    422.                 mov     eax,buf+4        ;'   |'
    423.                 jmp     .add_comment
    424.         .elseif eax=WM_COMMAND
    425.                 mov     eax,[wparam]
    426.                 .if     eax=LBN_SELCHANGE shl 16 or IDC_LSTBUSH
    427.                         ;enu: output record's comment
    428.                         ;rus: вывести комментарий записи
    429.                         invoke  SendDlgItemMessageA,[wnd],IDC_LSTBUSH,LB_GETCURSEL,0,0
    430.                         mov     ebx,eax
    431.                         mov     eax,[ArrOfTxt]
    432.                         lea     eax,[eax+4+ebx*4]
    433.                         invoke  SendDlgItemMessageA,[wnd],IDC_TXTCOMMENT,WM_SETTEXT,0,dword[eax]
    434.  
    435.                         ;enu: disallow service items selection
    436.                         ;rus: запретить выбор служебных пунктов
    437.                         invoke  SendDlgItemMessageA,[wnd],IDC_LSTBUSH,LB_GETITEMDATA,ebx,0
    438.                         test    eax,eax
    439.                         jns     .ret1    ;)
    440.                         invoke  SendDlgItemMessageA,[wnd],IDC_LSTBUSH,LB_SETSEL,FALSE,ebx
    441.                 .elseif eax=IDC_BTNRELOAD
    442.                         ;enu: reload the tree
    443.                         ;rus: перегрузить дерево
    444.                         call    .free_ArrOfTxt_items_
    445.                         invoke  SendDlgItemMessageA,[wnd],IDC_LSTBUSH,LB_RESETCONTENT,0,0
    446.                         jmp     .wm_initdialog
    447.                 .elseif eax=IDC_BTNDIR
    448.                         ;enu: chose destinative dir
    449.                         ;rus: выбор целевого каталога
    450.                         mov     edi,.retz
    451.                 .idc_btndir:
    452.                         invoke  SHBrowseForFolderA,bi
    453.                         test    eax,eax
    454.                         jz      .ret1    ;)
    455.                         invoke  SHGetPathFromIDListA,eax,targetDir
    456.                         invoke  SendDlgItemMessageA,[wnd],IDC_TXTDIR,WM_SETTEXT,0,targetDir
    457.                         jmp     edi
    458.                 .elseif eax=IDC_BTNGO
    459.                         ;==============
    460.                         ;enu: setup
    461.                         ;rus: установка
    462.                         ;==============
    463.  
    464.                         ;enu: ensure destinative folder got
    465.                         ;rus: удостовериться в присутствии каталога назначения
    466.                         mov     edi,.target_dir_got
    467.                         xor     ebx,ebx
    468.                   .target_dir_got:
    469.                         cmp     byte[targetDir],bl
    470.                         jz      .idc_btndir
    471.  
    472.                         ;enu: list size -> [wfd], id_now -> ebx
    473.                         ;rus: размер списка -> [wfd], id_сейчас -> ebx
    474.                         invoke  SendDlgItemMessageA,[wnd],IDC_LSTBUSH,LB_GETCOUNT,ebx,ebx
    475.                         test    eax,eax
    476.                         jz      .ret1    ;)
    477.                         mov     [wfd],eax
    478.  
    479.                         ;enu: [buf] = '+\' + %FOLDER% + '\'
    480.                         ;rus: [buf] = '+\' + %ПАПКА% + '\'
    481.                         mov     word[buf],'+\'
    482.                   .install_loop:
    483.  
    484.                         ;enu: update [buf] if element is a folder
    485.                         ;rus: если эл. списка - папка, переиначиваем [buf]
    486.                         invoke  SendDlgItemMessageA,[wnd],IDC_LSTBUSH,LB_GETITEMDATA,ebx,0
    487.                         test    eax,eax
    488.                         jns     .keep_path
    489.                         invoke  SendDlgItemMessageA,[wnd],IDC_LSTBUSH,LB_GETTEXT,ebx,buf+2
    490.                         mov     word[buf+2+eax],'\'
    491.                         jmp     .skip
    492.                     .keep_path:
    493.  
    494.                         ;enu: skip unselected element, focus else
    495.                         ;rus: пропустить элемент списка без выделения, иначе - навести на него фокус
    496.                         invoke  SendDlgItemMessageA,[wnd],IDC_LSTBUSH,LB_GETSEL,ebx,0
    497.                         test    eax,eax
    498.                         jz      .skip
    499.                         invoke  SendDlgItemMessageA,[wnd],IDC_LSTBUSH,LB_SETCARETINDEX,ebx,0
    500.  
    501.                         ;enu: temporary text buffer
    502.                         ;rus: временный текстовый буфер
    503.                         sub     esp,MAX_PATH*5
    504.                         mov     esi,esp
    505.  
    506.                         ;enu: try unpacking totalcmd.zip
    507.                         ;rus: если в списке файлов есть totalcmd.zip, распаковать его
    508.                         test    ebx,ebx
    509.                         jnz     .not_tc
    510.                         cinvoke wsprintfA,esi,'7zG.exe -o"%s\totalcmd\" x "totalcmd.zip"',targetDir
    511.                         jmp     .unpack
    512.                     .not_tc:
    513.  
    514.                         ;enu: extact %FILE% name into [wfd+4+4]
    515.                         ;rus: извлечь имя %ФАЙЛА% в [wfd+4+4]
    516.                         invoke  SendDlgItemMessageA,[wnd],IDC_LSTBUSH,LB_GETTEXT,ebx,wfd+4
    517.                         mov     al,'|'
    518.                         or      ecx,-1
    519.                         lea     edi,[wfd+4+4]
    520.                         repne   scasb
    521.                         mov     byte[edi-1],0
    522.  
    523.                         ;enu: merge archiver's command line: '7zG.exe -o"%s\totalcmd\%s" x "%s%s"'
    524.                         ;rus: плетем веревки, шутка, нужно собрать коммандную строку архиватора: '7zG.exe -o"%s\totalcmd\%s" x "%s%s"'
    525.                         cinvoke wsprintfA,esi,'7zG.exe -o"%s\totalcmd\%s" x "%s%s"',targetDir,buf,buf,wfd+4+4
    526.  
    527.                         ;enu: run decom/compressor
    528.                         ;rus: запускаем архиватор
    529.                     .unpack:
    530.                         invoke  CreateProcessA,0,esi,0,0,0,0,0,0,si_,pi
    531.                         add     esp,MAX_PATH*5
    532.                         invoke  WaitForSingleObject,[pi.hProcess],-1
    533.  
    534.                         ;enu: cycle along the list
    535.                         ;rus: циклимся по всему списку
    536.                         invoke  SendDlgItemMessageA,[wnd],IDC_LSTBUSH,LB_SETSEL,0,ebx
    537.                     .skip:
    538.                         inc     ebx
    539.                         cmp     ebx,[wfd]
    540.                         jne     .install_loop
    541.  
    542.                         ;enu: explore destination folder
    543.                         ;rus: открыть папку назначения
    544.                         invoke  ShowWindow,[wnd],SW_MINIMIZE
    545.                         invoke  ShellExecuteA,0,'explore',targetDir,0,0,SW_MAXIMIZE
    546.                 .elseif eax=IDC_BTNSCRATCH
    547.                         ;enu: get file name for the SCRATCH image
    548.                         ;rus: спросить имя для образа SCRATCH
    549.                         mov     dword[buf],'tota'
    550.                         mov     dword[buf+4],'lcmd'
    551.                         mov     dword[buf+8],'+.ex'
    552.                         mov     dword[buf+12],'e'
    553.                         invoke  GetSaveFileNameA,ofn
    554.                         test    eax,eax
    555.                         jz      .ret1    ;)
    556.  
    557.                         ;enu: fetch IDC_TXTSCRATCH.text into SCRATCH._init
    558.                         ;rus: занести IDC_TXTSCRATCH.text в SCRATCH._init
    559.                         invoke  SendDlgItemMessageA,[wnd],IDC_TXTSCRATCH,WM_GETTEXT,MAX_PATH,SCRATCH+init
    560.  
    561.                         ;enu: store SCRATCH image
    562.                         ;rus: сохранить SCRATCH
    563.                         invoke  CreateFileA,buf,GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0
    564.                         push    eax
    565.                         push    0 wfd SECTION_1_RAW. SCRATCH eax
    566.                         invoke  WriteFile
    567.                         invoke  CloseHandle
    568.                 .endif
    569.         .endif
    570. .retz:  xor     eax,eax
    571. .ret1:  ret
    572. endp
    573.  
    574.  
    575. ; if [mem]=[bytes]=0{
    576. ;   return
    577. ; }
    578. ; if ([mem]<>0)&([bytes]<>0){
    579. ;   return size([mem],[bytes])
    580. ; }
    581. ; if [mem]=0{
    582. ;   return get([bytes])
    583. ; }
    584. ; if [bytes]=0{
    585. ;   free([mem])
    586. ;   return
    587. ; }
    588. proc memory; mem,bytes
    589.         xchg    edx,[esp+4]
    590.         xchg    ecx,[esp+8]
    591.         pushfd
    592.         cld
    593.         test    ecx,ecx
    594.         jz      .free
    595.         test    edx,edx
    596.         jz      .get
    597. .size:  invoke  GetProcessHeap                           ;GetProcessHeap:
    598.         invoke  HeapReAlloc,eax,HEAP_ZERO_MEMORY,edx,ecx ;  mov     eax,[fs:$18]
    599.         jmp     .exit                                    ;  mov     eax,[eax+$30]
    600. .get:   invoke  GetProcessHeap                           ;  mov     eax,[eax+$18]
    601.         invoke  HeapAlloc,eax,HEAP_ZERO_MEMORY,ecx       ;  ret
    602.         jmp     .exit
    603. .free:  test    edx,edx
    604.         jz      .exit
    605.         push    eax
    606.         invoke  GetProcessHeap
    607.         invoke  HeapFree,eax,ecx,edx
    608.         pop     eax
    609. .exit:  popfd
    610.         mov     ecx,[esp+8]
    611.         mov     edx,[esp+4]
    612.         ret     8
    613. endp
    614.  
    615.  
    616. ; enu: list directory or file names for the current path.
    617. ; cally   = is a user defined procedure, called on every fetch.
    618. ;           Approximate look:
    619. ;           proc cally
    620. ;                   lea     eax,[esp+4+11*4]
    621. ;                   invoke  MessageBoxA,0,eax,0,0
    622. ;                   ret     0
    623. ;           endp
    624. ;                                 old EAX
    625. ;                                 old EBX
    626. ;                                 old ECX
    627. ;                                 old EDX
    628. ;                                 WIN32_FIND_DATA + DWORD aligned tail
    629. ;           Whenever called, ESP: pointer to <dirsA> EIP after <cally>
    630. ;           After a call resume EBX.
    631. ; options = set FILE_ATTRIBUTE_DIRECTORY's bit to list dirs, or drop that bit(not FILE_ATTRIBUTE_DIRECTORY, 0, etc) to list files.
    632. ; On exit FLAGS = ?
    633.  
    634. ; rus: пройтись по списку файлов или папок в поточной для процесса директории.
    635. ; cally   = вызывается при каждом успешном обнаружении файла(папки).
    636. ;           Както так:
    637. ;           proc cally
    638. ;                   lea     eax,[esp+4+11*4]
    639. ;                   invoke  MessageBoxA,0,eax,0,0
    640. ;                   ret     0
    641. ;           endp
    642. ;                            старый EAX
    643. ;                            старый EBX
    644. ;                            старый ECX
    645. ;                            старый EDX
    646. ;                            WIN32_FIND_DATA, выровненная к DWORD
    647. ;           При вызове, ESP: указатель на EIP <dirsA> после <cally>
    648. ;           Выходя, восстановите EBX.
    649. ; options = установите бит FILE_ATTRIBUTE_DIRECTORY для просмотра папок, или сбросьте его(not FILE_ATTRIBUTE_DIRECTORY, 0, итд.) - для файлов.
    650. ; В конце FLAGS = ?
    651. proc dirA; cally, options
    652.         push    eax ebx ecx edx
    653.         sub     esp,(sizeof.WIN32_FIND_DATA + 4) shr 2 shl 2
    654.         invoke  FindFirstFileA,.wild,esp
    655.         cmp     eax,-1
    656.         je      .exit
    657.         mov     ebx,eax
    658.  
    659. .loop:  test    byte[esp + (sizeof.WIN32_FIND_DATA + 4) shr 2 shl 2 + 4*4 + 4*2],FILE_ATTRIBUTE_DIRECTORY
    660.         jnz     .dir_mode
    661.         test    byte[esp],FILE_ATTRIBUTE_DIRECTORY
    662.         jz      .cally
    663.         jmp     .not
    664.   .dir_mode:
    665.         test    byte[esp],FILE_ATTRIBUTE_DIRECTORY
    666.         jz      .not
    667.         mov     eax,[esp+11*4]
    668.         and     eax,$00ff'ffff
    669.         cmp     eax,'..'
    670.         je      .not
    671.         cmp     ax,'.'
    672.         je      .not
    673.   .cally:call   dword[esp + (sizeof.WIN32_FIND_DATA + 4) shr 2 shl 2 + 4*4 + 4]
    674.   .not: invoke  FindNextFileA,ebx,esp
    675.         test    eax,eax
    676.         jnz     .loop
    677.  
    678.         invoke  FindClose,ebx
    679. .exit:  add     esp,(sizeof.WIN32_FIND_DATA + 4) shr 2 shl 2
    680.         pop     edx ecx ebx eax
    681.         ret     8
    682. .wild:  db      '*',0
    683. endp
    684.  
    685.  
    686.  
    687.  
    688.  
    689.  
    690.  
    691.  
    692. ;Пример ручного создания PE32.
    693. ;В случае изменений следи за следующими полями:
    694. ;- IMAGE_OPTIONAL_HEADER.SizeOfImage
    695. ;- SECTION_X.Rva
    696. ;format binary as 'exe'
    697.  
    698.  
    699. SCRATCH:
    700. macro padzero value*{db (value - $ and (value-1)) mod (value) dup 0}
    701.  
    702. macro m1 section{
    703.   ;увеличить счетчик числа секций
    704.   load a word from IMAGE_FILE_HEADER.NumberOfSections
    705.   store word a+1 at IMAGE_FILE_HEADER.NumberOfSections
    706.   ;задать 2 частые дельты
    707.   load a dword from section#.Rva
    708.   section#_RVA  = a - section#_RAW
    709.   section#_BASE = IMAGE_BASE + section#_RVA
    710. }
    711.  
    712.  
    713. DISK_SECTOR = $0000'0200                                        ;0'000'512
    714. PAGE        = $0000'1000                                        ;0'004'096
    715. IMAGE_BASE  = $0040'0000                                        ;4'194'304
    716.  
    717.  
    718. use16
    719. org 0
    720. IMAGE_DOS_HEADER:
    721.   .Signature                  dw 'MZ'
    722.   .BytesOnLastPage            dw 64                             ;страничка = 512 байт
    723.   .PagesInFile                dw 1
    724.   .Relocations                dw 0
    725.   .SizeOfHeaderInParagraphs   dw 64/16                          ;параграф = 16 байт
    726.   .MinimumExtraParagraphs     dw 0
    727.   .MaximumExtraParagraphs     dw 0
    728.   .InitialRelativeSS          dw 0
    729.   .InitialSP                  dw 64
    730.   .Checksum:                  int $20                           ;просто выйти в ДОС
    731.   .InitialIP                  dw .Checksum
    732.   .InitialRelativeCS          dw 0
    733.   .OffsetToRelocationTable    dw 0
    734.   .OverlayNumber              dw 0
    735.   .Reserved1                  dw 4 dup 0
    736.   .OEMIdentifier              dw 0                              ;)
    737.   .OEMInformation             dw 0                              ;)
    738.   .Reserverd2                 dw 10 dup 0
    739.   .OffsetToNewEXEHeader       dd 64                             ;IMAGE_NT_HEADERS
    740.  
    741.  
    742. IMAGE_NT_HEADERS:
    743.   .Signature                  dd 'PE'
    744.  
    745.  
    746.   IMAGE_FILE_HEADER:
    747.     .Machine                  dw $014c                          ;нужен i386 и выше
    748.     .NumberOfSections         dw 0                              ;число секций, ОСТАВЬТЕ ПУСТЫМ - ЗАПОЛНИМ В КОНЦЕ
    749.     .TimeDateStamp            dd %t                             ;секунд с 1970_01_01, 00:00
    750.     .PointerToSymbolTable     dd 0
    751.     .NumberOfSymbols          dd 0
    752.     .SizeOfOptionalHeader     dw IMAGE_SECTION_HEADER-\         ;размер структуры
    753.                                  IMAGE_OPTIONAL_HEADER
    754.     .Characteristics          dw $0002                          ;исполняемый файл
    755.  
    756.  
    757.   IMAGE_OPTIONAL_HEADER:
    758.     .Magic                    dw $010b                          ;32'разрядная программа
    759.     .MajorLinkerVersion       db 0                              ;поля версии компоновщика, можно...
    760.     .MinorLinkerVersion       db 0                              ;...прописать смайлики
    761.     .SizeOfCode               dd 0
    762.     .SizeOfInitializedData    dd 0
    763.     .SizeOfUninitializedData  dd 0
    764.     .AddressOfEntryPoint      dd PAGE+\                         ;PAGE(=.SectionAlignment) тут - смещение в ОЗУ к первой секции относительно IMAGE_DOS_HEADER(=0)
    765.                                  entry_point-SECTION_1_RAW      ;точка входа соответственно
    766.     .BaseOfCode               dd 0
    767.     .BaseOfData               dd 0
    768.     .ImageBase                dd IMAGE_BASE                     ;база загрузки образа; образ начинается с IMAGE_DOS_HEADER :)
    769.     .SectionAlignment         dd PAGE                           ;расположить секции в ОЗУ по адресам, кратным этому числу
    770.     .FileAlignment            dd DISK_SECTOR                    ;в физ. файле секции распол. по кратным этому числу адресам
    771.     .MajorOSVersion           dw 0
    772.     .MinorOSVersion           dw 0
    773.     .MajorImageVersion        dw 0                              ;свое
    774.     .MinorImageVersion        dw 0                              ;чегось
    775.     .MajorSubsystemVersion    dw 4
    776.     .MinorSubsystemVersion    dw 0
    777.     .Win32VersionNumber       dd 0
    778.     .SizeOfImage              dd PAGE*2                         ;размер всего образа, отображенного в ОЗУ, включая заголовки и секции, округляйте к SectionAlignment, говорит загрузчику о наших размерах
    779.     .SizeOfHeaders            dd SECTION_1_RAW                  ;дисковый размер образа до первой секции, кругленный(просто выравнивайте первую секцию к ->) к .FileAlignment
    780.     .Checksum                 dd 0
    781.     .Subsystem                dw 2                              ;win graphical user interface(гумка :ы), столько под|версий, ах!
    782.     .Characteristics          dw 0
    783.     .SizeOfStackReserve       dd 1024*1024                      ;пространство стека
    784.     .SizeOfStackCommit        dd 0
    785.     .SizeOfHeapReserve        dd 1024*1024                      ;пространство кучи
    786.     .SizeOfHeapCommit         dd 0
    787.     .LoaderFlags              dd 0
    788.     .NumberOfDataDirectories  dd 16                             ;количество указателей на (предопределенные) секции ниже:
    789.  
    790.     .ExportTableRvaAndSize    dq 0                              ;1, экспорт
    791.     .ImportTableRvaAndSize    dd PAGE,\                         ;2, импорт, будем импортировать функции
    792.                                  0;entry_point-SECTION_1_RAW
    793.     times 14 dq 0                                               ;3..16
    794.  
    795.  
    796.   IMAGE_SECTION_HEADER:
    797.     SECTION_1:
    798.       .Name                   dq ''                             ;ник секции, напр. 'code' или 'maria'
    799.       .VirtualSize            dd 0
    800.       .Rva                    dd PAGE                           ;вспомните .SectionAlignment, по этому адресу лежит первый байт секции, отраженной в память
    801.       .SizeOfRawData          dd SECTION_1_RAW.-SECTION_1_RAW   ;размер физических нанных, выравнивайте секции к .FileAlignment
    802.       .PointerToRawData       dd SECTION_1_RAW                  ;указатель начала физ. данных, выравнивайте секции к .FileAlignment
    803.       .PointerToRelocations   dd 0
    804.       .PointerToLineNumbers   dd 0
    805.       .NumberOfRelocations    dw 0
    806.       .NumberOfLineNumbers    dw 0
    807.       .Characteristics        dd $0000'0020+\                   ;тут код
    808.                                  $2000'0000+\                   ;выполняемый
    809.                                  $4000'0000+\                   ;можно считывать
    810.                                  $8000'0000                     ;и записывать
    811.       m1 SECTION_1
    812.  
    813.   padzero DISK_SECTOR                                           ;выровнять к .FileAllignment
    814.  
    815.  
    816.  
    817.  
    818.   SECTION_1_RAW:
    819.                                                                 ;таблица импорта
    820.     dd 0,0,0,kernel_name+SECTION_1_RVA,kernel_table+SECTION_1_RVA
    821.     dd 0,0,0,shell_name+SECTION_1_RVA,shell_table+SECTION_1_RVA
    822.     dd 0,0,0,0,0
    823.  
    824.     kernel_name db 'kernel32.dll',0
    825.     kernel_table:
    826.       exit_process  dd exit_process_+SECTION_1_RVA
    827.       beep          dd beep_+SECTION_1_RVA
    828.       dd 0
    829.       exit_process_ dw 0
    830.                     db 'ExitProcess',0
    831.       beep_         dw 0
    832.                     db 'Beep',0
    833.  
    834.     shell_name db 'shell32.dll',0
    835.     shell_table:
    836.       shell_execute  dd shell_execute_+SECTION_1_RVA
    837.       dd 0
    838.       shell_execute_ dw 0
    839.                      db 'ShellExecuteA',0
    840.  
    841.  
    842.   entry_point:                                                  ;точка входа
    843.   use32
    844.         push     5
    845.         push     0
    846.         call     @f
    847.    init:rb       MAX_PATH
    848.      @@:call     @f
    849.         db       'totalcmd.exe',0
    850.      @@:push     0
    851.         push     0
    852.         call     [shell_execute+SECTION_1_BASE]
    853.  
    854.         push     0
    855.         call     [exit_process+SECTION_1_BASE]
    856.   padzero DISK_SECTOR
    857.   SECTION_1_RAW.:
    858.  
    859.  
    860.  
    861.  
    862.  
    863.  
    864.  
    865.  
    866. section '' resource readable
    867.   IDD_MTC        = 0
    868.   IDC_LBLBUSH    = 1
    869.   IDC_LSTBUSH    = 2
    870.   IDC_LBLCOMMENT = 3
    871.   IDC_TXTCOMMENT = 4
    872.   IDC_LBLDIR     = 5
    873.   IDC_TXTDIR     = 6
    874.   IDC_BTNDIR     = 7
    875.   IDC_BTNRELOAD  = 8
    876.   IDC_BTNGO      = 9
    877.   IDC_GRPSCRATCH = 10
    878.   IDC_TXTSCRATCH = 11
    879.   IDC_BTNSCRATCH = 12
    880.  
    881.   directory RT_DIALOG,dialogs
    882.  
    883.   resource dialogs,\
    884.            IDD_MTC,0,idd_mtc
    885.  
    886.   dialog idd_mtc,STRING0,40,40,316,294,WS_CAPTION+WS_MINIMIZEBOX+WS_SYSMENU,,,'courier new',8
    887.     dialogitem 'static'  ,STRING1 ,IDC_LBLBUSH    ,3,3,310,9     ,WS_CHILD+WS_VISIBLE
    888.     dialogitem 'listbox' ,''      ,IDC_LSTBUSH    ,3,12,310,96   ,WS_CHILD+WS_VISIBLE+WS_TABSTOP+WS_BORDER+WS_VSCROLL+LBS_NOINTEGRALHEIGHT+LBS_EXTENDEDSEL+LBS_NOTIFY
    889.     dialogitem 'static'  ,STRING2 ,IDC_LBLCOMMENT ,3,114,310,9   ,WS_CHILD+WS_VISIBLE
    890.     dialogitem 'edit'    ,''      ,IDC_TXTCOMMENT ,3,123,310,50  ,WS_CHILD+WS_VISIBLE+WS_TABSTOP+WS_BORDER+WS_VSCROLL+ES_READONLY+ES_MULTILINE
    891.     dialogitem 'static'  ,STRING3 ,IDC_LBLDIR     ,3,179,310,9   ,WS_CHILD+WS_VISIBLE
    892.     dialogitem 'edit'    ,''      ,IDC_TXTDIR     ,3,189,295,12  ,WS_CHILD+WS_VISIBLE+WS_TABSTOP+WS_BORDER+ES_AUTOHSCROLL+ES_READONLY
    893.     dialogitem 'button'  ,'<'     ,IDC_BTNDIR     ,301,189,12,12 ,WS_CHILD+WS_VISIBLE+WS_TABSTOP+WS_BORDER
    894.     dialogitem 'button'  ,STRING4 ,IDC_BTNRELOAD  ,3,213,60,14   ,WS_CHILD+WS_VISIBLE+WS_TABSTOP+WS_BORDER
    895.     dialogitem 'button'  ,STRING5 ,IDC_BTNGO      ,253,213,60,14 ,WS_CHILD+WS_VISIBLE+WS_TABSTOP+WS_BORDER
    896.  
    897.     dialogitem 'button'  ,STRING6 ,IDC_GRPSCRATCH ,6,264,302,27  ,WS_CHILD+WS_VISIBLE+BS_GROUPBOX+BS_FLAT
    898.     dialogitem 'edit'    ,STRING7 ,IDC_TXTSCRATCH ,12,276,240,12 ,WS_CHILD+WS_VISIBLE+WS_TABSTOP+WS_BORDER+ES_AUTOHSCROLL
    899.     dialogitem 'button'  ,'<'     ,IDC_BTNSCRATCH ,255,276,48,12 ,WS_CHILD+WS_VISIBLE+WS_TABSTOP+WS_BORDER
    900.   enddialog
    Ниже пример ручного создания ЕХЕ, положенный в основу данной программы:
    Код (Text):
    1. ;Пример ручного создания PE32.
    2. ;В случае изменений следи за следующими полями:
    3. ;- IMAGE_OPTIONAL_HEADER.SizeOfImage
    4. ;- SECTION_X.Rva
    5. format binary as 'exe'
    6.  
    7.  
    8. SCRATCH:
    9. macro padzero value*{db (value - $ and (value-1)) mod (value) dup 0}
    10.  
    11. macro m1 section{
    12.   ;увеличить счетчик числа секций
    13.   load a word from IMAGE_FILE_HEADER.NumberOfSections
    14.   store word a+1 at IMAGE_FILE_HEADER.NumberOfSections
    15.   ;задать 2 частые дельты
    16.   load a dword from section#.Rva
    17.   section#_RVA  = a - section#_RAW
    18.   section#_BASE = IMAGE_BASE + section#_RVA
    19. }
    20.  
    21.  
    22. DISK_SECTOR = $0000'0200                                        ;0'000'512
    23. PAGE        = $0000'1000                                        ;0'004'096
    24. IMAGE_BASE  = $0040'0000                                        ;4'194'304
    25.  
    26.  
    27. use16
    28. org 0
    29. IMAGE_DOS_HEADER:
    30.   .Signature                  dw 'MZ'
    31.   .BytesOnLastPage            dw 64                             ;страничка = 512 байт
    32.   .PagesInFile                dw 1
    33.   .Relocations                dw 0
    34.   .SizeOfHeaderInParagraphs   dw 64/16                          ;параграф = 16 байт
    35.   .MinimumExtraParagraphs     dw 0
    36.   .MaximumExtraParagraphs     dw 0
    37.   .InitialRelativeSS          dw 0
    38.   .InitialSP                  dw 64
    39.   .Checksum:                  int $20                           ;просто выйти в ДОС
    40.   .InitialIP                  dw .Checksum
    41.   .InitialRelativeCS          dw 0
    42.   .OffsetToRelocationTable    dw 0
    43.   .OverlayNumber              dw 0
    44.   .Reserved1                  dw 4 dup 0
    45.   .OEMIdentifier              dw 0                              ;)
    46.   .OEMInformation             dw 0                              ;)
    47.   .Reserverd2                 dw 10 dup 0
    48.   .OffsetToNewEXEHeader       dd 64                             ;IMAGE_NT_HEADERS
    49.  
    50.  
    51. IMAGE_NT_HEADERS:
    52.   .Signature                  dd 'PE'
    53.  
    54.  
    55.   IMAGE_FILE_HEADER:
    56.     .Machine                  dw $014c                          ;нужен i386 и выше
    57.     .NumberOfSections         dw 0                              ;число секций, ОСТАВЬТЕ ПУСТЫМ - ЗАПОЛНИМ В КОНЦЕ
    58.     .TimeDateStamp            dd %t                             ;секунд с 1970_01_01, 00:00
    59.     .PointerToSymbolTable     dd 0
    60.     .NumberOfSymbols          dd 0
    61.     .SizeOfOptionalHeader     dw IMAGE_SECTION_HEADER-\         ;размер структуры
    62.                                  IMAGE_OPTIONAL_HEADER
    63.     .Characteristics          dw $0002                          ;исполняемый файл
    64.  
    65.  
    66.   IMAGE_OPTIONAL_HEADER:
    67.     .Magic                    dw $010b                          ;32'разрядная программа
    68.     .MajorLinkerVersion       db 0                              ;поля версии компоновщика, можно...
    69.     .MinorLinkerVersion       db 0                              ;...прописать смайлики
    70.     .SizeOfCode               dd 0
    71.     .SizeOfInitializedData    dd 0
    72.     .SizeOfUninitializedData  dd 0
    73.     .AddressOfEntryPoint      dd PAGE+\                         ;PAGE(=.SectionAlignment) тут - смещение в ОЗУ к первой секции относительно IMAGE_DOS_HEADER(=0)
    74.                                  entry_point-SECTION_1_RAW      ;точка входа соответственно
    75.     .BaseOfCode               dd 0
    76.     .BaseOfData               dd 0
    77.     .ImageBase                dd IMAGE_BASE                     ;база загрузки образа; образ начинается с IMAGE_DOS_HEADER :)
    78.     .SectionAlignment         dd PAGE                           ;расположить секции в ОЗУ по адресам, кратным этому числу
    79.     .FileAlignment            dd DISK_SECTOR                    ;в физ. файле секции распол. по кратным этому числу адресам
    80.     .MajorOSVersion           dw 0
    81.     .MinorOSVersion           dw 0
    82.     .MajorImageVersion        dw 0                              ;свое
    83.     .MinorImageVersion        dw 0                              ;чегось
    84.     .MajorSubsystemVersion    dw 4
    85.     .MinorSubsystemVersion    dw 0
    86.     .Win32VersionNumber       dd 0
    87.     .SizeOfImage              dd PAGE*3                         ;размер всего образа, отображенного в ОЗУ, включая заголовки и секции, округляйте к SectionAlignment, говорит загрузчику о наших размерах
    88.     .SizeOfHeaders            dd SECTION_1_RAW                  ;дисковый размер образа до первой секции, кругленный(просто выравнивайте первую секцию к ->) к .FileAlignment
    89.     .Checksum                 dd 0
    90.     .Subsystem                dw 2                              ;win graphical user interface(гумка :ы), столько под|версий, ах!
    91.     .Characteristics          dw 0
    92.     .SizeOfStackReserve       dd 1024*1024                      ;пространство стека
    93.     .SizeOfStackCommit        dd 0
    94.     .SizeOfHeapReserve        dd 1024*1024                      ;пространство кучи
    95.     .SizeOfHeapCommit         dd 0
    96.     .LoaderFlags              dd 0
    97.     .NumberOfDataDirectories  dd 16                             ;количество указателей на (предопределенные) секции ниже:
    98.  
    99.     .ExportTableRvaAndSize    dq 0                              ;1, экспорт
    100.     .ImportTableRvaAndSize    dd PAGE,\                         ;2, импорт, будем импортировать функции
    101.                                  0;entry_point-SECTION_1_RAW
    102.     times 14 dq 0                                               ;3..16
    103.  
    104.  
    105.   IMAGE_SECTION_HEADER:
    106.     SECTION_1:
    107.       .Name                   dq ''                             ;ник секции, напр. 'code' или 'maria'
    108.       .VirtualSize            dd 0
    109.       .Rva                    dd PAGE                           ;вспомните .SectionAlignment, по этому адресу лежит первый байт секции, отраженной в память
    110.       .SizeOfRawData          dd SECTION_1_RAW.-SECTION_1_RAW   ;размер физических нанных, выравнивайте секции к .FileAlignment
    111.       .PointerToRawData       dd SECTION_1_RAW                  ;указатель начала физ. данных, выравнивайте секции к .FileAlignment
    112.       .PointerToRelocations   dd 0
    113.       .PointerToLineNumbers   dd 0
    114.       .NumberOfRelocations    dw 0
    115.       .NumberOfLineNumbers    dw 0
    116.       .Characteristics        dd $0000'0020+\                   ;тут код
    117.                                  $2000'0000+\                   ;выполняемый
    118.                                  $4000'0000+\                   ;можно считывать
    119.                                  $8000'0000                     ;и записывать
    120.       m1 SECTION_1
    121.     SECTION_2:
    122.       .Name                   dq 'section2'
    123.       .VirtualSize            dd 0
    124.       .Rva                    dd PAGE*2                         ;те пропустить выравнивание 1й секции и саму 1ю секцию
    125.       .SizeOfRawData          dd SECTION_2_RAW.-SECTION_2_RAW
    126.       .PointerToRawData       dd SECTION_2_RAW
    127.       .PointerToRelocations   dd 0
    128.       .PointerToLineNumbers   dd 0
    129.       .NumberOfRelocations    dw 0
    130.       .NumberOfLineNumbers    dw 0
    131.       .Characteristics        dd $e000'0020
    132.       m1 SECTION_2
    133.  
    134.   padzero DISK_SECTOR                                           ;выровнять к .FileAllignment
    135.  
    136.  
    137.  
    138.  
    139.   SECTION_1_RAW:
    140.                                                                 ;таблица импорта
    141.     dd 0,0,0,kernel_name+SECTION_1_RVA,kernel_table+SECTION_1_RVA
    142.     dd 0,0,0,user_name+SECTION_1_RVA,user_table+SECTION_1_RVA
    143.     dd 0,0,0,shell_name+SECTION_1_RVA,shell_table+SECTION_1_RVA
    144.     dd 0,0,0,0,0
    145.  
    146.     kernel_name db 'kernel32.dll',0
    147.     kernel_table:
    148.       exit_process  dd exit_process_+SECTION_1_RVA
    149.       beep          dd beep_+SECTION_1_RVA
    150.       dd 0
    151.       exit_process_ dw 0
    152.                     db 'ExitProcess',0
    153.       beep_         dw 0
    154.                     db 'Beep',0
    155.  
    156.     user_name db 'user32.dll',0
    157.     user_table:
    158.       message_box  dd message_box_+SECTION_1_RVA
    159.       dd 0
    160.       message_box_ dw 0
    161.                    db 'MessageBoxA',0
    162.  
    163.     shell_name db 'shell32.dll',0
    164.     shell_table:
    165.       shell_execute  dd shell_execute_+SECTION_1_RVA
    166.       shell_alabama  dd shell_alabama_+SECTION_1_RVA
    167.       dd 0
    168.       shell_execute_ dw 0
    169.                      db 'ShellExecuteA',0
    170.       shell_alabama_ dw 0
    171.                      db 'ShellAboutA',0
    172.  
    173.  
    174.   entry_point:                                                  ;точка входа
    175.   use32
    176.         push     0
    177.         push     0
    178.         call     @f
    179.         db       'Шас MessageBoxA чего-то вам покажет...',0
    180.      @@:push     0
    181.         call     [message_box+SECTION_1_BASE]
    182.  
    183.  
    184.         push     0
    185.         push     caption+SECTION_2_BASE
    186.         call     @f
    187.         db       'В случае изменений следи за следующими полями:',10,\
    188.                  '- IMAGE_OPTIONAL_HEADER.SizeOfImage'           ,10,\
    189.                  '- SECTION_X.Rva',0
    190.      @@:push     0
    191.         call     [message_box+SECTION_1_BASE]
    192.  
    193.  
    194.         push     0
    195.         push     0
    196.         call     @f
    197.         db       'Попытка ShellExecuteA и notepad.exe показать меня без одежды...',0
    198.      @@:push     0
    199.         call     [message_box+SECTION_1_BASE]
    200.  
    201.  
    202.         push     5
    203.         push     0
    204.         push     0
    205.         call     @f
    206.         db       'pe.asm',0
    207.      @@:push     0
    208.         push     0
    209.         call     [shell_execute+SECTION_1_BASE]
    210.  
    211.  
    212.         cmp      eax,32
    213.         mov      eax,fail+SECTION_2_BASE
    214.         mov      edx,pervert+SECTION_2_BASE
    215.         cmova    eax,edx
    216.         push     0
    217.         push     0
    218.         push     eax
    219.         push     0
    220.         call     [message_box+SECTION_1_BASE]
    221.  
    222.  
    223.         push     0
    224.         push     0
    225.         call     @f
    226.         db       'до',0
    227.      @@:push     0
    228.         call     [message_box+SECTION_1_BASE]
    229.  
    230.  
    231.         mov      edi,melody+SECTION_2_BASE
    232.         call     edi
    233.  
    234.  
    235.         push     0
    236.         call     @f
    237.         db       'www.flatAssembler, www.wasm.ru, edemko@rambler.ru',0
    238.      @@:push     caption+SECTION_2_BASE
    239.         push     0
    240.         call     [shell_alabama+SECTION_1_BASE]
    241.  
    242.  
    243.         push     0
    244.         push     0
    245.         call     @f
    246.         db       'Пока, ExitProcess ждет',0
    247.      @@:push     0
    248.         call     [message_box+SECTION_1_BASE]
    249.  
    250.  
    251.         push     0
    252.         call     [exit_process+SECTION_1_BASE]
    253.   padzero DISK_SECTOR
    254.   SECTION_1_RAW.:
    255.  
    256.  
    257.  
    258.  
    259.   SECTION_2_RAW:
    260.     caption db 'Пример ручного создания PE32',0
    261.     fail    db 'Обложались',0
    262.     pervert db 'Вот извращенцы',0
    263.  
    264.     melody:
    265.         push    300 120
    266.         call    [beep+SECTION_1_BASE]
    267.         ret     0
    268.  
    269.   padzero DISK_SECTOR
    270.   SECTION_2_RAW.:
    271.  
    272.  
    273.  
    274.  
    275.  
    276.  
    277.  
    278.  
    279.  
    280.  
    281.  
    282.  
    283.  
    284.  
    285.  
    286.  
    287.  
    288.  
    289.  
    290.  
    291.  
    292.  
    293.  
    294.  
    295.  
    296.  
    297.  
    298.  
    299.  
    300.  
    301.  
    302.  
    303.  
    304. ; val   = 0..2^64-1
    305. ; merge = 0<bytes<9 of value to show
    306. ; example: repeat 8
    307. ;            display 13,10
    308. ;            ShowHex $FEDCBA9876543210,%
    309. ;          end repeat
    310. macro ShowHex val*, merge*{
    311.   if merge > 0 & merge < 9
    312.     local .a, .merge
    313.     .merge = (merge) shl 1
    314.     while .merge <> 0
    315.       .a = (val) shr ((.merge - 1) * 4) and 1111b or 11'0000b
    316.       if .a > 11'1001b
    317.         .a = .a + 111b
    318.       end if
    319.       display .a
    320.       .merge = .merge - 1
    321.     end while
    322.   end if
    323. }
     
  4. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    нда...
    Код (Text):
    1. @echo off
    2.  
    3. igor\7zG.exe x totalcmd\totalcmd.zip -o"%ProgramFiles%\totalcmd\"
    4.  
    5. for %%1 in (totalcmd\+\arch\ totalcmd\+\compute\ totalcmd\+\drive\ totalcmd\+\editor\ totalcmd\+\media\ totalcmd\+\net\ totalcmd\+\tweak\ totalcmd\+\tc\) do (
    6.   for %%2 in (%%1*) do (
    7.     echo %%2
    8.     igor\7zG.exe x "%%2" -o"%ProgramFiles%\%%1"
    9.   )
    10. )
    11.  
    12. explorer /select, "%ProgramFiles%\totalcmd\totalcmd+.exe"
     
  5. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
  6. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Rockphorr, обязательно посмотрю, спасибо!
    Зашел сюда, месяц спустя.
    Рад всех видеть.
    Разобрался в *.bat-анике.
    Привожу 2 файла из архива:

    вступление
    Код (Text):
    1. Modular Total Commander
    2. email:edemko@rambler.ru
    3.  
    4.  
    5. enu: mtc.txt  
    6.        this file
    7.  
    8.      mtc.cmd        
    9.        silly cmd.exe-based installer, be aware!
    10.        tested on win xp pro sp3
    11.  
    12.      igor\
    13.        the installer uses Igor Pavlov's archiver
    14.  
    15.      TotalCmd\+\*\*
    16.        1st * means any folder, 2nd * - any file Igor Pavlov supports
    17.        compose *\* at your own
    18.        to apply patches after extraction, put mtc.bat, mtc.cmd, mtc.reg into *\* and the installer will call them
    19.  
    20.      TotalCmd\TotalCmd.zip  
    21.        installer calls Igor for original Total Commander
    22.  
    23.      TotalCmd\TotalCmd.zip\TotalCmd+.exe
    24.        makes Total run with "TotalCmd\+\tc\" folder additions
    25.  
    26.        TotalCmd\+\tc\!.rar                - some info
    27.        TotalCmd\+\tc\bar.rar              - extended total status bars
    28.        TotalCmd\+\tc\Desktop.rar          -
    29.        TotalCmd\+\tc\ini.rar              - total (and total plugs) conf files
    30.        TotalCmd\+\tc\OpenFileTC.rar       - extended total editor select
    31.        TotalCmd\+\tc\plugin.rar           - total plugins folder
    32.        TotalCmd\+\tc\plugman.rar          - extended total plugins configurator
    33.        TotalCmd\+\tc\ReInit.rar           - use it to apply patches without installer
    34.        TotalCmd\+\tc\sound.rar            - total sounds
    35.        TotalCmd\+\tc\TCShell.rar          - adds total to shell
    36.        TotalCmd\+\tc\Ultra TC Editors.rar - extended total configurators
    37.  
    38.  
    39. rus: mtc.txt  
    40.        этот файл
    41.  
    42.      mtc.cmd        
    43.        установщик, использующий грозный cmd.exe, не пробдите!
    44.        тестировался под win xp pro sp3
    45.  
    46.      igor\
    47.        установщику понравился архиватор Игоря Павлова
    48.  
    49.      TotalCmd\+\*\*
    50.        1ая звездочка * обозначает любую папку, 2ая * - файл архива, поддерживаемый архиватором
    51.        составляйте *\* по своему вкусу
    52.        для внесения патчей архивы могут содержать mtc.bat, mtc.cmd, mtc.reg - установщик их и вызовет
    53.  
    54.      TotalCmd\TotalCmd.zip  
    55.        непоковырянный Total Commander
    56.  
    57.      TotalCmd\TotalCmd.zip\TotalCmd+.exe
    58.        запускает тотал с прибамбахами из папки "TotalCmd\+\tc\"
    59.  
    60.        TotalCmd\+\tc\!.rar                - какая-то информация
    61.        TotalCmd\+\tc\bar.rar              - панельки тотала
    62.        TotalCmd\+\tc\Desktop.rar          -
    63.        TotalCmd\+\tc\ini.rar              - тоталовские (и его плугов) файлы настроек
    64.        TotalCmd\+\tc\OpenFileTC.rar       - запускалка редакторов
    65.        TotalCmd\+\tc\plugin.rar           - плужки тотала
    66.        TotalCmd\+\tc\plugman.rar          - настройщик плагинов тотала
    67.        TotalCmd\+\tc\ReInit.rar           - используй для запуска патчей без установщика
    68.        TotalCmd\+\tc\sound.rar            - звуковая схемма
    69.        TotalCmd\+\tc\TCShell.rar          - добавляет тотал в проводник
    70.        TotalCmd\+\tc\Ultra TC Editors.rar - настройщики тотала
    установщик
    Код (Text):
    1.                rem enu: start
    2.                rem rus: старт
    3. echo off
    4. cls
    5.  
    6.                rem enu: title
    7.                rem rus: заглавие
    8. echo.
    9. echo :Modular Total Commander
    10.  
    11.                rem enu: language select
    12.                rem rus: выбор языка
    13. echo.
    14. echo :1=enu 2=rus
    15. set /p lang=
    16. if "%lang%"=="1" (
    17.     set langDummyCmd=dummy cmd, be aware!
    18.     set langSetDest=specify destination folder or select a variant below
    19.     set langIgorStarted=extracting files
    20.     set langDir=dir
    21.     set langFile=file
    22.     set langBatCall=contains mtc.bat, calling
    23.     set langCmdCall=contains mtc.cmd, calling
    24.     set langRegCall=contains mtc.reg, calling
    25.     set langMainFile=main program
    26.     set langDone=done, bye!
    27. ) else if "%lang%"=="2" (
    28.     set langDummyCmd=грозный cmd, будьте бдительны!
    29.     set langSetDest=укажите папку назначения или выберите вариант ниже
    30.     set langIgorStarted=извлекаем файлы
    31.     set langDir=папка
    32.     set langFile=файл
    33.     set langBatCall=содержит mtc.bat, вызываем
    34.     set langCmdCall=содержит mtc.cmd, вызываем
    35.     set langRegCall=содержит mtc.reg, вызываем
    36.     set langMainFile=главная программа
    37.     set langDone=все, пока!
    38. )
    39.  
    40.                rem enu: dummy script warning
    41.                rem rus: предупредим о своей простоте
    42. echo.
    43. echo :%langDummyCmd%
    44.  
    45.                rem enu: ask for destination folder
    46.                rem rus: спросить папку назначения
    47. echo.
    48. echo :%langSetDest%
    49. echo  1 = %SystemDrive%
    50. echo  2 = %ProgramFiles%
    51. echo  3 = %SystemDrive%\temp
    52. set /p dest=
    53. if "%dest%"=="1" (
    54.     set dest=%SystemDrive%
    55. ) else if "%dest%"=="2" (
    56.     set dest=%ProgramFiles%
    57. ) else if "%dest%"=="3" (
    58.     set dest=%SystemDrive%\temp
    59. )
    60. :set_lang.
    61.  
    62.                rem enu: count folders and files
    63.                rem rus: посчитать папки и файлы
    64. set /a drs=0
    65. set /a fls=0
    66. call :loop :cntDrs :cntFls
    67. goto :cntDrsFls.
    68. :cntDrs
    69.   set /a drs=drs+1
    70.   goto :eof
    71. :cntFls
    72.   set /a fls=fls+1
    73.   goto :eof
    74. :cntDrsFls.
    75.  
    76.                rem enu: extraction
    77.                rem rus: извлечение
    78. echo.
    79. echo :%langIgorStarted%
    80. set /a drsNow=0
    81. set /a flsNow=0
    82. call :loop :outDrs :outFls
    83. goto :outDrsFls.
    84. :outDrs
    85.   set /a drsNow=drsNow+1
    86.   echo  %langDir% %drsNow%/%drs% = %~1
    87.   set destNow=%dest%\%~1
    88.   goto :eof
    89. :outFls
    90.   set /a flsNow=flsNow+1
    91.   echo    %langFile% %flsNow%/%fls% = %~nx1
    92.   igor\7zG.exe x %1 -o"%destNow%"
    93.   set mtc=%destNow%\%~n1\mtc.
    94.   if exist "%mtc%bat" (
    95.       echo    %langBatCall%
    96.       start /wait cmd /c "%mtc%bat"
    97.   )
    98.   if exist "%mtc%cmd" (
    99.       echo    %langCmdCall%
    100.       start /wait cmd /c "%mtc%cmd"
    101.   )
    102.   if exist "%mtc%reg" (
    103.       echo    %langRegCall%
    104.       reg import "%mtc%reg" >nul
    105.   )
    106.   goto :eof
    107. :outDrsFls.
    108.  
    109.                rem enu: main file
    110.                rem rus: главный файл
    111. echo.
    112. echo :%langMainFile%
    113. igor\7zG.exe x totalcmd\totalcmd.zip -o"%dest%\totalcmd"
    114. explorer /select,"%dest%\totalcmd\totalcmd+.exe"
    115.  
    116. echo.
    117. echo :%langDone%
    118. pause
    119. goto :eof
    120.  
    121.                rem enu: dirs and files walking cycle
    122.                rem rus: цыкл прохода по каталогам и файлам
    123. :loop
    124.   for /d %%1 in ("totalcmd\+\*") do (
    125.       call %1 "%%1"
    126.       for %%2 in ("%%1\*") do (
    127.           call %2 "%%2"
    128.       )
    129.   )
    130.   goto :eof
    code.google.com внушает надежды, но у него, видимо, лимит на выгрузку, а та у нас медленная.
    Прошу тех у кого быстрые скорости отпостить сюда согласием, дабы перезалить файл.
    Привожу к сведению, файл в 35 МБ при выгрузке на code.google.com берет вдвое больше.
    2011_12_08
    файл при выгрузке на code.google.com берет вдвое больше - ?
    http://fasmme.googlecode.com/files/mtc.part1.rar
    http://fasmme.googlecode.com/files/mtc.part2.rar