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

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

  1. rococo795

    rococo795 Active Member

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

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    1. да; для обработки файлов более ~4гб (тут все же вероятнее речь о 2гб "барьере", нужно уточнение, я не хочу говорить однозначно что это так, но логика такова, что пользовательскому приложению дается 2гб памяти - http://www.frolov-lib.ru/books/bsp/v26/ch1_2.htm) - нужно будет делать заново ViewMapOfFile на новый кусок файла.
    2. да; винда свопить начнет сильно, если исчерпает запас свободной физической памяти.

    лучше спросить у TheTrick или ТермоСинтеза, или используй поиск здесь на форуме.

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

    сделать все быстро (в плане затрат на обращение к медленному hdd), но сожрать много ОЗУ
    сделать все медленно, подчитывая кусочки с харда, но экономя память
     
    Последнее редактирование: 31 янв 2017
  3. rococo795

    rococo795 Active Member

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

    Спасибо..... Сделаю на "побыстрому" без выделения памяти в программе... буду только читать, прыгать и писать...
     
  4. _edge

    _edge Well-Known Member

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

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Спасибо... :thank_you2: ссылку сохранил - апосля чуть буду моск напрягать... :scratch_one-s_head:
     
  6. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    1. А у этого глубокоуважаемого - "invoke SetFilePointer"-та, есть возможность отслеживать диапазоны перемещения? К примеру нашёл нужное место - а сколько от него до конца файла то??? Нет хитростей каких нибудь? Или только самому считать каждое действие этого invoke SetFilePointer, и считать от всего размера? Вот этот invoke SetFilePointer его можно попросить сработать от начала файла и от конца - в эти моменты можно с него снять эти места в памяти?
     
  7. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.553
    Адрес:
    Russia
    rococo795,
    МСДН почитать?

    dwMoveMethod [in]
    The starting point for the file pointer move.
    This parameter can be one of the following values.
    ValueMeaning
    FILE_BEGIN
    0
    The starting point is zero or the beginning of the file.
    FILE_CURRENT
    1
    The starting point is the current value of the file pointer.
    FILE_END
    2
    The starting point is the current end-of-file position.
     
  8. rococo795

    rococo795 Active Member

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

    Я уже почитал и сказал об этом выше.... Я спрашиваю как мне совершив invoke SetFilePointer,[FileIn],0,0,2 записать в регистр адрес памяти-конец файла...
     
  9. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Нужно использовать SetFilePointerEx. Делаешь перемещение в 0 от конца файла (FILE_END), в lpNewFilePointer возвращается текущая позиция от конца файла + 0, т.е. размер файла.
     
    rococo795 и _edge нравится это.
  10. rococo795

    rococo795 Active Member

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

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

    Кстати а что эти уважаемые Реад и Врите - вообще не хотят по многу читать и писать ???
    invoke ReadFile,[FileIn],lpBuffer,4,cbRead,0
    test eax,eax
    jz .errReadFile
    invoke WriteFile,[FileOut],lpBuffer,4,cbWrite,0
    test eax,eax
    jz .errWriteFile2
    add edi,4
    sub ebx,4

    Я сначала вместо 4 байт хотел одним массивом прочитать ну примерно $602700 - а в ответ тишина.... Что так???
     
  11. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Какая ошибка? Буфер корректно выделяется?
     
  12. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Я не смотрел... попробовал как показал на маленьком файле - секунд 5 и прога закончила работу... а задавал большие и чуть меньше значения - долго чё то там кряхтела кряхтела - я и дожидаться не стал.... думаю спрошу что к чему.... И там чтоб весь массив кратен 4 ём был... Я его массив сделал кратным 4ём... ну подумал пусть по наименьшему делителю и шуршит... А вообще я буфер так задал.... lpBuffer dd ? ... ошибку это где смотреть? в отладчике?
     
  13. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Ах, конечно вылетит, ты только для одного DWORD'а зарезервировал память. Такие большие объемы нужно выделять динамически либо в куче (HeapAlloc/HeapFree) либо в виртуальной памяти (VirtualAlloc/VirtualFree).
    GetLastError, а вообще в ольке и x64dbg последняя ошибка показывается в окне с регистрами. Но это относится к ошибкам API функций, не к эксепшенам как в твоем случае.
     
  14. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Да вопрос же был выше, там получается общий массив чуть более 2 гигов.... Ладно... Щас как в башке уляжется, попозже задам более грамотно оформленный вопрос.... Спасибо...
     
  15. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Код (ASM):
    1.  
    2. invoke CreateFile,lpFileIn,GENERIC_READ,0,0,3,0,0
    3. cmp eax,-1
    4. je .errlpFileIn
    5. mov [FileIn],eax
    6. invoke GetFileSize,eax,0
    7. cmp eax,$0ffffffff    
    8. je .errFileSize
    9. mov [FileSizeIn],eax        
    10. invoke GetProcessHeap
    11. mov [GetProcessHeapMem],eax
    12. invoke HeapAlloc,[GetProcessHeapMem],0,$2a0
    13. cmp eax,0
    14. je .errHeapAlloc  
    15. mov [HeapAllocMem],eax
    16.  
    17. mov eax,[FileIn]
    18. invoke ReadFile,eax,[HeapAllocMem],$2a0,cbRead,0
    19. test eax,eax
    20. jz .errReadFile
    21.  
    22. invoke CreateFile,lpFileOut,GENERIC_WRITE,2,0,1,0,0
    23. cmp eax,-1
    24. je .errlpFileOut
    25. mov [FileOut],eax
    26. invoke WriteFile,[FileOut],[HeapAllocMem],$2a0,cbWrite,0
    27. test eax,eax
    28. jz .errWriteFile2
    29. jmp .exit
    30.  
    Всё работает..... но мне надо прочитать из исходного файла следующие $2a0 штук байт, в ранее занятую память и записать в новый файл.... К eax прибавлял $2a0 - ничего не записывает...... а сам регистр увеличивается на $2a0.. Как читать и читать и читать и записывать порциями, через одну выделенную память????
     
  16. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    Прикрепи пжл целиковый исходник как вложение.
    В Eax - указатель на место в памяти. Оно (начало места в памяти для записи-чтения) неизменно. А вот в файле "указатель" нужно двигать.
     
  17. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Он сам двигается на величину прочитанных/записанных байт.
     
    _edge нравится это.
  18. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Код (ASM):
    1.  
    2. format PE GUI 4.0
    3. entry start    
    4.  
    5. include 'win32a.inc'
    6.  
    7. section '.bss' data readable writeable
    8. stime    SYSTEMTIME
    9. FileIn dd ?    
    10. FileSizeIn dd ?    
    11. GetProcessHeapMem dd ?
    12. HeapAllocMem dd ?
    13. FileOut dd ?    
    14. cbRead dd ?      
    15. cbWrite dd ?    
    16. lpBuffer dd ?
    17. dataAdres dd ?
    18. _PMXAdres dd ?
    19. sizeData dd ?
    20. sizeFile dd ?
    21. FileSizenData dd ?
    22.  
    23. section '.text' code readable executable
    24. start:  
    25. invoke MessageBoxA,0,text9,titl,0
    26.     invoke    GetLocalTime,stime
    27.     mov ax,[stime.wYear]      
    28.     cmp ax,$07e1          
    29.     jg .errData          
    30.     mov ax,[stime.wMonth]        
    31.     cmp ax,$0002
    32.     jg .errData
    33.     mov ax,[stime.wDay]      
    34.     cmp ax,$0002
    35.     jg .errData
    36.         invoke CreateFile,lpFileIn,GENERIC_READ,0,0,3,0,0
    37.         cmp eax,-1
    38.         je .errlpFileIn
    39.         mov [FileIn],eax
    40.         invoke GetFileSize,eax,0
    41.         cmp eax,$0ffffffff    
    42.         je .errFileSize
    43.         mov [FileSizeIn],eax        
    44.         invoke GetProcessHeap
    45.         mov [GetProcessHeapMem],eax
    46.         invoke HeapAlloc,[GetProcessHeapMem],0,$2a0
    47.         cmp eax,0
    48.         je .errHeapAlloc  
    49.         mov [HeapAllocMem],eax
    50.  
    51.         mov eax,[FileIn]
    52.         invoke ReadFile,eax,[HeapAllocMem],$2a0,cbRead,0
    53.         test eax,eax
    54.         jz .errReadFile
    55.  
    56.             invoke CreateFile,lpFileOut,GENERIC_WRITE,2,0,1,0,0
    57.             cmp eax,-1
    58.             je .errlpFileOut
    59.             mov [FileOut],eax
    60.             invoke WriteFile,[FileOut],[HeapAllocMem],$2a0,cbWrite,0
    61.             test eax,eax
    62.             jz .errWriteFile2
    63.  
    64.             jmp .exit
    65.  
    66.     .errlpFileIn:    invoke MessageBoxA,0,text,titl,MB_OK
    67.     jmp .exitP
    68.     .errFileSize:    push MB_OK titl text1
    69.     jmp .exit
    70.     .errHeapAlloc:    push MB_OK titl text2
    71.     jmp .exit
    72.    .errReadFile:    push MB_OK titl text3
    73.     jmp .exit
    74.    .errlpFileOut:    push MB_OK titl text4
    75.     jmp .exit
    76.    .errWriteFile:    push MB_OK titl text5    
    77.     jmp .exit
    78.    .errWriteFile2:    push MB_OK titl text8    
    79.     jmp .exit
    80.    .errData:        push MB_OK titl text7  
    81.     jmp .exit
    82.  
    83.  
    84. .exit:  
    85.         invoke CloseHandle,[FileIn]
    86.         invoke CloseHandle,[FileOut]
    87.         invoke HeapFree,[GetProcessHeapMem],0,[HeapAllocMem]
    88.         invoke MessageBoxA,0,text6,titl,0
    89. .exitP: invoke ExitProcess,0
    90.  
    91. section '.data' data readable writeable
    92.     lpFileIn    db 'C:\0\00.wav',0
    93.     lpFileOut    db 'C:\0\00(1).wav',0
    94.  
    95.     text        db    'Net faila 00.wav v papke C:\0\  ili on zanyat drugim procesom! ',0
    96.     titl        db    'Vnimanie!!!',0
    97.  
    98.     text1        db    'Ne mogu opredelit razmer faila',0
    99.     text2        db    'Ne mogu wydelit pamyat',0
    100.     text3        db    'Ne mogu prochitat fail w pamyat',0
    101.     text4        db    'Ne mogu sozdat 00(1).wav   Moghet on ughe sozdan v C:\0 ?  Esli da - to udalite!',0
    102.     text5        db    'Ne mogu nachat zapis novogo faila',0
    103.     text6        db    'Programma uspeshno zavershila rabotu !!!',0
    104.     text7        db    'Wremja deistvija programmy isteklo!!!',0
    105.     text8        db    'Ne mogu prodolghit zapis novogo faila',0
    106.     text9        db    'Poprobuem wylechit wav   ',\
    107.                     '(pereimenuyite wav w 00.wav,  pologhite ego w papku  C:\0   ',\
    108.                     'Zapuskaem programku   Po okonchanii rabotyi sozdastsja fail  C:\1\00(1).wav) ',0
    109.     textA        db    'Nayiden "data"  ',0
    110.     textB        db    'Net chanca "data" Ne mogu rabotat ',0
    111.     textC        db    'Net chanca "_PMX" Ichem dalee ',0
    112.     textD        db    'Nayiden "_PMX"  ',0
    113.     textE        db    'Net chanca "JUNK" Ichem dalee ',0
    114.     textF        db    'Nayiden "JUNK"  ',0
    115.  
    116.     Dannyie    db    $52,$49,$46,$46,$0c4,$0ea,$1a,$00,$57,$41,$56,$45,$66,$6d,$74,$20,\
    117.                     $10,$00,$00,$00,$01,$00,$02,$00,$44,$0ac,$00,$00,$10,$0b1,$02,$00,\
    118.                     $04,$00,$10,$00,$64,$61,$74,$61
    119.  
    120. section '.idata' import data readable
    121.   library kernel32,'kernel32.dll',\
    122.     user32,'user32.dll'
    123.  
    124.     include 'api\user32.inc'
    125.     include 'api\kernel32.inc'
    Вот он весь... я ненужное убрал.. оставил рабочее.... Я создал файл из куска первого... Теперь мне надо создать другой файл из последующего куска первого файла, такой же длины... а потом следующий кусок.... Конец файла не берём в расчёт пока - его потом посчитаю из другого объёма выделенной памяти и длины файла....
    Ещё вопрос...
    invoke CreateFile,lpFileIn,GENERIC_READ,0,0,3,0,0 - откроет файл любой длины?? 4-8 Гигов или есть ограничения???
    invoke GetFileSize,eax,0 - вычислит любую длину вплоть до ;fffffffe?
     
  19. rococo795

    rococo795 Active Member

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

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Начало то неизменно.... но я к значению в eax (началу) прибавляю $2a0.... я что не продвинулся дальше по файлу???