Уроки Iczelion'а

       

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


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

  • _SHELL_CallDll
  • _SHELL_FreeLibrary
  • _SHELL_GetProcAddress
  • _SHELL_LoadLibrary
  • _SHELL_LocalAllocEx
  • _SHELL_LocalFree

Эти шесть сервисов позволяют 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.

  • shex_dwTotalSize - размер в байтах структуры SHEXPACKET плюс дополнительные параметр, rgchBaggage, который немедленно следует за этой структурой. Я коротко объясню, что такое rgchBaggage.
  • shex_dwSize - размер в байтах структуры SHEXPACKET, не считая rgchBaggage. Вместе с shex_dwTotalSize может вычислить pазмеp rgchBaggage.
  • shex_ibOр - операция, которая должна быть выполнена. Если вы укажите 0, это будет означать, что вы хотите открыть файла. Если файл является исполняемым, то это запустит его. Если вам нужно выполнить другую операцию, вы должны указать имя операции где-то в rgchBaggage и это поле должно содержать дистанцию в байтах от начала этой структуры SHEXPACKET до первого символа строки формата ASCIIZ, которая задает имя операции, которую вы хотите выполнить. Размер SHEXPACKET - 32 байта. Если строка с именем операции следует сразу за структурой SHEXPACKET, то значение shex_ibOр должно быть равным 32. Определены три операции, которые можно выполнить - "open", "print" и "explore".
  • shex_ibFile - относительная дистанция от начала этой структуры до ASCIIZ-строки, задающей имя файла, которое вы хотите послать ShellExecute (принцип тот же самый, что и в случае с shex_ibOр).
  • shex_ibParams - опциональные параметры, которые вы хотите передать файлу, указанному в shex_ibFile. Если файл - это документ или вы не хотите передавать какие-либо параметры , задайте 0. Если вы хотите передать какие-то параметры, поместите строки где-нибудь за структурой и поместите относительную дистанцию от начала структуры до этой строки в этом поле.
  • shex_ibDir - рабочая директория. Укажите 0, если вы хотите использовать Windows-директорию или вы можете указать строку с желаемой директорией где-нибудь после уже упоминавшейся структуры и поместить относительный адрес от начала структуры на эту строку в данной поле.
  • shex_nCmdShow - как должно показываться окно. Это одно из значений, которое вы обычно передает ShowWindow, например SW_XXXX-значение. Посмотрите эти значения в window.inc.


Все параметры размера 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.


Содержание раздела