работа с HeapAlloc

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

  1. Painter

    Painter New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2011
    Сообщения:
    46
    Не могу прочитать файл в выделенный блок памяти...
    Код (Text):
    1.   proc ReadF filename
    2.       invoke CreateFile,[filename],GENERIC_READ or GENERIC_WRITE,\
    3.                       FILE_SHARE_READ or FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,0      ; открываем файл
    4.  
    5.       cmp eax,-1                                                                ; если ошибка открытия
    6.       jne no_error                                                              ; выводим ошибку на экран
    7.       stdcall ERROR_MESSAGE
    8.       jmp ..exit                                                                ; и выходим
    9.  
    10.     no_error:
    11.       mov [hFile],eax                                                           ; сохраняем дескриптор файла
    12.       invoke GetFileSize,[hFile],FileSizeHigh                                   ; получаем размер открытого файла
    13.       mov [FileSize],eax
    14.       cmp [FileSizeHigh],0                                                      ; если FileSizeHigh имеет какое нить значение отличное от нуля
    15.       ja FileSizeAbove                                                          ; значит файл больше 4Гб что нас не устраивает
    16.       cmp eax,104857600                                                         ; если он превышает 100мб то вывод сообщения
    17.       ja FileSizeAbove
    18.       stdcall HeapC,eax                                                         ; если файл меньше то выделяем память под него
    19.       or eax,eax
    20.       je ..exit                                                                 ; если ошибка резервирования памяти выход
    21.       mov [hHeap],eax                                                           ; память выделеного блока равна div(FileSize++,PageSize)*PageSize
    22.       invoke HeapAlloc,eax,HEAP_ZERO_MEMORY,0                                   ; выделяем память для работы
    23.       or eax,eax
    24.       je ..exit                                                                 ; если ошибка выделения памяти выход
    25.       mov [pHeap],eax                                                               ; сохраняем указатель на кучу
    26.       invoke ReadFile,[hFile],eax,[FileSize],dwFileReadSize,0                 ; считываем файл в память
    27.       jmp ..exit
    28.  
    29.     FileSizeAbove:
    30.       invoke CloseHandle,[hFile]                                                ; закрываем файл
    31.       invoke MessageBox,0,szErrorFileAbove,szErrorWin,MB_OK or MB_ICONERROR
    32.     ..exit:
    33.     ret
    34.   endp
    35.  
    36. ;--------------------------------------------------------------
    37. ; функция резервирует оперативную память целыми страницами
    38. ;--------------------------------------------------------------
    39.   proc HeapC SizeOfHeap
    40.       xor edx,edx
    41.       mov eax,[SizeOfHeap]
    42.       mov ebx,[SysInfo.dwPageSize]
    43.       div ebx
    44.       inc eax
    45.       mul ebx
    46.       mov [HeapS],eax
    47.       invoke HeapCreate,HEAP_NO_SERIALIZE,eax,0
    48.     ret
    49.   endp
    Ошибка возникает когда я пытаюсь прочитать файл в указанный буфер созданный HeapAlloc. Объясните что я делаю не так...
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    создать отдельную кучу размера с файл, выделить на ней ноль байт и потом удивляться, чеж возникает ошибка)))... и кстати что мешает пользовать кучу процесса?

    я смотрю вы такой амбициозный программист))) не оперативную, а виртуальную))) и если уж так хочется выделять непрерывные участки виртуальной памяти страницами, то зачем использовать для этого кучу? можно выделить необходимое количество страниц виртуальной памяти соответствующими функциями (VirtualAlloc и тд), или еще лучше сделать отображение файла в память... здается мне вам необходимо почитать про организацию виртуальной памяти... и в частности про то, чем куча не является...
     
  3. Painter

    Painter New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2011
    Сообщения:
    46
    Спасибо за подсказку... Только вот объясните пожалуйста зачем тогда в HeapCreate надо указывать размер? Я так чет и не понял и там, и там указываешь... А по поводу коментов скажу что я их для себя пишу...))) Если на то пошло, то под словом резервирует я и хотел показать что он ее еще не выделил, а только зарезервировал...)))
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    это куча... она может разростаться и уменьшаться в размерах... в зависимости от того, какое количество выделенной на ней памяти используется в данный момент, сколько в ней непрерывных блоков и тд... при создании кучи можно задать соответственно минимальный и максимальный ее размер...
     
  5. Painter

    Painter New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2011
    Сообщения:
    46
    Я еще только начинающий "програмист", объясните пож
    есть ли какое нить преимущество в использовании кучи процесса? В дальнейшем у меня куча будет расти вверх, можно как-то этого добится с помощью VirtualAlloc? Заранее спасибо!
    P.S. Не хотелось бы выделить функцией VirtualAlloc много памяти, а потом по мере необходимости пользоваться ей...
     
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    а есть ли какое-нить преимущество в создании собственной кучи? и зачем отключать сериализацию?

    нет никак... по понятным причинам VirtualReAlloc не существует...
     
  7. Painter

    Painter New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2011
    Сообщения:
    46
    Я просто привык что для работы с памятью ее надо выделить... Попробую почитать про работу с кучей процесса... Литературу не подскажете?
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Painter
    При создании каждого процесса загрузчик создаёт т.н. кучу по умолчанию. Т.е. она уже есть и является растущей. Получить хэндл кучи по умолчанию можно вызовом GetProcessHeap. Поэтому вызывать HeapCreate имеет смысл разве что при создании нестандартной кучи. Например, создание кучи статического размера или указание флага HEAP_NO_SERIALIZE, который может слегка ускорить работу с кучей, но при этом необходимо самостоятельно гарантировать, что никакие два потока не будут обращаться к куче одновременно. Но в большинстве случаев достаточно просто вызывать GetProcessHeap и радоваться куче по умолчанию.

    Ах да. Лучшая литература в данном случае — MSDN.
     
  9. Painter

    Painter New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2011
    Сообщения:
    46
    Спасибо!