FASM Прикрутить кнопку на стандартное окно...

Тема в разделе "WASM.BEGINNERS", создана пользователем rococo795, 16 дек 2016.

  1. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.168
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    1
    Регистрация:
    11 июн 2004
    Сообщения:
    3.513
    Адрес:
    Russia
    rmn, заработался.. не углядел сакразма ))
     
  3. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    250
    Ух! "Аферюга!" :acute::boast:
     
  4. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    250
    Приспособил чужой код под свои нужды. Рекурсивно нахожу, вывожу полный путь и убиваю файл.
    Код (ASM):
    1.  
    2. format PE GUI 4.0               ; PE EXE файл  
    3. entry start                ; Точка входа  
    4.  
    5. include 'C:\fasmw17160\INCLUDE\WIN32A.INC'  
    6.  
    7. section '.main' code readable writeable executable    ; Секция кода и данных
    8.         buf     rb 110h             ; Буффер для имени директории    
    9.  
    10.         fake1   dd '.',0             ; Дирекории, которые  
    11.         fake2   dd '..',0             ; НЕ надо сканировать  
    12.  
    13.         titl    db  'the end',0
    14.         text    db  'OK!',0
    15.  
    16.         buff    rb 110h
    17.  
    18. start:                 ; Начало основной программы
    19.         push    1h                 ; SEM_FAILCRITICALERRORS  
    20.         call    [SetErrorMode]     ; Установим error mode что бы в случае обращения к недоступному диску не вываливалось сообщение
    21.  
    22.         call    [GetLogicalDrives]        ; Получаем список дисков, существующих в системе
    23.         mov     ecx,19h                    ; Будем проверять, начиная с Z:\    
    24.  
    25. .find_drives:  
    26.         mov     ebx,1h             ; Нехитрые опрерации в  
    27.         shl     ebx,cl             ; ходе которых мы выясняем  
    28.         and     ebx,eax             ; присутствует диск в  
    29.         je        .no_disk         ; системе или нет  
    30.  
    31.         add     cl,41h             ; Если да, то добавим  
    32.         mov     byte [buf],cl     ; букву диска в  
    33.         sub     cl,41h             ; буффер  
    34.  
    35.         mov     dword [buf+1],2e2a5c3ah  ;     :\*.    Сформируем строку  
    36.         mov     byte [buf+5],2ah         ;     *     для поиска, вида,
    37.         mov     byte [buf+6],0             ; например, C:\*.*  
    38.  
    39.         push    eax              ; Сохраняем в стеке  
    40.         push    ecx              ; нужные регистры  
    41.  
    42.         call    find_files         ; Вызываем процедуру поиска  
    43.  
    44.         pop     ecx              ; Восстанавливаем  
    45.         pop     eax              ; регистры  
    46.  
    47. .no_disk:                         ; Если диска нет,    
    48.         dec     ecx              ; то проверяем следующий  
    49.         jge     .find_drives     ; пока ecx>0  
    50.  
    51.         push 0 titl text 0     ; Покажем MessageBox с
    52.         call [MessageBox]         ; текстом  the end
    53.  
    54.         push    0                 ; Выходим из  
    55.         call    [ExitProcess]     ; программы  
    56.  
    57.     proc find_files              ; Рекурсивная процедура поиска файлов
    58.  
    59.       locals             ; Локальные переменные:  
    60.         fd       WIN32_FIND_DATA    ; структура WIN32_FIND_DATA  
    61.         find_h dd ?             ; хэндл поиска  
    62.       endl    
    63.  
    64.         lea    eax,[fd]             ; Вычисляем и кладем в стек  
    65.         push   eax                 ; указатель на стуктуру find data  
    66.         push   buf                 ; Указатель на имя директории, где искать  
    67.         call   [FindFirstFile]     ; Ищем  
    68.         inc    eax                 ; Если ничего  
    69.         je       .exit             ; не нашли - выходим  
    70.         dec    eax                 ; Иначе, сохраним  
    71.         mov    [find_h],eax      ; хэндл поиска  
    72.  
    73. .find_next:  
    74.         mov    eax,[fd.dwFileAttributes]     ; Проверяем, нашли  
    75.         and    eax,FILE_ATTRIBUTE_DIRECTORY  ; директорию?  
    76.         je       .found                 ; Если нет - прыгаем на .found  
    77.  
    78.         lea    eax,[fd.cFileName]; Проверяем,  
    79.         push   eax                 ; вдруг это  
    80.         push   fake1             ; "."  
    81.         call   [lstrcmp]         ;  
    82.         test   eax,eax             ; Если да,  
    83.         je       .next             ; ищем следующий файл  
    84.  
    85.         lea    eax,[fd.cFileName]; Проверяем,  
    86.         push   eax                 ; вдруг это  
    87.         push   fake2             ; ".."  
    88.         call   [lstrcmp]         ;  
    89.         test   eax,eax             ; Если да  
    90.         je       .next             ; ищем следующий файл  
    91.  
    92.         push   buf                 ; Вычислим  
    93.         call   [lstrlen]         ; длину строки  
    94.         sub    eax,3             ; вычтем *.*  
    95.         push   eax                 ; сохраним полученную длину  
    96.  
    97.         mov    byte [buf+eax],0     ; Если мы всё-таки  
    98.         lea    eax,[fd.cFileName]; нашли директорию    
    99.         push   eax                 ; то прибавляем  
    100.         push   buf                 ; её имя к текущей  
    101.         call   [lstrcat]         ; папке  
    102.  
    103.         push   buf                 ; Опять вычислим  
    104.         call   [lstrlen]         ; длину получившейся строки  
    105.  
    106.         mov    dword [buf+eax],2a2e2a5ch     ; \*.*  прибавим  
    107.         mov    byte [buf+eax+4],0             ;    для поиска  
    108.  
    109.         call   find_files             ; Вызываем процедуру поиска для найденной директории    
    110.  
    111.         pop    eax                     ; Восстановим  
    112.         mov    dword [buf+eax-1],2a2e2a5ch ; \*.*     имя прежней    
    113.         mov    byte [buf+eax+3],0           ; директории  
    114.  
    115.         jmp    .next             ; Ищем следующий файл  
    116.  
    117. .found:  
    118.         lea    eax,[fd.cFileName]  
    119.         push   eax    
    120.         call   [lstrlen]  
    121.         cmp    dword [fd.cFileName+eax-4],'.rrr'    ; Проверим расширение файла    
    122.         jne    .next                                ; Если не совпадает ищем дальше  
    123.  
    124.         push   buf             ; Скопируем строку с нулём  
    125.         push   buff         ; из buf
    126.         call   [lstrcpy]         ; в buff  
    127.  
    128.         push   buff              ; Вычислим  
    129.         call   [lstrlen]         ; длину получившейся строки  
    130.         sub    eax,3h         ; Удалим *.*
    131.         mov    byte [buff+eax],0 ; После \ поставим ноль
    132.  
    133.         lea    eax,[fd.cFileName]; Вычислим начало fd.cFileName  
    134.         push   eax             ; Занесём аргументом строку с нулём которую будем приклеивать  
    135.         push   buff         ; Занесём аргументом строку к которой будем приклеивать
    136.         call   [lstrcat]         ; Клеим eax к buff  
    137.  
    138.         lea    eax,[buff]         ; Вычислим адрес buff
    139.         push   0                 ; аргумент
    140.         push   eax                 ; аргумент - строка в buff    
    141.         push   eax                 ; аргумент - строка в buff    
    142.         push   0                 ; аргумент  
    143.         call [MessageBox]         ; Покажем MessageBox с полным путём и именем файла
    144.  
    145.         push buff
    146.         call [DeleteFileA]
    147.  
    148. ;        cld ;снять флаг DF = обнулить его = массив обрабатывается слево-направо
    149. ;        mov edi,buff ; адрес на начало buff
    150. ;        mov ecx, 110h ; размер buff
    151. ;        xor eax,eax ;обнуляем записываемый байт
    152. ;        rep stosb ;обнуляем массив байтов в buff
    153.  
    154. .next:    
    155.         lea    eax,[fd]             ; Кладем в стек указатель    
    156.         push   eax                 ; на структуру find_data  
    157.         push   [find_h]             ; Хэндл текущего поиска  
    158.         call   [FindNextFile]     ; Ищем следующий файл  
    159.         test   eax,eax             ;  
    160.         jne    .find_next         ; Если ничего не нашли,  
    161.  
    162.         push   [find_h]             ; то закрываем  
    163.         call   [FindClose]         ; хэндл поиска  
    164.  
    165. .exit:              
    166.         ret              ; Выход  
    167.     endp  
    168.  
    169. data import                ; Импорт нужных API-функций  
    170.  
    171.     library kernel32,'KERNEL32.DLL',\  
    172.         user32,'USER32.DLL'  
    173.  
    174.     include 'C:\fasmw17160\INCLUDE\API\KERNEL32.INC'
    175.     include 'C:\fasmw17160\INCLUDE\API\USER32.INC'
    176.  
    177. end data  
    178.  
     
  5. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    250
    Ещё один кЛутой кодес. :boast: Удаляю в указанных папках все файлы.
    Код (ASM):
    1.  
    2. format PE GUI 4.0               ; PE EXE файл  
    3. entry start                ; Точка входа  
    4.  
    5. include 'C:\fasmw17160\INCLUDE\WIN32A.INC'  
    6.  
    7. section '.main' code readable writeable executable    ; Секция кода и данных
    8.         papka0     db 'C:\Documents and Settings\2\Local Settings\Temp\*.*',0    
    9.         align 16
    10.         papka1     db 'C:\Documents and Settings\2\Cookies\*.*',0    
    11.         align 16
    12.         papka2       db 'C:\Documents and Settings\2\Recent\*.*',0
    13.         align 16
    14.         papka3     db 'C:\WINDOWS\temp\*.*',0
    15.         align 16
    16.         buf     rb 110h            ; Буффер для имени директории    
    17.         fake1   dd '.',0        ; Дирекории, которые  
    18.         fake2   dd '..',0        ; НЕ надо сканировать    
    19.         titl    db  'the end',0 ; текст для
    20.         text    db  'OK!',0    ; messageBox
    21.         buff    rb 110h     ; место где склеивается путь и имя файла
    22.         sizeFileName dd ?    ; размер имени файла без нуля
    23.         fd       WIN32_FIND_DATA    ; структура WIN32_FIND_DATA  
    24.         find_h dd ?             ; хэндл поиска  
    25.         uuu dd 00000004h        ; счётчик - количество папок в инициализированных данных
    26.         papka dd ?        ; адрес первой папки
    27.  
    28. start:                 ; Начало основной программы
    29.         push    1h                ; SEM_FAILCRITICALERRORS  
    30.         call    [SetErrorMode]    ; Установим error mode что бы в случае обращения к недоступному диску не вываливалось сообщение
    31.  
    32.         lea        eax,[papka0]    ; находим адрес первой строки - первый байт и ложим его в регистр
    33.         mov        [papka],eax    ; ложим адрес первой папки в память по адресу papka
    34. .ttt0:
    35.         push    eax                ; Вычислим длину строки из раздела инициализированных данных
    36.         call   [lstrlen]        ; по указанному адресу в регистре eax без нуля
    37.         mov     esi,eax     ; размер длины строки ложим в esi, строка заканчивается *.*
    38.         xor        eax,eax
    39.         xor        ecx,ecx
    40.         mov        ebx,[papka]    ; адрес начала строки - первый байт строки
    41.     .cikl3:
    42.         mov        cl,byte [ebx+eax]    ; Копируем строку
    43.         mov        byte [buf+eax],cl    ; из из инициализированных данных
    44.         inc        eax                    ; в buf - неинициализированные данные
    45.         dec        esi                    ; побайтно
    46.         jnz        .cikl3            ; пока esi>0
    47.         mov        byte [buf+eax],0    ; ставим ноль в конец скопированной строки - после *.*
    48.  
    49.         lea    eax,[fd]             ; Вычисляем и кладем в стек  
    50.         push   eax                 ; указатель на стуктуру find data  
    51.         push   buf                 ; Указатель на имя директории, где искать  
    52.         call   [FindFirstFile]     ; Ищем  
    53.         inc    eax                 ; Если ничего  
    54.         je       .exit             ; не нашли - выходим  
    55.         dec    eax                 ; Иначе, сохраним  
    56.         mov    [find_h],eax      ; хэндл поиска  
    57.  
    58. .find_next:  
    59.         mov    eax,[fd.dwFileAttributes]    ; Проверяем, нашли  
    60.         and    eax,FILE_ATTRIBUTE_DIRECTORY ; директорию?  
    61.         jne    .next                        ; Если да - то пропускаем её - прыгаем на .next  
    62.  
    63.         lea    eax,[fd.cFileName]; Если папки пропускаем, то здесь будет файл - в fd.cFileName    
    64.         push   eax                 ; Проверяем, вдруг это  
    65.         push   fake1             ; "."  
    66.         call   [lstrcmp]         ;  
    67.         test   eax,eax             ; Если да,  
    68.         je       .next             ; ищем следующий файл  
    69.  
    70.         lea    eax,[fd.cFileName]; Если нет - то проверяем,  
    71.         push   eax                 ; вдруг это  
    72.         push   fake2             ; ".."  
    73.         call   [lstrcmp]         ;  
    74.         test   eax,eax             ; Если да  
    75.         je       .next             ; ищем следующий файл  
    76.  
    77. .found:  
    78.         lea    eax,[fd.cFileName]    ; Если нет - вычислим
    79.         push   eax                    ; длину имени файла без нуля в fd.cFileName
    80.         call   [lstrlen]            ; Вычисляем
    81.         mov        [sizeFileName],eax  ; заносим длину в память по адресу sizeFileName
    82.  
    83.         push   buf             ; Вычислим длину скопированной из инициализированных данных в buf
    84.         call   [lstrlen]     ; строки, но без нуля
    85.         sub        eax,3h         ; Удалим из  строки *.* и оставим \
    86.  
    87.         mov        esi,eax      ; ложим длину строки без *.* в esi, регистр будет как счётчик
    88.         xor        eax,eax
    89.     .cikl:
    90.         mov        cl,byte [buf+eax]    ; Копируем путь к файлу
    91.         mov        byte [buff+eax],cl    ; из buf
    92.         inc        eax                    ; в buff побайтно
    93.         dec        esi                    ; последний символ \
    94.         jnz        .cikl
    95.  
    96.         mov        esi,[sizeFileName]  ; ложим в регистр длину имени файла без нуля
    97.         xor        ecx,ecx
    98.         xor        edx,edx
    99.     .cikl2:
    100.         mov        dl,byte [fd.cFileName+ecx]    ; Приклеиваем имя
    101.         mov        byte [buff+eax],dl            ; файла
    102.         inc        ecx                            ; к уже скопированому пути
    103.         inc        eax                            ; в buff побайтно
    104.         dec        esi                  
    105.         jnz        .cikl2
    106.         mov        byte [buff+eax],0            ; ставим ноль после имени файла
    107.  
    108.         lea    eax,[buff]        ; Вычислим адрес buff
    109.         push   0                ; аргумент
    110.         push   eax                ; аргумент - строка в buff    
    111.         push   eax                ; аргумент - строка в buff    
    112.         push   0                ; аргумент  
    113.         call [MessageBox]        ; Покажем MessageBox с полным путём и именем файла
    114.  
    115.         push buff                ; Ссылка на начало пути с именем файла и нулём в конце
    116.         call [DeleteFileA]        ; Удаляем файл по ссылке
    117.                    
    118. .next:    
    119.         lea    eax,[fd]            ; Кладем в стек указатель    
    120.         push   eax                ; на структуру find_data  
    121.         push   [find_h]            ; Хэндл текущего поиска  
    122.         call   [FindNextFile]    ; Ищем следующий файл    
    123.         test   eax,eax              
    124.         jne    .find_next        ; Если ничего не нашли,  
    125.  
    126.         dec     [uuu]        ; так как уже просмотрели одну папку, вычитаем единицу из счётчика
    127.         cmp        [uuu],3h
    128.         jb        .wer            ; если меньше то прыгаем на wer
    129.         add        [papka],40h    ; прибавляем к адресу начала первой строки 40h и попадаем на начало
    130.         mov        eax,[papka]    ; второй строки. Ложим её начало - в регистр для последующего
    131.         jmp        .ttt0        ; вычисления длины пути. Прыгаем на вычисление
    132. .wer:
    133.         cmp        [uuu],2h
    134.         jb        .wer1            ; если меньше
    135.         add        [papka],30h
    136.         mov        eax,[papka]
    137.         jmp        .ttt0
    138. .wer1:
    139.         cmp        [uuu],1h
    140.         jb        .wer2            ; если меньше
    141.         add        [papka],30h
    142.         mov        eax,[papka]
    143.         jmp        .ttt0
    144. .wer2:
    145.         push   [find_h]            ; то закрываем  
    146.         call   [FindClose]        ; хэндл поиска  
    147. .exit:              
    148.         push 0 titl text 0        ; Покажем MessageBox с
    149.         call [MessageBox]        ; текстом  the end
    150.  
    151.         push    0                ; Выходим из  
    152.         call    [ExitProcess]    ; программы  
    153.  
    154. section '.idata' import data readable writeable
    155.  
    156.     library kernel32,'KERNEL32.DLL',\  
    157.         user32,'USER32.DLL'  
    158.  
    159.     include 'C:\fasmw17160\INCLUDE\API\KERNEL32.INC'
    160.     include 'C:\fasmw17160\INCLUDE\API\USER32.INC'
    161.  
    С папки на папку - только так додумался прыгать. Как попроще можно?
     
  6. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.168
    Код (ASM):
    1.  
    2.     folder0     db "c:\...",0
    3.     folder1     db "c:\...",0
    4.     folder2     db "c:\...",0
    5.     folderList  dd offset folder0
    6.                 dd offset folder1
    7.                 dd offset folder2
    8.            
    9.     xor edi, edi    ; folder index
    10.  
    11. next_folder:
    12.     mov eax, [folderList + edi*4]   ; eax <- folder name ptr
    13.     ...
    14.     inc edi
    15.     cmp edi, 2
    16.     jle next_folder
    17.  
     
  7. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    250
    rmn,

    Ага. Понятно. Спасибо. :ok: