Что нового

Выгрузить файл

Сообщения
95
Репутация
-1
Доброе время суток. Возможно ли выгрузить файл без завершения процесса?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
что значит "выгрузить"?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Xabib2302
есть например dll для контекстного меню
https://www.autoitscript.com/forum/topic/139347-autoit-unlocker/
Во всяком случае 7-zip.dll выгружает (Win7 x86). Правда, проводник после этого крашится при вызове контекстного меню... Но вам ведь интересна сама возможность? ;)

требуется завершить процесс explorer
И в чём проблема? Завершили, удалили, запустили. Скрипт в три строчки.
 
Автор
Xabib2302
Сообщения
95
Репутация
-1
И в чём проблема? Завершили, удалили, запустили. Скрипт в три строчки.
Мне не проблема написать скрипт, но я не знаю за какое время инсталлятор заменит этот файл. Поэтому я сделал 2 скрипта 1 из которых запускается в начале, а другой в конце установки.
Код:
While ProcessClose("explorer.exe")
  Sleep(100)
WEnd


Код:
If ProcessExists("Script.exe") Then ; запущен ли первый скрипт
   ProcessClose("Script.exe")
EndIf
If not ProcessExists("explorer.exe") Then 
   Run("explorer.exe", "")
EndIf


Можно обойтись и одним скриптом т.е. прописать завершение процесса и удаление этого файла,но путь установки (распаковки) программы может меняться.
Тем более второй скрипт не запускает проводник. Он открывает только папку Библиотека, а панель задач, рабочий стол и т.д. и т.п не появляются
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Xabib2302
не знаю за какое время инсталлятор заменит этот файл
Следите за размером и/или датой файла.

путь установки (распаковки) программы может меняться
Путь можно сохранить в реестре.

открывает только папку Библиотека
На x64 системах нужно запускать скрипт через AutoIt3_x64.exe.



Выгрузить dll из процесса можно так
Код:
; #AutoIt3Wrapper_UseX64 = Y

#include <WinAPI.au3>
#include <WinAPISys.au3>
#include <WinAPIProc.au3>
#include <ProcessConstants.au3>

$ProcName = "explorer.exe"
$DllName = "7-zip.dll"

$PID = ProcessExists($ProcName)
$aData = _WinAPI_EnumProcessModules($PID)
If @error Then Exit

For $i = 1 To $aData[0][0]
  If StringInStr($aData[$i][1], $DllName) Then
    $hKernel32 = DllOpen("kernel32.dll")
    $Access = BitOR($PROCESS_CREATE_THREAD, $PROCESS_QUERY_INFORMATION, $PROCESS_VM_OPERATION, $PROCESS_VM_WRITE, $PROCESS_VM_READ)
    $pHandle = _WinAPI_OpenProcess($Access, 0, $PID)
    $hModule = _WinAPI_GetModuleHandle("kernel32.dll")
    $FreeLibrary = _WinAPI_GetProcAddress($hModule, "FreeLibrary")
    $hThread = DllCall($hKernel32, "int", "CreateRemoteThread", "int", $pHandle, "int", 0, "int", 0, "long", $FreeLibrary, "long", $aData[$i][0], "int", 0, "int", 0)
    _WinAPI_WaitForSingleObject($hThread[0])
    _WinAPI_CloseHandle($hThread[0])
    _WinAPI_CloseHandle($hModule)
    _WinAPI_CloseHandle($pHandle)
    DllClose($hKernel32)
    ExitLoop
  EndIf
Next
Проблема в том, что процесс при обращении к этой dll аварийно завершит работу. Так, например, происходит с проводником на Win7x86 при вызове контекстного меню после выгрузки 7-zip.dll. А вот на Win10x64 проводник автоматически перезапускается. И соблюдайте разрядность системы: процессы x64 загружают соответствующие dll и выгружать их надо через AutoIt3_x64.exe.
 
