динамически зарервировать данные в fasm

Тема в разделе "WASM.BEGINNERS", создана пользователем e4key, 27 сен 2009.

  1. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    снова всем привет)) можно ли изменять размер буфера по ходу программы? например, я хочу открыть файл и не знаю, сколько под него нужно резервировать места. как быть в данном случае? спасибо)
     
  2. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    http://msdn.microsoft.com/en-us/library/aa366779(VS.85).aspx
     
  3. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    спасибо. как я понял в моем случае будет разумно резервировать память через VirtualAlloc, передавай ей результат GetFileSize?
     
  4. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    и еще маленький вопрос :) читал http://sa-sec.org/?p=396 там сказано, что если резервировать данные, то они не изменят размер исполняемого файла. хотя я пробую зарезервировать 20 кбайт и размер получается такого размера -)
     
  5. IceT

    IceT IceT

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    233
    Адрес:
    RU
    Приведи цитату, я че-то не нашел там такого.
     
  6. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
     
  7. IceT

    IceT IceT

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    233
    Адрес:
    RU
    Покажи как резервируешь и размеры при резервировании и при прямом выделении.
     
  8. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    упс, читая твои слова вспомнил, что где-то читал, что нужно неинициализированные данные нужно объявлять в конце секции данных. сейчас попробовал и получил нормальный размер) спасибо.
     
  9. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    весь вопрос, как ты это делаешь. Компиляторы ассемблера, и особенно фасм, делает именно то, что напишешь. Поэтому если

    section '.data' data readable writeable
    Reserv20 rd 5000
    msg db "Hello",0

    то размер увеличится (сначала зарезервируется 20К, потом будет строка "Hello").

    А если наоборот, то есть после в блоке данных нет заданных значений, только другие резервированные - то конечно на размере не скажется. Если ты делаешь с одной секцией - тогда резервировать надо в конце, после импорта
     
  10. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    а с локальными переменными внутри процедуры тоже самое?
     
  11. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    а вот допустим я копирую строку в буфер, она туда не помещается. можно ли расширить именно этот буфер?
     
  12. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    и вообще как быть, если заранее не знаешь, какой размер данных будет помещаться в буфер? это может быть 500байт или 500кбайт. брать размер с запасом?
     
  13. IceT

    IceT IceT

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    233
    Адрес:
    RU
    от чего ушли - к тому пришли)
     
  14. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    e4key, размер локальных переменных нормально не изменить (можно играться со стеком, но если бы ты умел, ты бы не задал этот вопрос, а ты пользуешься proc). Но никто тебе не мешает хранить локально указатель на динамически созданный каким-нибудь HeapAlloc буфер.
    Если не знаешь, сколько данных будет, выделяешь сколько-нибудь, потом либо делаешь realloc каким-либо способом (см. линку выше), либо хранишь данные кусками в какой-нибудь структуре данных.
     
  15. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    спасибо) а вот что выбрать, поискал, нашел множество способов выделить память - virtualalloc, heapalloc, localalloc... что выбрать? у меня следующая ситуация: идет цикл, на каждой итерации я получаю строку и добавляю ее к общему буферу. проблема в том, что я не знаю, сколько там будет строк :) пока разобрался с virtualalloc и планирую на каждой итерации цикла перед конкатенацией строки к общему буферу увеличивать его realloc'ом. так будет правильно?
     
  16. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    e4key
    ну хотя бы
     
  17. IceT

    IceT IceT

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    233
    Адрес:
    RU
    Блин.. читайте книги, чтоли. Я понимаю, что раздел для новичков, но мат.часть прекрасно изложена в книгах. Рихтера почитай, например. Или Таненбаума.
     
  18. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    IceT, ок, спасибо)
     
  19. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    Вот делаю с помощью heapalloc:

    Код (Text):
    1. format PE GUI 4.0
    2. entry main
    3.  
    4. include 'win32a.inc'
    5. include 'encoding\win1251.inc'
    6.  
    7. section '.data' data readable writeable
    8.   hello         db 'hello', 0
    9.   hHeap         dd ?
    10.   heapBlock     dd ?
    11.  
    12. section '.code' code readable executable
    13.   main:
    14.         invoke  HeapCreate, 0, 200, 0
    15.         mov     [hHeap], eax
    16.         invoke  HeapAlloc, [hHeap], 0, 200
    17.         mov     [heapBlock], eax
    18.         invoke  lstrcat, [heapBlock], hello
    19.         invoke  MessageBox, 0, [heapBlock], hello, MB_OK
    20.         invoke  HeapFree, [hHeap], 0, [heapBlock]
    21.         invoke  ExitProcess, 0
    22.  
    23. section '.idata' import data readable writeable
    24.   library kernel32, 'kernel32.dll',\
    25.           user32, 'user32.dll'
    26.  
    27.   include 'api\kernel32.inc'
    28.   include 'api\user32.inc'
    Почему я получаю не строку "hello", а "хг9hello"?
     
  20. botmen

    botmen Member

    Публикаций:
    0
    Регистрация:
    2 сен 2007
    Сообщения:
    43
    может lstrcat ожидает увидеть ноль в первой строке?