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

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

  1. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Почему так?
     
  2. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.548
    Адрес:
    Russia
    Если вы собрались разбирать MPEG4 формат (не контейнеры а именно поток) - сразу могу сказать что это ад. Вам прийдется прочитать горы документации и всяких отсылок к расширению стандарта, не говоря уже о самих принципах кодирования сигнала, IPB фреймах, Motion Prediction, DCT, Haffman, RLE ... и так далее. Кароче там много чего.
    А уж если это все на асме... В общем минимум года 2-3 вычеркивайте сразу из жизни.
     
  3. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Это если наверно самому писАть кодер.... А я говорю о работе с уже закодированном.... Хоть с контейнером mp4 с атомом avcC... Хоть с чистым потоком h264.... - Это много проще.... Я говорю о превидении нарушенной структуры контейнера или потока - к его обычной структуре... (читабельной декодерами... читабельной плеерами)..
     
  4. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.548
    Адрес:
    Russia
    С чистым потоком так не получится. Без разбора заголовков и декодирования - вы не сможете понять всех нарушений
     
  5. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    А чего так??? Открываем h264.... сразу 00 00 00 01 ... затем 67... после него данные SPS... до следующих 00 00 00 01 .... за ними 68 - это данные PPS... затем после следующих 00 00 00 01 идёт 65 88 84 - те о которых я говорил выше...... начало данных видео (даже наверно начало ключевого кадра- мои мысли)..... затем следующий 00 00 00 01 ... данные 41 9? ?? 77 (в трёх разных файлах и с ютуба и с рутрекера фильм - они одинаковы и всегда на своих местах) - это начало следующего семпла.... В чём трудность его собрать в mp4 ???
    раскладываешь семплы в mdat... считаешь смещения.... пересчитываешь смещения в других атомах - от начала файла...
    Дня два-три назад так и хотел... Потом вижу что это - первый класс вторая четверть... Усложнил себе задачу.... Без смещений попытаться найти семплы, сгруппировать в чанки... и попробовать разложить в mp4 с пересчётом всех данных других атомов.... Вот этот многоуважаемый avcC не особо понятен... а будет выкобеливаться - я его предам анафиме и заменю на mp4a... (ну я так думаю)
     
    Последнее редактирование: 15 фев 2017
  6. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.548
    Адрес:
    Russia
    ну вот заголовки - это только часть (и там тоже есть свои нюансы как данные заголовка (параметры кадра и тп) . Там после заголовков идут кадры, которые могут быть битыми. И все это разбирать на асме.
    В общем - хозяин барин. Имеете желание - вперед. Я бы даже за деньги и имея кучу времени, не стал бы таким заниматься. Это монотонно, скучно, не говоря о разных версиях стандарта mpeg4.
    И кстати если уж заинтересовались - рекомендую тулы Elecard StreamEye Studio и Stream Analyzer. Хорошие тулы для анализа потоков. Может они помогут вам в этом нелегком деле.
     
  7. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Спасибо... Посмотрю....
    А насчёт битости... Ну конечно если они биты даже в семплах - то есть части семплов нет вообще или одна часть семплов в других семплах - то такая каша это надо много времени.... а если семплы на местах - думаю всё дело техники (пока так думаю).... небольшая трудность состоит в том что секции аудио в mdat - вообще не идентифицированы... а начало на них указаны только в stco второго (аудио) trak.... и если этот атом повреждён - то никакой идентификации на эти данные нет... Но... Пытливый умище увидел уже, что семплы звука идут всегда последним семплом каждого чанка.... и начинаются либо - 21 00 05 00... либо 21 ?? ?? ?? ... помощь в поиске такого 32 битного значения окажет то, что значения в mdat кратны 4 ом... Вобщем есть чем занять себя - от нечег делать...
     
  8. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Рациональность.....
    Было так...
    invoke WriteFile,[FileOut],edx,ebp,cbWrite,0
    Послушал сделал так...
    invoke WriteFile,[FileOut],edx,ecx,cbWrite,0

    В коде пошла мешанина.... Причина - invoke WriteFile - меняет регистр ecx на какую то ***ю.... Регистры esi, edi,ebx - заняты в цикле..... Поясните момент - зачем я должен прибегать к использованию памяти в этом цикле, которая медленнее, (ведь я именно в целях так сказать быстроты и рациональности где можно - работаю через регистры) должен НЕ использовать регистр ebp. В моём примитивном кодесе мне без разницы как он будет меняться.. Зачем мне тут слово - никогда????
    А регистр esp - то же никогда не трогать???
     
  9. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    А я могу свою тему удалить сам???
     
  10. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    Не спеши удалять.

    Esp трогать нельзя, потому что он отвечает в твоей программе за стек. Без него она нормально работать не будет, используешь ли ты его (стек) явно или нет.

    Ebp, пожалуйста, трогай, меняй. Инди написал ремарку - но это к твоему коду не относится. Это относится к программам с другой реализацией, в случае, если у них есть стековый фрейм для процедур.

    По вопросу о том, что работа с памятью медленнее. Процессор работает с наносекундными задержками, место (память), где обитает твоя программа, размещается в кэше, который находится в процессоре и так же быстр. Даже если я некорректно сейчас все обрисовал, правда в том, что такты считать (экономить) не нужно, это нужно в особо заточенных задачах и/или на конкурсах. Простой вызов messagebox "отщелкает" несколько миллионов команд процессора. В винде мегабайты кода, занимающегося пустой работой, загружающих процессор и память.

    Через только регистры рационально работать, если это тебе, как разработчику, не создает проблем. Если начинается головняк, нужно думать как упростить сопровождение своего кода. Если регистры заняты в цикле, их можно (нужно!) сохранять в памяти, или в стеке, что одно и то же.

    Если вызов Апи меняет регистр(ы) на фигню, сохрани регистр(ы) в стеке:

    push ecx ; сохранить значение в стек
    invoke bla-bla-bla
    pop ecx ; восстановить значение ecx из стека

    Стек = твой друг.
     
    Последнее редактирование: 16 фев 2017
    rococo795 нравится это.
  11. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Видел раньше тему, где был код на fasm, который выдавал скорость работы любого кода или части кода. Не подскажете где эта тема. И вообще правильно ли я это понял? Можно как то измерять скорость работы своего кода, участка кода?
     
  12. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    push lpFileIn
    call [RemoveDirectoryA]

    Так удаляется лишь пустой каталог.
    1. Как удалить не пустой?
    2. Как найти описание этого каталога в фат и нтфс?
    3. Если я положу в этот каталог файл и открою его
    push 0 0 3 0 0 GENERIC_READ lpFileIn
    call [CreateFile]
    то ведь после открытия файла где то должны лежать в памяти данные каталога? Где?
     
  13. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    861
    Либо удалять рекурсивно, сначала все файлы в папке, потом папку. Еще можно использовать SHFileOperation. На висте и выше можно юзать IFileOperation.
    Что имеешь в виду? Аттрибуты?
    С висты GetFinalPathNameByHandle. Ранее проецируешь файл и получаешь через GetMappedFileName. Еще можно использовать ZwQueryInformationFile с FILE_NAME_INFORMATION.
     
  14. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Спасибо за ответы.
    Хотел попробовать найти на винте место где лежит описание папки - изменить там что либо - тем самым папка удалится. Или я не так вообще представляю этот процесс?
     
  15. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    Слишком упрощенно представляешь )

    Про Фат, можно так сказать. Нтфс - а она сейчас везде - там сложнее все.

    http://samag.ru/archive/article/245
    http://samag.ru/archive/article/375

    Напишешь свой парсер для работы с NTFS на секторном уровне - цены ему не будет :)
     
    Последнее редактирование: 29 мар 2017
    rococo795 нравится это.
  16. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    861
    Нужно пользоваться API функциями для удаления элементов файловой системы. Ты конечно можешь открыть диск, распарсить структуру файлов, и поменять ее так, но это неверный подход.
     
    rococo795 нравится это.
  17. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.548
    Адрес:
    Russia
    Хотя бы почитайте Руссиновича про FS и больше не будете предлагать такие вещи. Файловая система это не только структура на диске. Есть еще файловый кеш у операционной системы. И в итоге "переписав сектор" вы можете поиметь проблемы.
    Это прокатит, для работы с NTFS в других осях. Или из реального режима и тп.

    Юзайте API как предлагает Thetrik
     
    _edge и rococo795 нравится это.
  18. rococo795

    rococo795 Active Member

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

    Ещё над бы у дядь Жени Сусликова спросить новую версию хейва. Знает его кто? Ведь это крутая штука hiew? Спросить так - чтобы он её подарил 6 постоянным участинкам форума. Трём - самым умным! И трём - самым наоборот! :dance4:
     
  19. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    в двух словах, какие это Апи/группа Апи?

    собственно, файл можно монополизировать и/или сбрасывать дисковый кеш, для безпроблемного (безконкурентного) доступа к секторам, или у меня фантазия разбушевалась?

    тут я собственный принцип нарушаю, говоря о том, с чем дело не имел, поэтому ответьте кратко, в двух словах.
     
  20. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    861
    Ну и DeleteFile для файлов.

    Не уверен что система даст открыть системный диск для записи как минимум (не проверял это). Второй момент в том что Windows многозадачная система и с файлами могут работать несколько потоков, и если ты начнешь что-то менять непосредственно в файловой структуре то это может привести к фатальным последствиям. Чтение - другое дело, есть примеры дупликации файлов посредством чтения секторов диска, например заблокированных системой.
     
    _edge нравится это.