Автор
Xabib2302
Сообщения
95
Репутация
-1
InnI сказал(а):
Xabib2302
не знаю за какое время инсталлятор заменит этот файл
Следите за размером и/или датой файла.

путь установки (распаковки) программы может меняться
Путь можно сохранить в реестре.

открывает только папку Библиотека
На x64 системах нужно запускать скрипт через AutoIt3_x64.exe.



Выгрузить dll из процесса можно так
Код:
; #AutoIt3Wrapper_UseX64 = Y

#include <WinAPI.au3>
#include <WinAPISys.au3>
#include <WinAPIProc.au3>
#include <ProcessConstants.au3>

$ProcName = "explorer.exe"
$DllName = "7-zip.dll"

$PID = ProcessExists($ProcName)
$aData = _WinAPI_EnumProcessModules($PID)
If @error Then Exit

For $i = 1 To $aData[0][0]
  If StringInStr($aData[$i][1], $DllName) Then
    $hKernel32 = DllOpen("kernel32.dll")
    $Access = BitOR($PROCESS_CREATE_THREAD, $PROCESS_QUERY_INFORMATION, $PROCESS_VM_OPERATION, $PROCESS_VM_WRITE, $PROCESS_VM_READ)
    $pHandle = _WinAPI_OpenProcess($Access, 0, $PID)
    $hModule = _WinAPI_GetModuleHandle("kernel32.dll")
    $FreeLibrary = _WinAPI_GetProcAddress($hModule, "FreeLibrary")
    $hThread = DllCall($hKernel32, "int", "CreateRemoteThread", "int", $pHandle, "int", 0, "int", 0, "long", $FreeLibrary, "long", $aData[$i][0], "int", 0, "int", 0)
    _WinAPI_WaitForSingleObject($hThread[0])
    _WinAPI_CloseHandle($hThread[0])
    _WinAPI_CloseHandle($hModule)
    _WinAPI_CloseHandle($pHandle)
    DllClose($hKernel32)
    ExitLoop
  EndIf
Next
Проблема в том, что процесс при обращении к этой dll аварийно завершит работу. Так, например, происходит с проводником на Win7x86 при вызове контекстного меню после выгрузки 7-zip.dll. А вот на Win10x64 проводник автоматически перезапускается. И соблюдайте разрядность системы: процессы x64 загружают соответствующие dll и выгружать их надо через AutoIt3_x64.exe.
не выгружает почему-то
Код:
; #AutoIt3Wrapper_UseX64 = Y

#include <WinAPI.au3>
#include <WinAPISys.au3>
#include <WinAPIProc.au3>
#include <ProcessConstants.au3>

$ProcName = "explorer.exe"
$DllName = "aimp_menu64.dll"

$PID = ProcessExists($ProcName)
$aData = _WinAPI_EnumProcessModules($PID)
If @error Then Exit

For $i = 1 To $aData[0][0]
  If StringInStr($aData[$i][1], $DllName) Then
    $hKernel32 = DllOpen("kernel32.dll")
    $Access = BitOR($PROCESS_CREATE_THREAD, $PROCESS_QUERY_INFORMATION, $PROCESS_VM_OPERATION, $PROCESS_VM_WRITE, $PROCESS_VM_READ)
    $pHandle = _WinAPI_OpenProcess($Access, 0, $PID)
    $hModule = _WinAPI_GetModuleHandle("kernel32.dll")
    $FreeLibrary = _WinAPI_GetProcAddress($hModule, "FreeLibrary")
    $hThread = DllCall($hKernel32, "int", "CreateRemoteThread", "int", $pHandle, "int", 0, "int", 0, "long", $FreeLibrary, "long", $aData[$i][0], "int", 0, "int", 0)
    _WinAPI_WaitForSingleObject($hThread[0])
    _WinAPI_CloseHandle($hThread[0])
    _WinAPI_CloseHandle($hModule)
    _WinAPI_CloseHandle($pHandle)
    DllClose($hKernel32)
    ExitLoop
  EndIf
