Код (Text): ... операции записи в отображение файла ... UnmapViewOfFile(pBase) ExitProcess() в таком коде UnmapViewOfFile нужен, или ExitProcess сам его сделает?
UnmapViewOfFile - это типа CloseHandle. При завершении процесса все хэндлы и так закроются. Запись производится в FlushViewOfFile. Очевидно, что эта функция вызывается при завершении процесса так же как и при UnmapViewOfFile
pBase - указатель на выдленный участок памяти, я бы лучше освобождал его, иначе и ExitProcess можно не ставить, т.к. со временем программа сама закроется из-за ошибки.
twgt, код такой что программа должна записать данные и завершиться, она полюбому закроется, и не изза ошибки, а потому что так надо и изза какой кстате ошибки?
Что-то я тоже не догнал )) тут логично. тут говриться о том, что если ты не вызывешь UnmapViewOfFile, то ExitProcess тоже можешь не вызывать... . т.к., если наберешься терпения и чуть-чуть подождешь, программа завершится сама... вроде как...из-за ошибки... чудеса...
Aspire Нет. Там говорится, что если писать надо правильно, а не абы как, надеясь что ОС приберёт то, что использовала программа.
twgt Нужно не надеяться, а точно знать что нужно вызывать и что можно не вызывать. Тема актуальна при написании шеллкодов, например. По крайней мере, я бы очень удивился увидев в каком-нить шелле вызов CloseHandle без явной на то необходимости.
Не большой эксперимент: Код (Text): ; Код для отображения PE-файла ; ; Открываем файл ; invoke CreateFile,addr lpFileName,GENERIC_READ,FILE_SHARE_READ, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, 0 mov hFile,eax .if eax==INVALID_HANDLE_VALUE mov eax,INVALID_HANDLE_VALUE ret .endif ; Проецируем его invoke CreateFileMapping, hFile, NULL, PAGE_READONLY, 0, 0, 0 mov hMap,eax .if hMap==0 xor eax,eax ret .endif invoke MapViewOfFile, hMap, FILE_MAP_READ, 0, 0, 0 mov lpPtr,eax .if eax==NULL xor eax,eax ret .endif mov edi, lpPtr ; Получаем смещение PE-заголовка assume edi: ptr IMAGE_DOS_HEADER add edi, [edi].e_lfanew assume edi: ptr IMAGE_NT_HEADERS ; Получаем EP и ImageBase ; ------------------ EntryPoint------------------ mov eax, dword ptr[edi].OptionalHeader.AddressOfEntryPoint mov EntryPoint,eax ;------------------ ImageBase------------------ mov eax, dword ptr[edi].OptionalHeader.ImageBase mov ImageBase,eax ; После работы освобождаем занимаемые ресурсы invoke CloseHandle,hFile invoke CloseHandle,hMap ;00AA0000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 MZђ.......яя.. ;00AA0010 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 ё.......@....... invoke UnmapViewOfFile,lpPtr ret После вызова UnmapViewOfFile память будет освобождена.
Coderess invoke CloseHandle,hFile invoke CloseHandle,hMap можно вызывать сразу после их использования: Код (Text): HANDLE hFile=CreateFile("...",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); if(INVALID_HANDLE_VALUE!=hFile) { HANDLE hFileMap=CreateFileMapping(hFile,NULL,PAGE_READWRITE|SEC_COMMIT,0,0,NULL); if(0!=hFileMap) { CloseHandle(hFile); char* p=(char*)MapViewOfFile(hFileMap,FILE_MAP_ALL_ACCESS,0,0,0); if(0!=p) { CloseHandle(hFileMap); ...
вопрос исчерпал себя на #2, #3 дальнейшее обсуждение - куча кодеса из серии "а что, если сделать так?"