38220

Розширення оболонки Windows

Лабораторная работа

Информатика, кибернетика и программирование

В даній роботі розглядаються засоби для розширення стандартних можливостей ОС Windows. Для виконання даної роботи потрібно чітке розуміння основ об’єктно-орієнтованого програмування (ООП)

Украинкский

2014-11-30

59 KB

4 чел.

Лабораторна робота №4

Тема: Розширення оболонки Windows

Теоретична частина

В даній роботі розглядаються засоби для розширення стандартних можливостей ОС Windows. Для виконання даної роботи потрібно чітке розуміння основ об’єктно-орієнтованого програмування (ООП). Що таке клас та об’єкт класу, я думаю розповідати вам не потрібно. В роботі будуть використане поняття інтерфейсу. В даному контексті, інтерфейс – це певна сутність ООП, яка описує тільки назви методів класу. Реалізація цих методів покладається виключно на об’єкт нащадок інтерфейсу. Тобто можна сказати, що інтерфейс – це певний абстрактний клас в якому тільки оголошуються методи (процедури та функції). Для чого це потрібно ??? Для розширення оболонки ОС ваша програма повинна буде реалізовувати інтерфейси, через які система буде взаємодіяти з вашим кодом. Тобто, вам потрібно буде описати певний клас, який буде  унаслідуватись від інтерфейсу і в якому будуть реалізовуватись методи, що оголошені в ньому.

Реалізація перехоплення процесу копіювання.

Ще деякий нюанс. Для розширення оболонки ваш клас повинен не тільки унаслідуватись від інтерфейсу, а ще від базового класу, що реалізує основні методи реалізації технології COM. Я не буду описувати, що це за технологія, так як це дуже громіздка тема. Скажу лише одне – дана технологія дозволяє взаємодіяти між об’єктами, що вже є відкомпільованими шляхом реалізації певних інтерфейсів.

 Багато рутинної роботи можна покласти на саме середовище Delphi. Перед початком потрібно створити ActiveX бібліотеку (ActiveX – це технологія, що базується на технології СОМ. Дозволяє використовувати відкомпільовані об’єкти в інших програмах.). Для цього треба зайти File/New і у вкладці ActiveX натиснути на ActiveX Library. Буде створена бібліотека, яка в принципі мало чим відрізняється від звичайної DLL (по своїй суті це і є динамічна бібліотека, в якій буде описані СОМ-об’єкти). Зберігаєм гарненько цю бібліотеку з нормальним ім’ям. Далі створюємо СОМ-об’єкт, який буде реалізовувати методи певних інтерфейсів. Так само заходимо File/New і у вкладці ActiveX потрібно вибрати COM Object. Наприклад CopyHook. З радістю на обличчі тиснемо «ОК».

Система щось там вам наплодила до дідька… Все це допоміжні файли, для реалізації роботи. Нас цікавить файл з назвою Unit1.pas. Вибираємо його і звісно перейменовуємо на нормальну зрозумілу  назву. В цьому фалі описаний клас, який ви вказали при створенні об’єкта. З ним ми і працюємо. Цей клас має унаслідувати інтерфейс ICopyHook, що описаний в бібліотеці ShlObj(я думаю зрозуміли, що цей модуль потрібно додати до розділу uses). Даний інтерфейс оголошений наступним чином:

 ICopyHookA = interface(IUnknown)

   

   function CopyCallback(Wnd: HWND; wFunc, wFlags: UINT; pszSrcFile: PAnsiChar;

     dwSrcAttribs: DWORD; pszDestFile: PAnsiChar; dwDestAttribs: DWORD): UINT; stdcall;

 end;

В даному випадку interfaceце ключове слово, яке вказує, що дана сутність таки є інтерфейсом (типу як слово class при оголошенні класу). Як видно даний інтерфейс має тільки один метод   CopyCallback, який ви і повинні реалізувати у своєму класі.

Отже додаємо даний інтерфейс до класів від яких унаслідується наш СОМ-об’єкт. Іншими словами потрібно назву цього інтерфейсу додати в дужках, які йдуть після службового слова class. Слід зауважити, що мова Object Pascal не підтримує множинне наслідування, але це обмеження не стосується інтерфейсів. Клас може унаслідувати їх скільки завгодно, але клас – тільки один. В нашому прикладі вийшло

 TTCopyHook = class(TTypedComObject, ITCopyHook, ICopyHook)

 protected

   {Тут оголошуються методи та властивості класу}

 end;   

В даному класі ми і повинні реалізувати функцію CopyCallback, яка буде викликаєтись ОС кожного разу, якщо відбуваються певні маніпуляції з папками (даний інтерфейс забезпечує роботу тільки з папками).

