Конференция "WinAPI" » Вызов функции из dll через rundll32 - shellex
 
  • gerhy4 © (24.06.18 22:44) [0]
    Добрый вечер

    Вопрос

    Есть антивирус Nano Antivirus ( вообще не принципиально )

    У него нет командной строки ( возможно и есть но не найти в документации а то что найдено не работает уже года 3 )

    хотелось бы запускать сканирование объектов с командной строки, но ее нет )

    но есть интегрированный в explorer shellex dll модуль который при нажатии на файл запускает сканирование этого файла в антивирусе ( те то что хотелось бы сделать через командную строку )

    HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers
    расширения оболочки прописаны например тут ( одно из мест )

    Вопрос

    Можно ли используя например rundll32.exe или же подключив shellex библиотеку антивируса к своему продукту каким то образом запустить функцию из этой длл передав в аргументах путь к проверяемому обьекту ?

    Экспорт в shellex.dll показал что в ней находятся следующие экспортируемые функции

    DllCanUnloadNow
    DllGetClassObject
    DllRegisterServer
    DllUnregisterServer

    первые 2 при вызовах ничего не дали

    те вопрос в том можно ли как то эмулировать вызов функции из dll которая прописана как расширение оболочки explorer.exe ?
  • Dimka Maslov © (24.06.18 23:32) [1]
    Можно. Но предварительно надо изучить такие вещи как COM-сервера и то как работают и вызываются расширения оболочки.
  • gerhy4 © (25.06.18 01:05) [2]
    ок

    следующий вопрос

    я так понимаю что изучать работу com серверов время немного нет свободного на данном этапе

    возможно кому то интересно будет сделать реализацию на delphi либо в виде вызова через командную строку ( например через rundll32.exe )

    понятное дело за деньги
    Например за 100 $

    пишите сюда или на email контакты для связи
  • Прохосый (25.06.18 17:11) [3]
    Этот rundll32.exe вообще не при чём. Подключать dll напрямую в свой проект - тоже мимо.

    Вам надо брать GUID этой библиотеки (там же в реестре, чуть ниже по дереву что вы описали) и создавать COM-объект через функцию CreateComObject().
    Потом, от полученного IInterface можно пробовать получать интерфейсы методом QueryInterface(). А вот какие интерфейсы вам нужно пробовать подключать - это уже вопрос.
    Какие именно там имеются ContextMenuHandlers?
  • Прохосый (25.06.18 17:35) [4]
    ...
    const CLSID_NanoAntivirusShellEx: TGUID = '{........}'; // из реестра, в нём ещё настроен путь к dll/exe
    var Ret: HRESULT; NanoAntivirusObj: IInterface; SomeInterface: ISomeInterface;
    begin
    NanoAntivirusObj:=CreateComObject(CLSID_NanoAntivirusShellEx);
    Ret:=NanoAntivirusObj.QueryInterface(IID_SomeInterface, SomeInterface);
    if not Succeeded(Ret) then ShowMessage('NanoAntivirusObj :: QueryInterface :: IID_SomeInterface :: '+SysErrorMessage(Ret));
    ...

    Возможно на всякий случай хорошо бы ещё и в try обернуть, но вроде и так пойдёт.
    Все вхождения SomeInterface заменяются на название нужного интерфейса. Какой вам нужен - надо разбираться.
  • Зодчий (26.06.18 00:42) [5]
    function ComObjectExists(const CLSID: TGUID): boolean;
    var Ret: HRESULT; ProgID: POleStr;
    begin
    Ret:=ProgIDFromCLSID(CLSID, ProgID);
    // btw, Is it necessary to free ProgID?
    case Ret of
       S_OK:
           Result:=True;
       REGDB_E_CLASSNOTREG:
           Result:=False;
       else
           raise EOleSysError.Create(#9'Error in ComObjectExists:'+#13#10#13#10+'CLSID:   '+GUIDToString(CLSID)+#13#10#13#10+SysErrorMessage(Ret), Ret, 0);
       end;
    end;

    ...
    const CLSID_NanoAntivirusShellEx: TGUID = '{...-...-...-...-...}';
    var Ret: HRESULT; NanoAntivirusShellEx: IInterface; SomeShellExInterface: ISomeShellExInterface;
    begin
    if ComObjectExists(CLSID_NanoAntivirusShellEx) then
       begin
       NanoAntivirusShellEx:=CreateComObject(CLSID_NanoAntivirusShellEx);
       Ret:=NanoAntivirusShellEx.QueryInterface(IID_ISomeShellExInterface, SomeShellExInterface);
       if Succeeded(Ret) then
           begin
           ...
           // use SomeShellExInterface
           ...
           SomeShellExInterface:=nil;
           end
       else
           ShowMessage('NanoAntivirusShellEx :: QueryInterface :: IID_ISomeShellExInterface :: '+SysErrorMessage(Ret));
       NanoAntivirusShellEx:=nil;
       end
    else
       ShowMessage('NanoAntivirusShellEx :: '+SysErrorMessage(Cardinal(REGDB_E_CLASSNOTREG)));
    end;
  • DayGaykin © (12.07.18 09:49) [6]
    За 100$ я бы взялся gdale@ya.ru
 
Конференция "WinAPI" » Вызов функции из dll через rundll32 - shellex
Есть новые Нет новых   [134427   +26][b:0][p:0]