возможно ли подменить виндовсовскую dll-ку без перезагрузки?
собстно, сабж. и если да - то как?выгрузить все приложения, которые её используют (найти их можно в Process Explorer'е заменить, запустить приложения обратно.
Win2k
regsvr32
regsvr32эт.то тут причём?
я потому и вставил сконфуженную рожу, т.к. постановка задачи неполна ИМХО
замени-ка ntdll.dll )
надо будет выгрузить все приложения. втч винду
Можно. Прямым доступом к диску. Получаешь с помощью API дефрагментатора кластеры в которых расположен файл и пишешь туда через устройство (или другая цифра). Что именно увидят приложения, которые используют эту длл'ку - сложный вопрос. Имеет смысл вначале изменить dll'ку в адресных пространствах всех процессов (можно для этого использовать CreateRemoteThread для создания потока, который загрузит вашу dll'ку, которая выполнит необходимую подмену).
исходную dll-ку переименовать, записать новую.
исходную dll-ку переименоватьда кто бы дал бы
да кто бы дал быи какую dll-ку нельзя переименовать?
переносить нельзя, а переименовать выполняемые файлы всю жизнь можно было - этим даже вирусняк пользуется.
переносить нельзя, а переименовать выполняемые файлы всю жизнь можно быловахъ
а когда он подцепит новую dll? при след. загрузке её или после того, как выгрузит старую?
гм, в винде понятия "переместить" (move) и "переименовать" (rename) - 2 разных?!
а когда он подцепит новую dll? при след. загрузке её или после того, как выгрузит старую?он - это кто?
если речь про уже запущенный процесс, то реально - никогда (т.к. обычно преобразование имени в dll - проходит при старте если же углубляться в детали - то при следующей подгрузке по имени
гм, в винде понятия "переместить" (move) и "переименовать" (rename) - 2 разных?!rename более частный случай move, rename - это move внутри одной диры. в этом случае - только изменяется имя внутри диры.
хендл же не привязан к дире.
и как из этого следует, что открытым файлом (суть хендл) rename можно сделать, а move - нельзя?при move возможно: изменение прав, изменение шифрования/компрессии, изменение положения на диске, смена диска и т.д.
хендл же не привязан к дире.
при rename всего этого нет.
он - это кто?Он - злобный ОС.
если речь про уже запущенный процесс, то реально - никогда (т.к. обычно преобразование имени в dll - проходит при старте если же углубляться в детали - то при следующей подгрузке по имени
т.е. при каждом запросе на загрузку dll проверяется, соответствует ли уже загруженный образ тому, что на диске?
т.е. при каждом запросе на загрузку dll проверяется, соответствует ли уже загруженный образ тому, что на диске?все проще, никаких проверок нет.
просто загрузка dll-ек происходит обычно один раз: при старте процесса
при старте процессаи при старте каждого нового процесса они заново загружаются?..
мне кажется, что чтобы процесс подцепил измененную библиотеку надо создать другой процесс который выжрет всю память (ну потом вернет конечно). при этом данные других процессов выгрузятся в своп, а страницы дллек просто будут помечены как отсутствующие. соответственно при следующем к ним обращении они будут подгружены с образа. правда немного смущает то, что вроде как библиотеки кешируются осью, так что менять скорее всего придется 2 файла - исходный и тот, который лежит в кеше.
мне кажетсяслушьте, ну гляньте уже мсдн, как в отношении винды может чтото казаться? в винде порою очень странная логика
ну гляньте уже мсднуломал, чертяга.
К сожалению, нету полной версии MSDN под рукой (а в инет лезть лень - там медленно но очевиден один факт - dll, однажды загруженная в память, будет использоваться всеми, кто её будет запрашивать, пока она не станет ненужной, когда и будет выкинута из памяти, и только после этого при обращении будет подгружаться новая версия dll.
и при старте каждого нового процесса они заново загружаются?..да, заново загружаются.
но так как загрузка dll - это маппинг файловой системы на память, то если dll та же самая (по расположению на диске то как такой новой загрузки не происходит.
мне кажется, что чтобы процесс подцепил измененную библиотеку надо создать другой процесс который выжрет всю память (ну потом вернет конечно). при этом данные других процессов выгрузятся в своп, а страницы дллек просто будут помечены как отсутствующие. соответственно при следующем к ним обращении они будут подгружены с образа. правда немного смущает то, что вроде как библиотеки кешируются осью, так что менять скорее всего придется 2 файла - исходный и тот, который лежит в кешемапинг идет по расположению на диске, а не по имени файла.
соответственно предложенный тобой способ не подойдет, т.к. при выгрузке все равно останется информация - какие именно файловые страницы были замаплены на память.
Оставить комментарий
elena-kotenok75
собстно, сабж. и если да - то как?Win2k