Next
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Xabib2302

Предупреждение За нарушение общих правил (пункт В.2):
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Глобальный модератор.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Xabib2302 [?]
не выгружает почему-то
InnI
выгружать их надо через AutoIt3_x64.exe

Если у вас полная версия SciTE и вы запускаете скрипт из неё, то раскомментируйте первую строку
Код:
#AutoIt3Wrapper_UseX64 = Y
В противном случае запускайте скрипт через всплывающее меню au3-файла "Run Script (x64)". Либо компилируйте скрипт под x64 и запускайте полученный EXE.
 
Автор
Xabib2302
Сообщения
95
Репутация
-1
У меня lite версия SciTE. Run Script (x64) тоже пробовал. Dll все-равно весит в контекстном меню и в процессе explorer. UnlockerCOM.dll выгружает
 

Вложения

  • SnagIt - [10.01.2017 - 12.25.26].png
    SnagIt - [10.01.2017 - 12.25.26].png
    8.8 КБ · Просмотры: 8

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Xabib2302
Я проверил на Win10x64 - aimp_menu64.dll из проводника выгружается. Т.е. до запуска скрипта Process Explorer её находит, после работы скрипта - нет.

Вы когда скрипт запускаете - у вас сколько процессов explorer.exe? Должен быть только один, т.к. скрипт обрабатывает первый найденный.

Проверьте так. Положите mp3-файл на рабочий стол, закройте все процессы explorer.exe, кроме рабочего стола, вызовите на mp3-файле контекстное меню. Теперь поищите dll в Process Explorer - он её найдёт. Запустите скрипт. Повторите поиск - Process Explorer не должен найти dll. Другими словами, dll подгружается при первом вызове меню в тот процесс, в окне которого вы работаете.
 
Автор
Xabib2302
Сообщения
95
Репутация
-1
InnI сказал(а):
Проверьте так. Положите mp3-файл на рабочий стол, закройте все процессы explorer.exe, кроме рабочего стола, вызовите на mp3-файле контекстное меню. Теперь поищите dll в Process Explorer - он её найдёт. Запустите скрипт. Повторите поиск - Process Explorer не должен найти dll. Другими словами, dll подгружается при первом вызове меню в тот процесс, в окне которого вы работаете.
да. работает. я просто после работы скрипта сразу заходил в контекстное меню чтобы нажать "расположение файла" и поэтому не удавалось удалить или заменить dll


Добавлено:
Сообщение автоматически объединено:

Но появилась другая проблема. На Win 7 x86 explorer перезапускается в виде ошибки. "Прекращение работы Проводник"
 
Автор
Xabib2302
Сообщения
95
Репутация
-1
InnI, можно ли дописать в скрипт вторую dll?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Xabib2302
можно ли дописать в скрипт вторую dll?
Странный вопрос для человека, которому
не проблема написать скрипт
Или вы у меня спрашиваете разрешение на изменение кода скрипта? :smile:

Конечно, можно! Вопрос в другом: "А нужно ли?" Если бы выгрузка dll была безопасной операцией, то любой установщик делал бы это самостоятельно и не предлагал бы перезагрузку или перелогин. Я очень не рекомендую заниматься этим кроме как в "академических" целях.
 
A

Alofa

Гость
Xabib2302 сказал(а):
На Win 7 x86 explorer перезапускается в виде ошибки...
И я вам больше скажу: при этом, к примеру, UAC напрочь перестает выполнять свои функции (перезапуск же будет от вашего администраторского имени) и бог его знает какие еще службы могут пострадать.
А что вы будете делать когда процессов "explorer.exe" будет несколько (вошли несколько пользователей)?

InnI сказал(а):
Я очень не рекомендую заниматься этим...


Добавлено:
Сообщение автоматически объединено:

Зато могу посоветовать пойти другим путем. Оставляете в покое .DLL до ближайшего выключения/перезагрузки ПК и удаляете ее, а после и сам скрипт.
 
Верх