Хендлы не закроются. Только при завершении процесса. ДЛЛ можно переименовать когда она загружена. ИМХО, нафик шеллкоды... Всем загруженным модулям послать команду через файлмеппинг/пайпы/мьютексы. Каждый модуль освобождает свои ресурсы/память/хендлы, снимает свои хуки/пуки, грузит новую DLL и делает FreeLibraryAndExitThread.
Должно работать. Я это давненько юзаю. Единственный момент, что такой способ годится если длл подгружена только в один процесс, если процессов несколько, то это уже геморрой.
lamer2k попробуй такой код. это для масм Код (Text): GetRealAddr proc mov eax,[eax+2] mov eax,[eax] ret GetRealAddr endp ReloadDll proc LOCAL mem:dword mov esi,m2 sub esi,m1 mov ecx,esi add ecx,4*8 invoke VirtualAlloc,0,ecx,MEM_COMMIT,PAGE_EXECUTE_READWRITE mov mem,eax add eax,4*8 push eax mov ecx,esi mov edi,eax mov esi,m1 cld @@: lodsb stosb dec ecx jnz @b mov edi,mem mov eax,ExitThread call GetRealAddr mov [edi],eax mov eax,Sleep call GetRealAddr mov [edi+4],eax mov eax,LoadLibrary call GetRealAddr mov [edi+8],eax mov eax,FreeLibrary call GetRealAddr mov [edi+12],eax invoke VirtualAlloc,0,100,MEM_COMMIT,PAGE_READWRITE mov [edi+20],eax invoke GetModuleFileName,hInstance,eax,100 mov eax,VirtualFree call GetRealAddr mov [edi+24],eax pop eax jmp eax m1: push hInstance call dword ptr[edi+12] ;FreeLibrary push 60000 ;One Minute call dword ptr[edi+4] ;Sleep push [edi+20] ;Dll String call dword ptr[edi+8] ;Load Library push MEM_RELEASE push 0 push [edi+20] ;Dll String push 0 call dword ptr[edi] ;ExitThread m2: ReloadDll endp
Три года просидел в BEGINNERS, а оказывается ерунду можно во многих разделах писать. Aspire Не похоже на правду. %SYSTEMROOT%\system32\kernel32.dll элементарно переименовывается/перемещается. Для подобных перемещений (когда загружен исполняемый модуль, но нет открытых к нему хэндлов) единственное ограничение - это перемещения только в пределах логического диска. lamer2k Как вариант решения Вашей задачи: всю функциональность Вашей dll поместить в базонезависимый код. При загрузке в DLL_PROCESS_ATTACH dll выделяет для него память и помещает его туда, создаёт поток, исполняющий этот код, а возвращает FALSE. dll выгружается, а поток остаётся. Соответственно никаких проблем с подменой dll в рантайме не будет. В случае необходимости замены старая dll заменяется, базонезависимый код информируется о необходимости замены, освобождает ресурсы, спокойно делает LoadLibrary новой dll, делает на себя VirtualFree и передаёт управление на ExitThread. Единственный недостаток - нужно писать базонезависимый код, но это дело привычки.
А если там МНОГО кода. Запаришся все это писать в шелкод стиле. А вобще, если развить эту мысль, то можно сделать так. Две ДЛЛ, одна запускалка/подгружалка второй - основной. В основной вся функциональность. При обновлении первая вызывает из второй процедуру деинициализации, после чего выгружает, удаляет и загружает новую.
z_x_spectrum Пройденый этап... Собсно зачем лишная дллка. Код который я привёл вполне рабочий, я им к стате пользуюсь как раз для обновления длл, работает исправно. Естественно длл динамическая и никаких функций не экспортирует. задача её попасть в АП нужного процесса =)
Код (Text): GetRealAddr proc mov eax,[eax+2] mov eax,[eax] ret GetRealAddr endp ReloadDll proc LOCAL mem:dword mov esi,m2 sub esi,m1 mov ecx,esi add ecx,4*8 invoke VirtualAlloc,0,ecx,MEM_COMMIT,PAGE_EXECUTE_READWRITE mov mem,eax add eax,4*8 push eax mov ecx,esi mov edi,eax mov esi,m1 cld @@: lodsb stosb dec ecx jnz @b mov edi,mem mov eax,ExitThread call GetRealAddr mov [edi],eax mov eax,Sleep call GetRealAddr mov [edi+4],eax mov eax,LoadLibrary call GetRealAddr mov [edi+8],eax mov eax,FreeLibrary call GetRealAddr mov [edi+12],eax invoke VirtualAlloc,0,100,MEM_COMMIT,PAGE_READWRITE mov [edi+20],eax invoke GetModuleFileName,hInstance,eax,100 mov eax,VirtualFree call GetRealAddr mov [edi+24],eax pop eax jmp eax m1: push hInstance call dword ptr[edi+12] ;FreeLibrary push 60000 ;One Minute call dword ptr[edi+4] ;Sleep push [edi+20] ;Dll String call dword ptr[edi+8] ;Load Library push MEM_RELEASE push 0 push [edi+20] ;Dll String push 0 call dword ptr[edi] ;ExitThread m2: ReloadDll endp Не мог бы кто перевести это на си, очень интересует тема