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

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

  1. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    632
    Адрес:
    Russia
    Уф.. к сожалению, я выдаю ошибки, в том числе из-за недостатка практики. В частности, что чтение из файла не двигает указатель внутри этого файла.
    Я подумал, что ты добавляешь к началу массива в памяти, в который читаешь, если это так, этого не нужно делать.

    Данный исходник мы сможем отлаживать только при наличии какого-нибудь MTS файла.

    Ссылка на Исцелиона - ужас ужас. Тебе нужно научиться гуглить (и там есть опция "инструменты->только на русский", чтобы выводило с русскоязычных сайтов). "Getfilesize 4gb" дает много результатов. Там говорится о двух dword'ах, в одном из которых сохраняется часть возвращаемой длины файла, если он больше 4 гб. И будет очень много ссылок на Си-шные исходники, к сожалению, но придется это принять.

    MSDN:

    При работе с файлами > 4GB ф-ция GetFileSize фейлит, и возвращает невесть чего. Рекомендуется использовать GetFileSizeEx, которая возвращает длину в виде двух dword-значений.
     
    Последнее редактирование: 1 фев 2017
  2. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    250
    Нечё страшного..... Мы только крепчаем.... Я методом тыка понял так про invoke SetFilePointer,[FileIn],edi,ebp,0 ...что в edi, находятся данные со знаком.... и так как там всего 4 байта, то 4 гигами и не пахнет.... а половиную.... максимально можно уйти на 7f ff ff ff - а это чёто 1,99 гига.... Посмотрел на этом дюжа мне родном "ангицкАм" там что то говорят что мол можно увеличить задействовав ebp... как я понял вроде можно увеличить цифру, но оставаясь в 32битном пространстве... Считал вначале в ebp,(а edi = 0)как только он становился ff ff ff ff то переходил считать в edi, прибавлял к нему по единице..... Винда выскакивала окошком в котором ругалась и грозила даже отправить чё то в майкрософт!!! :meeting: я потом сделал первым счётчиком edi а ebp = 0 .. такая же хрень... Ну и уж потом тут спросил.....

    я не пойму - если есть в eax - начало файла - то почему нельзя от этого оттолкнуться и пойти от этого значения далее..... там что дырки есть??
     
  3. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    632
    Адрес:
    Russia
    Нужно найти русскую справку по Win32Api. И работать не наобум, а четко зная что делаешь. Погугли "русский справочник вин32 апи", но опасайся стремных пестрых сайтов, которые готовы тебе дать ЕХЕ файл вместо DOC/PDF/DJVU. Придется привыкать к диалогу с гуглом, он готов дать любую информацию, только нужно спрашивать.

    И - придется осваивать отладчик OllyDbg, там несколько кнопок разучить все лишь нужно.

    Что могу дать -
    http://www.twirpx.com/file/101601/ - зарегистрируйся на сайте, на нем много книг, без вирусов. Бесплатно можно скачать 10 книг.
    Там еще Щупак и Румянцев, их книги тоже захвати.
     
    Последнее редактирование: 1 фев 2017
  4. rococo795

    rococo795 Active Member

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

    Спасибо.... И так будем и сяк... И даже дождёмся тех - кто всё видит... знает как... и молчит!!! :to_clue:
     
  5. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    719
    Который раз уже пишу что нужно использовать SetFilePointerEx? В MSDN все подробно описано.
     
  6. rococo795

    rococo795 Active Member

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

    Я помню помню.... Просто уже через пень колоду решил вопрос.... Гляну конечно этот Ex.... Но вот всё равно.... Как так??? Когда в регистре лежит указатель на начало фала, Реадфилс берёт с этого регистра начало файла и читает в память...... так почему же нельзя прибавив к этому регистру пусть 2 байта и опять прочитать в память то же количество байт и в ту же память - но со смещения от начала файла в 2 байта?? В чём так сказать конхфуз???
     
  7. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    719
    Что-то либо я не понял тебя, либо у тебя неверное представление.
    У файлового объекта есть текущая позиция откуда будет осуществляться чтение либо куда будет производится запись. SetFilePointer/Ex - задают/получают эту позицию. Можешь представить эту функцию как 64 битный регистр который задает смещение. ReadFile вообще не имеет такого параметра (если ты не используешь асинхронное чтение/запись), она просто читает данные и сдвигает указатель на количество прочитанных/записанных байт.
     
  8. rococo795

    rococo795 Active Member

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

    1. mov eax,[FileIn]
    2. invoke ReadFile,eax,[HeapAllocMem],$2a0,cbRead,0
    3. test eax,eax
    4. jz .errReadFile
    В eax поместил начало исходного файла.... И этот код работает... то есть он читает в память такого же размера, столько байт... потом из памяти такой маленькой (для тренировки) я записываю в новый файл... всё работает нормально..... Потом я к eax прибавляю эти прочитанные $2a0 штук байт и опять хочу прочитать из eax который увеличился на эти байты - в ту же память такое же количество байт..... чтобы потом из памяти их записать в новый файл..... (то есть ту же задачу хочу выполнить через память) ... но когда увеличил eax - ничего не пишется...
     
  9. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    719
    Нет. В eax хранится хендл объекта-файла, никакого отношения к смещению это не имеет. В твоем случае ничего прибавлять не нужно, указатель сам сдвигается на нужное количество байт, просто еще раз вызываешь ReadFile и все.
     
  10. TermoSINteZ

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

    Публикаций:
    1
    Регистрация:
    11 июн 2004
    Сообщения:
    3.513
    Адрес:
    Russia
    Мы молчим не просто так, хотим чтоб иногда было "самообразование" :thank_you:
    Если бы вы мсдн почитали
    А значит да, там будет меньше 4гб, но есть же и второе поле, где верхняя часть
    ми даже более того в той же документации
    по этому - странно слышать от вас удивление:
    Надо было всего лишь прочитать документацию

    В итоге общий адрес формируется как комбинация двух значений. И обратите внимание, что второй адрес это указатель на данные, не сами данные.

    Код (C):
    1. LONGLONG position = -999;
    2. LONG *low_pos = (LONG*)&position;
    3. LONG *hi_pos = low_pos+1;
    Написал на Си чтоб вы поняли логику
    В итоге получается, некоторое большое сингед число вы передаете первую часть числа прямо, а вторую - указателем
    Код (ASM):
    1.  
    2. mov edi, 0FFFFFC19h  ;-999
    3. push eax
    4. mov [esp], 0FFFFFFFFh ; расширяем до 64 bit signed
    5. lea eax, [esp] ;сохраняем адрес - можно не делать, но не люблю передавать в invoke регистр esp
    6. invoke SetFilePointer,[FileIn],edi,eax,1   ;FILE_CURRENT
    7. ;.... тут проверяем eax , если надо вызываем GetLastError
    8. pop ebx   ;восстанавливаем стек
    9.  
    Вы должны понимать, не обязательно нужно использовать ebp и тп, вы можете вообще че угодно использовать. Это асм , можно писать как угодно, как вам удобно . ebp - рекомендуют как регистр для указывающий на локальные переменные, но никто не мешает вам напрямую юзать прямые адреса через esp или создавать временные переменные выделяя место налету.
    В данном случае, мы выделили место в стеке. esp указывает на этот адрес. Поместили в него нужное значение. Можно было бы его сразу запушить - но я сделал так , чтоб вы видели механизм, чтоб можно выделать любое кол-во памяти таким образом. Есть конечно и другие способы. например sub esp, xx .
    Ну и передали потом значения для установки файлового указателя, от текущего места.
    Не забываем восстанавливать стек.

    Ну и в конечном итоге - проверяйте GetLastError()

    //Add
    ну и да , юзайте SetFilePointerEx - она лучше, потому, что может возвращать новый поинтер в размере 64 bit , в отличие от SetFilePointer
     
    _edge нравится это.
  11. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    632
    Адрес:
    Russia
    Не надо стека. ТС уже принял решение работать через Heap. Не надо примеров на Си, это слишком сложно, боюсь.

    «Просто объяснить сложное-сложно. Сложно объяснить сложное — просто.»
    © Альберт Эйнштейн

    :)
     
  12. TermoSINteZ

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

    Публикаций:
    1
    Регистрация:
    11 июн 2004
    Сообщения:
    3.513
    Адрес:
    Russia
    _edge,
    проще уже некуда.
    Зачем выделять хип ради одного указателя на 4 байта?
    Пример на Си - что в нем сложного?
     
  13. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    632
    Адрес:
    Russia
    Человек может не знать Си, и работу со стеком. Это сложно представить, но это вероятно. Ветка Beginners.

    Хип и стек -померещилось что выделение памяти под данные для чтения чудесным образом идет через стек, лол. Красиво. Спасибо за код.
     
    Последнее редактирование: 1 фев 2017
  14. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    250
    TermoSINteZ, _edge,
    Ща ща... ща всё прочту.... (А чё они одолели своим английскым).. Читать можно сколь угодно и внимательно (даже как Шерлок Холмс - через гм... увелечительное стекло) только вот оно корявый гугловский перевод - не исправляет....:don-t_mention:

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

    Спасибо... но чё то там с этим регистром не то... доберусь я до него...
     
  15. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    Есть chm формат справки с поиском, с блэкджеком, для win32. Нужно? :)

    Си очень прост в понимании, новичкам нужно учиться программировать с Си. :)
     
    Последнее редактирование: 1 фев 2017
    rococo795 нравится это.
  16. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    632
    Адрес:
    Russia
    Да, выкладывайте, конечно. Что за форум такой без норм. материалов.
     
    rococo795 нравится это.
  17. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    Надеюсь для вас справка в EN в порядке вещей, да там в принципе все примитивно. :)

    Хотел в аттач, а он *.7z не понимает, мну ему в зип запаковал, а он: размер большой. :)

    Ссылка: https://yadi.sk/d/TlX4_SiU3CNGn9
     
    rococo795 нравится это.
  18. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    250
    section '.bss' data readable writeable
    stime SYSTEMTIME
    invoke GetLocalTime,stime
    mov ax,[stime.wYear]

    Вот так загружается любой параметр GetLocalTime в регистр....
    Напишите пожалуйста как мне что где зарезирвировать и какие названия параметров использовать чтобы положить в регистр:

    1. От invoke GetFileSize,eax,0 - lpFileSizeHigh

    section '.bss' data readable writeable
    ??????????
    invoke GetFileSize,eax,0
    mov edi,[?????????]

    2 От invoke SetFilePointer,[FileIn],edi,ebx,2 - lpDistanceToMoveHigh

    section '.bss' data readable writeable
    ??????????
    invoke SetFilePointer,[FileIn],edi,ebx,2
    mov edi,[?????????]

    Как это реализуется на fasm???
     
  19. _edge

    _edge Well-Known Member

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

    Конкретно по тому как на Фасме записать, не подскажу, потому что не могу практически сейчас опробовать, но если тебе нужна ясность,
    лучше от invoke'ов отказаться и таки использовать стек (все равно раз на асме пишешь, придется с ним иметь дело).

    ИМХО.

    1. Смотришь описание интересующей Апи в Msdn.
    Они все обычно в виде:

    Функция Блабла

    {
    _in_ параметр1
    _in_ параметр2
    _out_ параметр3
    _in_ параметр4
    };


    2. Пихаешь параметры в стек, но в обратном порядке, чем описано в описании.

    т.е.

    push параметр4
    push параметр3
    push пар-2
    push пар-1
    call [Блабла]


    3. Какие могут быть параметры для вызова и что/как возвращается.

    Параметр может быть либо непосредственным числом, таким как 0, или -1. т.е. push -1

    Он может передаваться как переменная, сунутая в регистр - т.е mov eax,[handle] / push eax

    Он может быть (это для возвращаемых значений) быть указателем на переменную в памяти

    т.е. если есть буфер Buff, делаешь push Buff (это запушит в стек указатель на буфер Buff)

    в папке Examples в Фасме можно посмотреть примеры.

    также, в Фасм есть invoke, и я так понимаю (не пользуюсь ими, т.к. использую стек), отличие от Масмовского невелико.

    Пробуй! Смотри примеры!
     
    Последнее редактирование: 3 фев 2017
    Ronin_ нравится это.
  20. rococo795

    rococo795 Active Member

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

    Спасибо Вам за посильную помощь...