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

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

  1. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Мудрые конечно ребята, которые советуют самообразование и так далее....!!! Я действительно благодарен за подводящие и наводящие подсказки.....
    Просьба к Вам небольшая.... Так как Вы советуете и подсказываете новичкам (а я так уж вообще - вечный новичок) - то не приходила ли Вам мысль о том, что если человеку не совсем понятен смыл построения и вызова АПИ, тот который с МСДН - то он **** не волшебник и вообще никогда не сможет понять почему Ваши советы и примеры не работают и вообще никогда не заработают!!!! Хорошо у меня умищи уйма и терпения... И всего лишь за какие то 3 дня я методом тыка доехал... Что в C:\fasmw17157\INCLUDE\API\KERNEL32.INC - нету GetFileSizeEx !!! Что её надо вручную дописать...!!! Что толку новичку от любого совета по GetFileSizeEx??? Он сто раз хоть через голову перекувыркнёться - но получит ошибку компилятора...
    Уверен что давая совет новичку по АПИ - просто необходимо всегда вместе с примером работы самой функции АПИ - приводить строки секции
    section '.idata' import data readable
    library kernel32,'kernel32.dll'
    include 'api\kernel32.inc'
    от которых зависит вызов этой АПИ.... Посмотреть есть ли она там вообще (может ещё какие моменты есть)...
     
    Последнее редактирование: 4 фев 2017
    _edge нравится это.
  2. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Отвечаю на свой вопрос...

    section '.bss' data readable writeable
    LARGE_INTEGER dq ?

    section '.text' code readable executable
    invoke GetFileSizeEx,[FileIn],LARGE_INTEGER
    mov eax,dword[LARGE_INTEGER] - младшая часть
    mov esi,dword[LARGE_INTEGER+4] - старшая часть....

    section '.idata' import data readable
    library kernel32,'kernel32.dll'
    include 'api\kernel32.inc'
     
    Последнее редактирование: 4 фев 2017
    _edge нравится это.
  3. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Размер будет указан на 1 байт больше, чем все байты файла с которыми можно работать.... Так как в любом файле (наверно) последний байт - пустой... Не нулевой!!! А пустой..... То есть если в моём случае размер с которым я буду работать это - 0000 0001 11a6 072e ..... то функция выдаст - 0000 0001 11a6 072f ...... Старшая часть 0000 0001 - из esi..... младшая - 11a6 072f - из eax.....
     
  4. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    rococo795,
    если я пишу на фасме, я объявляю функции сам. Это не так сложно.
    А самое классное, что вы наступили на грабли компилятора. А значит у вас есть Сакральное знание! теперь вы опытны )
    А я оставлю это здесь
    Код (ASM):
    1. format PE GUI
    2. entry start
    3.  
    4. section '.code' code readable executable
    5.  
    6.   start:
    7.         push 0
    8.         push 0
    9.         push 3
    10.         push 0
    11.         push 1
    12.         push 80000000h
    13.         push _file
    14.         call [CreateFileA]
    15.         cmp  eax,-1
    16.         je   file_error
    17.         mov [_handle], eax
    18.         push 0
    19.         push _caption
    20.         push _message1
    21.         push 0
    22.         call [MessageBoxA]
    23.         push _size
    24.         push [_handle]
    25.         call [GetFileSizeEx]
    26.         cmp  eax,0
    27.         je   file_error
    28.         push dword [_size+4]
    29.         push dword [_size]
    30.         push _format
    31.         push 100h
    32.         push _out_str
    33.         call [wnsprintfA]
    34.         push 0
    35.         push _caption
    36.         push _out_str
    37.         push 0
    38.         call [MessageBoxA]
    39.  
    40.         push [_handle]
    41.         call [CloseHandle]
    42.         jmp  no_error
    43.  
    44.    file_error:
    45.         push 0
    46.         push _caption
    47.         push _message2
    48.         push 0
    49.         call [MessageBoxA]
    50.  
    51.    no_error:
    52.         push 0
    53.         call    [ExitProcess]
    54.  
    55. section '.data' data readable writeable
    56.  
    57.   _caption  db 'File size',0
    58.   _message1 db 'Open Success',0
    59.   _message2 db 'Falied operation',0
    60.   _file     db 'test_file.bin',0
    61.   _handle   dd 0
    62.   _size     dq 0
    63.   _format   db "File size %llu",0
    64.   _out_str  db 100h dup 0, 0
    65.  
    66. section '.idata' import data readable writeable
    67.  
    68.   dd 0,0,0,RVA kernel_name,RVA kernel_table
    69.   dd 0,0,0,RVA user_name,RVA user_table
    70.   dd 0,0,0,RVA shlwapi_name,RVA shlwapi_table
    71.   dd 0,0,0,0,0
    72.  
    73.   kernel_table:
    74.     GetLastError dd RVA _GetLastError
    75.     GetFileSizeEx dd RVA _GetFileSizeEx
    76.     CreateFileA dd RVA _CreateFileA
    77.     CloseHandle dd RVA _CloseHandle
    78.     ExitProcess dd RVA _ExitProcess
    79.     dd 0
    80.   user_table:
    81.     MessageBoxA dd RVA _MessageBoxA
    82.     dd 0
    83.   shlwapi_table:
    84.     wnsprintfA dd RVA _wnsprintfA
    85.     dd 0
    86.  
    87.   kernel_name db 'KERNEL32.DLL',0
    88.   user_name db 'USER32.DLL',0
    89.   shlwapi_name db 'SHLWAPI.DLL',0
    90.  
    91.   _GetLastError dw 0
    92.     db 'GetLastError',0
    93.   _CreateFileA dw 0
    94.     db 'CreateFileA',0
    95.   _GetFileSizeEx dw 0
    96.     db 'GetFileSizeEx',0
    97.   _CloseHandle dw 0
    98.     db 'CloseHandle',0
    99.   _ExitProcess dw 0
    100.     db 'ExitProcess',0
    101.   _MessageBoxA dw 0
    102.     db 'MessageBoxA',0
    103.   _wnsprintfA dw 0
    104.     db 'wnsprintfA',0
     
    _edge нравится это.
  5. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    И да, мой код выдает размер файла в байтах один в один. Тотал и винда показывают ровно одинаковые размеры файла, такие же как и программа на фасме.
     
  6. rococo795

    rococo795 Active Member

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

    Спасибо.... Буду осмыслять...:boast:
     
  7. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Такой вопрос... Если работать с файлом ну пусть 5 гигов.... оперативки 4-8 гига, винда 7*32 - то сколько оптимально выделять памяти для работы с таким файлом по частям??? Примерно хотя бы.. Или может есть очень нестрогая формула для очень примерного размера выделяемой памяти для работы с файлами больших размеров???
     
  8. _edge

    _edge Well-Known Member

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

    скомпилировал указанный сорец в файл (с консоли, без доп. ключей), скопировал тот же exe в test_file.bin 2048 байт размером, запускаю exe,

    upload_2017-2-4_16-18-26.png

    --

    включил голову, открыл инет почитал в Msdn про printf, поменял lu на u, все стало ОК. видимо ты опечатался, написав лишнюю "эль",

    _format db "File size %llu",0

    Проверил на файле 2.09гб, размер показывает верно.
     
    Последнее редактирование: 4 фев 2017
  9. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    Индексация массивов начинается с нуля. Это ж азбучная истина. Если размер файла 10 байт, то допустимые смещения в нем 0..9.
     
    Ronin_ и rococo795 нравится это.
  10. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    104.22 МБ. Это самый оптимальный во всех смыслах размер буфера :)
     
    rococo795 нравится это.
  11. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    Ахаха 5 )))

    не опечатался. возможно дело другом (версия винды). Может нужен другой перфикс . напирмер %I64d - должно тоже работать
    %llu это как раз 64 битное число. У меня работает. Если %lu указать - то будет 32 битное. Тогда файл больше 4 гигов там не правильно отобразится размер.

    В общем чем больше этот блок - тем больше будет скорость. ) Это актуально для последовательного чтения \ записи больших файлов.
    Посмотрите бенчмарки хдд. У них максимальные скорости достигаются при последовательных чтениях и записи большими блоками. Чем по маленькому блоку (много лишних телодвижений, много вызовов и копирований туда сюда - это отнимает время).

    Вы даже ради эксперимента можете сделать прогу чтения \ записи, указав блоки. И сами определить эмпирически - какой для вашей системы блок самый оптимальный.
     
    rococo795 нравится это.
  12. _edge

    _edge Well-Known Member

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

    %I64d - работает ОК, а %lu действительно на 8гб файле дает неверный вывод, спасибо.
    ОС ХР сп3, "Библиотека небольших программ оболочки" SHLWAPI версии 6.0.2900.5512

    Кстати, если кто не знал, тут можно отPrintScreen'енные штуки вставлять напрямую в окно набора текста через "вставить", минуя сохранение в файл. Удобно.

    --

    все это напоминает "итак, ты просто хочешь скопировать файл", https://habrahabr.ru/post/301924/
     
    Последнее редактирование: 4 фев 2017
  13. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    Потому что надо читать не man printf, а документацию по той библиотеке, функции которой используешь; в разных crt спецификаторы формата для printf-функций отличаются (особенно это относится к int64 и unicode).
     
  14. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    ну если вы почитаете, то увидите, что там идет отсылка к printf где нет инфы о 64 . Зато есть ссылка на формат спеку в которой указана ссылка на спеку размеров . Вот в последней есть как ll так и I64.
    Но вот у меня на windows 7 x64 . поддержка флага ll - работает. А вот у уважаемого _edge, на windows XP не особо.
    Разве что дело в спецификаторе u,
    уважаемый _edge, попробуйте lld на вашей системе.
     
  15. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    _format db "File size %lld",0

    являет:

    "File size ld"
     
  16. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    TermoSINteZ,
    Но ведь %d это для знаковых типов, а %u - беззнаковый.
     
  17. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    rmn, соглашусь. но LARGE_INTEGER = 64-bit signed integer
    Так что правильнее тут использовать %lld. С u - я конечно в своем сорце ошибся, хотя и не влияло на результат.
    Но нужно было проверить. И походу бага в XP есть. Судя по MSDN функция поддерживается в библиотеке от 6 версии. Но видимо не полностью, или не все флаги.
     
  18. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    И вообще, не нужно пользователю выводить int64. Нужно преобразовать его во float, делить его на 1024 пока больше 1024 и вывести с тремя знаками после запятой и соответствующим суффиксом (Б, КБ, МБ, ...)
     
    _edge нравится это.
  19. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    В этом конкретном случае он signed для того, чтобы иметь возможность размером файла сообщить об ошибке.
     
  20. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    Действительно - но я предлагаю это оставить как домашнее задание для rococo795. :cools:

    GetFileSizeEx - не возвращает ошибку в буфере. А возвращает ее результирующим кодом.
     
    rococo795 нравится это.