Мониторинг обменных курсов валют
18c0693f

Сервисы оболочки времени приложения


Когда наступает время приложения, есть несколько сервисов Shell'а, которые вы можете вызвать:

Эти шесть сервисов позволяют VxD вызывать 16-битные функции в 16-битных DLL/EXE, таких как WinHelp. Тем не менее, так как мы двигаемся к 32-битному миру (и 64-битному в будущем), я не буду вдаваться в детали относительно данной темы. Если вам интересно, вы можете прочитать о них в Windows 95/98 DDK.

Есть также другие сервисы SHELL'а, доступные только во время "aрy time" события, которые я нахожу более полезными: _SHELL_ShellExecute и _SHELL_BroadcastSystemMessage. С помощью _SHELL_BroadcastSystemMessage вы можете послать сообщение всем окнам верхнего уровня и всем VxD за один вызов! Если время приложения доступно, вы можете посылать сообщения и окнам и VxD. Если время приложения недоступно, вы можете посылать сообщения только VxD.

_SHELL_ShellExecute - это rin0-расширение функции ShellExecute режима ring-3. Фактически, этот сервис вызывает ShellExecute. С помощью этого Shell-сервиса, вы можете запускать/открывать/печатать любой файл. У _SHELL_ShellExecute следующее определение:

VxDCall _SHELL_ShellExecute,

Она получает только один параметр, плоский адрес структуры SHEXPACKET. Она возвращает значение из ShellExecute в eax. Давайте детально проанализируем структуру SHEXPACKET.


Все параметры размера DWORD. Теперь несколько слов относительно того самого параметра rgchBaggage, о котором я обещал рассказать. Это не так просто. rgchBaggage - это параметр структуры SHEXPACKET, но он не может быть включен в определение структуры, поскольку его размер непостоянен. Проверьте shell.inc, вы увидите, что rgchBaggage не определен в SHEXPACKET, хотя документация Windows 9x DDK утверждает, что это член данной структуры.

Что такое rgchBaggage? Это просто массив ASCIIZ-структуры, которая следует за структурой SHEXPACKET. Внутри этого массива вы можете поместить имя операции, которую вам нужно выполнить над файлом, имя файла и имя рабочей директории. SHELL VxD получает смещение строки в rgchBaggage, добавляя относительный адрес строки к адресу структуры. Hапример, если SHEXPACKET начинается в 60000h, а строка следует прямо за ней, тогда дистанция между структурой и строкой - это размер самой структуры, 32 байта (20h). Shell VxD будет знать, что строка находится по адресу 60020h.





Самый выгодный курс обмена валюты