UnmapViewOfFile

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

  1. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Код (Text):
    1. ... операции записи в отображение файла ...
    2. UnmapViewOfFile(pBase)
    3. ExitProcess()
    в таком коде UnmapViewOfFile нужен, или ExitProcess сам его сделает?
     
  2. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    эксперимент показал что UnmapViewOfFile не нужен
     
  3. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    UnmapViewOfFile - это типа CloseHandle. При завершении процесса все хэндлы и так закроются.
    Запись производится в FlushViewOfFile. Очевидно, что эта функция вызывается при завершении процесса так же как и при UnmapViewOfFile
     
  4. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    pBase - указатель на выдленный участок памяти, я бы лучше освобождал его, иначе и ExitProcess можно не ставить, т.к. со временем программа сама закроется из-за ошибки.
     
  5. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    twgt, код такой что программа должна записать данные и завершиться, она полюбому закроется, и не изза ошибки, а потому что так надо
    и изза какой кстате ошибки?
     
  6. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    GoldFinch
    Ну так проведи эксперимент и убери ExitProcess.
     
  7. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Что-то я тоже не догнал ))
    тут логично.
    тут говриться о том, что если ты не вызывешь UnmapViewOfFile, то ExitProcess тоже можешь не вызывать...
    .
    т.к., если наберешься терпения и чуть-чуть подождешь, программа завершится сама... вроде как...из-за ошибки... чудеса...
     
  8. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Aspire
    Нет. Там говорится, что если писать надо правильно, а не абы как, надеясь что ОС приберёт то, что использовала программа.
     
  9. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    twgt
    Нужно не надеяться, а точно знать что нужно вызывать и что можно не вызывать. Тема актуальна при написании шеллкодов, например. По крайней мере, я бы очень удивился увидев в каком-нить шелле вызов CloseHandle без явной на то необходимости.
     
  10. Coderess

    Coderess New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2008
    Сообщения:
    41
    Не большой эксперимент:
    Код (Text):
    1. ; Код для отображения PE-файла
    2. ;
    3.  
    4.  
    5. ; Открываем файл
    6. ;
    7.  
    8. invoke CreateFile,addr lpFileName,GENERIC_READ,FILE_SHARE_READ, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, 0
    9. mov hFile,eax
    10. .if eax==INVALID_HANDLE_VALUE
    11.     mov eax,INVALID_HANDLE_VALUE
    12.     ret
    13. .endif
    14.  
    15. ; Проецируем его
    16.  
    17. invoke CreateFileMapping, hFile, NULL, PAGE_READONLY, 0, 0, 0
    18. mov hMap,eax
    19. .if hMap==0
    20.     xor eax,eax
    21.     ret
    22. .endif
    23. invoke MapViewOfFile, hMap, FILE_MAP_READ, 0, 0, 0
    24. mov lpPtr,eax
    25. .if eax==NULL
    26.     xor eax,eax
    27.     ret
    28. .endif
    29. mov edi, lpPtr
    30.  
    31. ; Получаем смещение PE-заголовка
    32.  
    33. assume edi: ptr IMAGE_DOS_HEADER
    34.     add edi, [edi].e_lfanew
    35. assume edi: ptr IMAGE_NT_HEADERS
    36.  
    37.  
    38. ; Получаем EP и ImageBase
    39.  
    40. ; ------------------ EntryPoint------------------
    41. mov eax, dword ptr[edi].OptionalHeader.AddressOfEntryPoint
    42. mov EntryPoint,eax
    43. ;------------------ ImageBase------------------
    44. mov eax, dword ptr[edi].OptionalHeader.ImageBase
    45. mov ImageBase,eax
    46.  
    47.  
    48. ; После работы освобождаем занимаемые ресурсы
    49.  
    50. invoke CloseHandle,hFile
    51. invoke CloseHandle,hMap
    52.  
    53. ;00AA0000  4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00  MZђ.......яя..
    54. ;00AA0010  B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00  ё.......@.......
    55.  
    56. invoke UnmapViewOfFile,lpPtr
    57. ret
    После вызова UnmapViewOfFile память будет освобождена.
     
  11. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Coderess
    invoke CloseHandle,hFile
    invoke CloseHandle,hMap
    можно вызывать сразу после их использования:
    Код (Text):
    1.     HANDLE hFile=CreateFile("...",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,
    2.         NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    3.     if(INVALID_HANDLE_VALUE!=hFile)
    4.     {
    5.         HANDLE hFileMap=CreateFileMapping(hFile,NULL,PAGE_READWRITE|SEC_COMMIT,0,0,NULL);
    6.         if(0!=hFileMap)
    7.         {
    8.             CloseHandle(hFile);
    9.             char* p=(char*)MapViewOfFile(hFileMap,FILE_MAP_ALL_ACCESS,0,0,0);
    10.             if(0!=p)
    11.             {
    12.                 CloseHandle(hFileMap);
    13.                 ...
     
  12. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Не спорю, но вопрос состоял совершенно в другом.
     
  13. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    вопрос исчерпал себя на #2, #3 :) дальнейшее обсуждение - куча кодеса из серии "а что, если сделать так?"