Отже оголошуємо метод класу, що відповідає прототипу функції CopyCallback з інтерфейсу.      

 TTCopyHook = class(TTypedComObject, ITCopyHook, ICopyHook)

 protected

       function CopyCallback(Wnd: HWND; wFunc, wFlags: UINT; pszSrcFile: PAnsiChar;

     dwSrcAttribs: DWORD; pszDestFile: PAnsiChar; dwDestAttribs: DWORD): UINT; stdcall;

 end;   

 А в розділі implementation реалізуємо дану функцію (реалізація функції означає додати туди якийсь код, тоді як оголошення функції -  це просто запис назви функції та її формальних параметрів).

function TTCopyHook.CopyCallback(Wnd: HWND; wFunc, wFlags: UINT;

 pszSrcFile: PAnsiChar; dwSrcAttribs: DWORD; pszDestFile: PAnsiChar;

 dwDestAttribs: DWORD): UINT;

begin

end;

При реалізації потрібно знати, що визначають формальні параметри даної функції.

 Wndдескриптор вікна, в якому відбувається подія

 wFuncвказує на дію, яка відбувається над папкою. Може приймати наступні значення : FO_COPY – відбувається копіювання файлу, що заданий параметром pszSrcFile в файл, що заданий pszDestFile; FO_DELETE – відбувається видалення файлу, що описаний в параметрі pszSrcFile; FO_MOVE – відбувається переміщення файлу; FO_RENAME – переіменування.

 wFlags – додаткові флаги операції. Їх значення дивись в описі функцій системи.

Призначення решти параметрів я думаю для вас зрозуміле. Функція може повертати два значення IDOKпідтвердження операції, IDNOвідміна.

Отже підсумок. Ви оголосили функції і її реалізували. При будь якій операції з папками буде викликатись саме ваша функція і ви зможете керувати процесом роботи. І це одне застереження – під’єднайте бібліотеку ShellAPI, для коректної роботи з параметрами.

Після реалізації методу -  компілюйте проект. На виході у вас бібліотека динамічного підключення, в якій міститься ваш СОМ-об’єкт. Тепер потрібно зареєструвати його в системі.

 Реєстрація бібліотеки в системі є досить складною задачею. Середовище Delphi бере на себе велику частину цієї роботи, але все ж таки певні дій нам потрібно описати самим.

В модулі, де описаний вам СОМ-об’єкт в розділі initialization ви побачете щось подібне наступному:

 TTypedComObjectFactory.Create(ComServer, TTCopyHook, Class_TCopyHook,

   ciMultiInstance, tmApartment)

 

Що це таке ??? Цікаве запитання… Це оголошений клас, що називається фабрикою класів. Його завдання – це створення СОМ-об’єкта при роботі в системі і він викликається автоматично, якщо тільки буде викликана ваша динамічна бібліотека. І все б нічого, але є одне але – при роботі з перехопленням потрібно деяким чином змінити системний реєстр ОС Windows (реєстр – це деревовидна база даних, в якій зберігаються ключові настройки системи, дані про неї та інша додаткова інформація). Отже нам потрібно зробити так, щоб при реєстрації нашої бібліотеки відбувались автоматично зміни в реєстрі. Я повністю наведу приклад як це робити і по можливості спробую описати всі дії. Якщо вас цікавить більш ширше висвітлення цієї теми – звертайтесь до викладача. А поки що спочатку – заремарюйте цей рядок…

Для автоматизації процесу реєстрації потрібно  перезавантажити деякі методи фабрики класів. Отже в інтерфейсній частині оголошуємо наш клас, що буде нащадком класу фабрики

TCopyHookFactory=class(TComObjectFactory)

protected

     procedure ApproveShellEx(Register:boolean; CLsid:string);

public

  procedure UpdateRegistry(Register:boolean); override;

end;

Як видно з прикладу, перезавантажено один метод – це UpdateRegistry. Ця функція викликається тоді, коли фабрика класу записує дані в реєстр. Нам потрібно додати до неї деяку функціональність. Процедура ApproveShellEx призначена для ще однієї зміни в реєстрі, а саме в гілці:

 HKEY_LOCAL_MASHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved)      

 Дана процедура буде викликатись з функції UpdateRegistry. Це одне доповнення –кожен СОМ-об’єкт ідентифікується власним глобальним ідентифікатором. Глобальний означає, те що гарантується повна унікальність даного ключа в глобальному масштабі, тобто той код, що згенерувався на вашій машині гарантовано на іншим машинах світу згенерований не буде. Цей код за вас також генерує середовище Delphi. Цей ідентифікатор має назву GUID і ось його приклад:

        {8762883B-9019-4B71-9746-5C9911E8BB16}

 

 Це 16-байтне число, яке представляють у HEX-форматі. GUID вашого СОМ-об’єкта зберігається у змінній CLASS_назва_вашого_об’єкта і описана ця змінна в модулю, що <НазваБібліотеки>_TLB.PAS.

