rundll32 и доступ к системным функциям

rundll32 - это средство командной строки, позволяющие выполнять некоторые функции, экспортируемые из DLL-библиотек. Его "предшественником" был rundll, использовавшийся в 16-разрядных версиях Windows. Эта прога позволяет выполнять функции только из тех DLL, в которые подобная возможность была заложена при разработке.Синтаксис команды rundll32 такой:

rundll32 <dllname>,<entrypoint> <optional arguments>

dllname - название библиотеки.
entrypoint - имя процедуры/функции.
optional arguments - параметры.

Вот список некоторых команд, которые можно выполнять с помощью rundll32:

rundll32 shell32,Control_RunDLL hotplug.dll - диалоговое окно "Безопасное извлечение устройства"
rundll32 diskcopy,DiskCopyRunDll - вызов диалога "Копирование диска"
rundll32 mshtml.dll,PrintHTML "HtmlFileNameAndPath" - распечатать документ HTML, где "HtmlFileNameAndPath" - путь к файлу и его имя
rundll32 netplwiz.dll,AddNetPlaceRunDll - вызов мастера подключения нового сетевого ресурса "Добавление в сетевое окружение"
rundll32 shell32,OpenAs_RunDLL filename - вызвать диалог "Открыть с помощью...". filename - имя и путь к файлу.
rundll32 shell32,SHFormatDrive - вызов диалога форматирования диска А:
rundll32 shell32,SHHelpShortcuts_RunDLL AddPrinter - запуск "Мастера установки принтера"
rundll32 shell32,SHHelpShortcuts_RunDLL Connect - запуск мастера подключения сетевого диска
rundll32 shell32,SHHelpShortcuts_RunDLL PrintTestPage - распечатать тестовую страницу
rundll32 shdocvw.dll,DoOrganizeFavDlg - управление закладками в MSIE
rundll32 keymgr.dll, PRShowSaveFromMsginaW - мастер забытых паролей
rundll32 user32,SetCursorPos - переместить курсор мыши вправо вниз :)
rundll32 user32,SwapMouseButton - поменять местами кнопки мыши (работает "в одну сторону" до первой перезагрузки)
runDll32 InetCpl.cpl,ClearMyTracksByProcess 255 - очистка истории MSIE
runDll32 user32,LockWorkStation - смена учётной записи (logoff)
rundll32 AppWiz.Cpl,NewLinkHere filename - запуск мастера создания нового ярлыка, где filename - путь к исходному файлу

Большинство из приведённых здесь команд слишком сложны, чтобы постоянно использовать их. Но можно создать ярлыки для часто используемых команд и назначить им быстрые клавиши...

Чтобы добавить в DLL возможность работы с rundll32, в неё необходимо поместить функцию со следующим прототипом:

void CALLBACK EntryPointW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow);

Вместо EntryPoint нужно подставить имя вашей функции. Теперь эту функцию можно будет вызывать из командной строки с поомщью rundll32, следуя описанным выше правилам. При создании функции EntryPoint необходимо помнить следующее:

  • Функцию, являющуюся точкой входа для программы Rundll32, необходимо определить, используя соглашение о вызовах _stdcall (по умолчанию для атрибута _stdcall используется значение CALLBACK). Если атрибут _stdcall отсутствует, то для функции по умолчанию будет использоваться соглашение о вызовах _cdecl. Это приведет к аварийному завершению работы программы Rundll32 после вызова данной функции.
  • Указывая в параметрах командной строки программ Rundll и Rundll32 экспортированное имя функции, необходимо учитывать, что компилятор Visual C++ экспортирует данную функцию как _EntryPoint@16 (если библиотека DLL написана на языке C) или использует искажение имен (если библиотека DLL написана на языке C++). Это вызвано тем, что функция, используемая в качестве точки входа, создается с применением соглашения о вызовах _stdcall. Чтобы избежать применения искаженных имен, используйте файл DEF и экспортируйте функцию, являющуюся точкой входа, по имени.

Дополнительная информация по команде rundll32.

Следующая запись

Предыдущая запись

Связанные записи

Похожие записи

Комментарии

Еще нет комментариев.

Пингбэки

Оповещения открыты.

Трэкбэки

URL архива

Only authorized users can post comments