Расширь контекст Алексей Соколов aka Aggressor Хакер, номер #089, стр. 089-112-2 * Menu — дескриптор системного меню. * IndexMenu — номер строки меню, в которую следует вставить пункт. * IdCmdFirst,IdCmdLast — диапазон допустимых значений для идентификаторов вставляемых пунктов меню. * uFlags — набор флагов. Далее идет вызов метода TContextMenu.GetCommandString(idCmd, uType: UINT; pwReserved: PUINT; pszName: LPSTR; cchMax: UINT): HRESULT – этот метод предназначен для получения подсказки для конкретной команды меню. Параметры: * idCmd – идентификатор пункта меню, соответствует IdCmdFirst. * uType - запрашивает тип информации: GCS_VERB или GCS_HELPTEXT. * pwReserved – забронирован. * pszName – определяет буфер-строку. * cchMax – определяет размер буфера. Когда происходит нажатие нашего пункта, то вызывается ContextMenu.InvokeCommand, в котором мы опишем, что должно происходить. Параметром этого метода является лишь запись типа TCMInvokeCommandInfo. Вот поля записи: * cbSize – определяет размер структуры (sizeof (TCMInvokeCommandInfo)) * hwnd – определяет окно, которое будет владельцем всех окон. * fMask – определяет, заданы или нет параметры dwHotkey/hicon. * lpVerb – определяет вызываемую команду. * lpParameters – параметры (опция). * lpDirectory – рабочая папка (опция). * nShow – флаг передаваемый ShowWindow (SW_*). * dwHotKey – горячая клавиша, ассоциированная с приложением после вызова (опция). * hIcon – определяет иконку (опция). * hMonitor – определяет монитор по умолчанию (опция). Мы рассмотрели все методы двух интерфейсов, необходимых нам непосредственно для создания COM-объекта, но чтобы он заработал, нам нужно его еще зарегистрировать. Для этого нужно создать такие значения в реестре: 1. HKEY_CLASSES_ROOT\CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}- регистрирует наш COM-сервер. 2. HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\ContMenu\CLSID, вместо CLSID – наш номер. Эта запись указывает на то, какие типы файлов будет вызывать наш обработчик (в данном случае * - для любого файла). 3. HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved – это значение разрешает использовать нашу DLL и погружает ее в ОЗУ сразу же после первого вызова. [шифруем] Я не стал заморачиваться с изучением сложных криптоалгоритмов и решил, что отпимальнее всего будет просто заксорить файл. Алгоритм шифрующей процедуры в этом случае нарисовался такой: открываем файл, считываем один байт, ксорим его и записываем на то же место. В итоге мы получим файл той же длины, с тем же названием, но байты в нем будут совсем другими. Чтобы получить исходный файл, нам нужно просто проксорить его по новой. Да, кстати, так как мы будем все это делать для нетипизированных файлов, то для записи/чтения нужно использовать процедуры BlockRead и BlockWrite. Они объявляются так: |