Отже тепер в розділі implementation описуємо реалізацію наших методів. Так як у мене клас-фабрики називався TCopyHookFactory то і їх реалізація буде наступною:

procedure TCopyHookFactory.ApproveShellEx(Register: boolean; CLsid: string);

const

 SApproveKey='SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved';

        //Шлях до вітки реєстру, в яку буде вводитись зміни

var

  Reg:TRegistry;// Об’єкт для роботи з реєстром

begin

 Reg:=TRegistry.Create;// Створення об’єкта для роботи з реєстром

 Reg.RootKey:=HKEY_LOCAL_MACHINE;// Виставляємо йому корінь реєстра

 if not Reg.OpenKey(SApproveKey,true)  then exit; // Перехід на відповідну гілку

 if Register then  Reg.WriteString(CLsID,Description) // Запис у реєстр

              else Reg.DeleteValue(CLsID);// Якщо відбувається знищення СОМ-об’єкта, знищується і запис

end;

 

procedure TCopyHookFactory.UpdateRegistry(Register: boolean);

var

ClsID:string;

begin

  ClsID:=GUIDToString(ClassID); // Перетворення Ідентифікатора в рядок

 inherited UpdateRegistry(Register);// Виклик метода з предка

 ApproveShellEx(Register,ClsID); // Виклик вищеописаної процедури  

 if Register then // Якщо об’єкт реєструється,то додаємо запис в реєстр

    CreateRegKey('Directory\shellex\CopyHookHandlers\'+ClassName,'',ClsID)

   Else // в противному випадку – знищуємо запис

     DeleteRegKey('Directory\shellex\CopyHookHandlers\'+ClassName);

end;

Функція UpdateRegistry також додає запис в гілку реєстра HKEY_CLASSES_ROOT/Directiry/Shellex/CopyHookHandlers. Реалізація цих функцій є повноцінною в даному описі, тобто можете його сміливо брати. Тільки уважно бути, якщо у вас фабрика називається іншим ім’ям, тоді я думаю ви розумієте, де треба внести зміни.

Ну що ж, тепер треба тільки заставити системи, щоб при реєстрації нашого СОМ-об’єкта використовувалась наша фабрика класів. Для цього в розділі initialize замість згенерованої команди прописати свою власну типу:

TCopyHookFactor.Create(ComServer,<НАЗВА КЛАСУ, В ЯКОМУ ОПИСУВАВСЯ ОБ’ЄКТ>,<GUID об’єкта>,<НАЗВА_ОБ’ЄКТА_В_СИСТЕМІ>,<ОПИС>, ciMultiInstance, tmApartment).

<НАЗВА КЛАСУ, В ЯКОМУ ОПИСУВАВСЯ ОБ’ЄКТ> - назва Delphi-ого класу в якому ви описували процедуру перехоплення

 <GUID об’єкта> - можете взяти прямо з *_TLB.PAS, а можете вказати змінну (CLASS_назва_об’єкта).

 <НАЗВА_ОБ’ЄКТА_В_СИСТЕМІ> - строкова змінна, що визначає назву об’єкта в ОС вцілому. Не допускаються пробіли.

 <ОПИС> - строкова змінна. Опис об’єкта.

Всі решта параметрів такі і залишаються, що і у прикладі.

Компілюєте проект. На виході DLL бібліотека. Ця бібліотека має чотири експортні функції(їх прототип - function:HResult;stdcall), з яких нас цікавлять дві:

 DLLRegisterServer – реєстрація об’єктів, що в бібліотеці в системі

 DLLUnRegisterServerвідміна реєстрації.

Можна написати окрему програму, що буде викликати ці функції для реєстрації. Після реєстрації потрібно перезавантажити систему. Звичайно після того як ви продемонструєте викладачу вашу роботу – ви повинні відмінити реєстрацію.

Завдання на 4 бали: Створити СОМ-об’єкт, що буде відслідковувати всі операції копіювання і записувати в окремий файл, що коли і куди було скопійовано.

Завдання на 5 балів: Створити СОМ-об’єкт, що буде відслідковувати всі операції над папками  і записувати в окремий файл, що, коли відбувалося та з якою папкою, а також час події.

Завдання на 6 балів: Те саме, що і попередня задача, але при натиску на кнопку F7виникає вікно в якому має виводитись увесь файл, в якому записувались дані.

P.S. Так лабораторна складна, але і ви вчитесь на програмістів, а не на простих спеціалістів по набору тексту в MS WORD. Так що зберіться і вперед

БАЖАЄМО УСПІХУ.


 

А также другие работы, которые могут Вас заинтересовать

26028. Понятие и значение государственной гражданской службы 50 KB
  Понятие и значение государственной гражданской службы. Федеральный закон О системе государственной службы Российской Федерации определяет государственную службу как профессиональную служебную деятельность граждан РФ по обеспечению исполнения полномочий: Российской Федерации и ее субъектов; федеральных органов государственной власти иных федеральных государственных органов федеральных государственных органов и органов государственной власти субъектов РФ иных государственных органов субъектов РФ государственных органов субъектов РФ;...
26029. Поступления на государственную гражданскую службу 45.5 KB
  21 Одним из принципов государственной гражданской службы является равный доступ граждан владеющих государственным языком Российской Федерации к гражданской службе и равные условия ее прохождения независимо от пола расы национальности происхождения имущественного и должностного положения места жительства отношения к религии убеждений принадлежности к общественным объединениям а также от других обстоятельств не связанных с профессиональными и деловыми качествами гражданского служащего. На гражданскую службу вправе поступать граждане...
26030. Должности государственной гражданской службы, их группы и категории 60 KB
  Должности государственной гражданской службы их группы и категории. Должности федеральной государственной гражданской службы учреждаются федеральным законом или указом Президента Российской Федерации в целях обеспечения исполнения полномочий государственного органа либо лица замещающего государственную должность. статьи 89 должности государственной гражданской службы подразделяются на четыре категории и пять групп. Должности государственной гражданской службы подразделяются на следующие группы: высшие должности; главные должности; ведущие...
26031. Служебный контракт на государственной гражданской службе: понятие, содержание и значение 66 KB
  Согласно статьи 23 Служебный контракт соглашение между представителем нанимателя и гражданином поступающим на гражданскую службу или гражданским служащим о прохождении гражданской службы и замещении должности гражданской службы. Представитель нанимателя обязуется предоставить гражданину поступающему на гражданскую службу возможность прохождения гражданской службы а также предоставить указанному гражданину или гражданскому служащему возможность замещения определенной должности гражданской службы обеспечить им прохождение гражданской...
26032. Должностной регламент государственного гражданского служащего 51 KB
  В должностной регламент включаются: 1 квалификационные требования к уровню и характеру знаний и навыков предъявляемые к гражданскому служащему замещающему соответствующую должность гражданской службы а также к образованию стажу гражданской службы государственной службы иных видов или стажу опыту работы по специальности; 2 должностные обязанности права и ответственность гражданского служащего за неисполнение ненадлежащее исполнение должностных обязанностей в соответствии с административным регламентом государственного органа...
26033. Права и обязанности гражданского служащего 55 KB
  № 79ФЗ О государственной гражданской службе Российской Федерации иными нормативными правовыми актами РФ и условиями служебного контракта; получение в установленном порядке информации и материалов необходимых для исполнения должностных обязанностей а также на внесение предложений о совершенствовании деятельности государственного органа; доступ в установленном порядке к сведениям составляющим государственную тайну необходимым для исполнения должностных обязанностей; доступ в установленном порядке в связи с исполнением должностных...
26034. Запреты и ограничения, связанные с государственной гражданской службой. Общие принципы служебного поведения государственных служащих 72.5 KB
  2004 № 79ФЗ О государственной гражданской службе Российской Федерации. Порядок прохождения диспансеризации перечень таких заболеваний и форма заключения медицинского учреждения устанавливаются уполномоченным Правительством Российской Федерации федеральным органом исполнительной власти; 5 близкого родства или свойства родители супруги дети братья сестры а также братья сестры родители и дети супругов с гражданским служащим если замещение должности гражданской службы связано с непосредственной подчиненностью ...
26035. Понятие и признаки государственной службы 46.5 KB
  Противодействие коррупции на государственной и муниципальной службе.2008 О противодействии коррупции под коррупцией понимается злоупотребление служебным положением дача взятки получение взятки злоупотребление полномочиями коммерческий подкуп либо иное незаконное использование физическим лицом своего должностного положения вопреки законным интересам общества и государства в целях получения выгоды в виде денег ценностей иного имущества или услуг имущественного характера иных имущественных прав для себя или для третьих лиц либо...
26036. Виды государственной службы 62.5 KB
  Военная служба и правоохранительная служба являются видами федеральной государственной службы. Путем внесения изменений и дополнений в Федеральный закон О системе государственной службы Российской Федерации могут быть установлены и другие виды федеральной государственной службы. правовое регулирование и организация федеральной государственной службы находятся в ведении Российской Федерации п.