ПредишенСледващото

Куки - аспекти на изпълнението.

Просто искам да направя няколко възражения: той ще отиде в бъдеще само на 32-битов Windows и върху глобалните капани, защото а именно, когато има мнозинство от програмни грешки; Всички примери ще бъдат дадени на Делфи, защото примери и описания за любители на C ++ достатъчно.

Освен разказ предполага, че читателят е запознат с основните принципи на работа с DLL и поне в общи линии, е механизмът на тяхното писане.

Какво се случва в системата, когато ние "сложи" капан и че тя е всичко за - капан.

Капани (кука) - механизъм за Windows, открадна събития, предназначени за дадено приложение, преди тези събития, за да се постигне тази кандидатура.

Функционални филтри - в зависимост от получаването на събитие от капаните за уведомяване събитие.

В зависимост от вида на капан филтър функция може да промени събитията, да ги отмени или просто реагира на тях. По този начин, когато казваме "поставят клопка", имаме предвид процеса на поставяне на функцията за филтриране на избраните капаните тип контакт. Така че, когато ние сме в програмата използвайте функцията SetWindowsHookEx, ние отдаваме функция филтър, указател към които ние и да премине втори параметър, например:
SetWindowsHookEx (WH_SHELL, @ShellHook HInstance, 0.); в този случай ShellHook - това е функция на филтъра. В бъдеще, под фразата "поставят клопка", имаме предвид закрепването на филтър функция, за да капан.

Какво се случва, след като успяхме да изградим една глобална капан. Разбирането на следния параграф е от ключово значение за разбирането на Windows капани на механизма, които се намират в DLL. Ако не го осъзнават, върнете се и прочетете отново отново и така нататък, докато, докато всичко става ясно.

Това съобщение би достигнала н-1 Trap (кука п-1) трябва да се грижи за програмист. Тук на този етап много често възникват грешки.

За да се обадите на следващия капан във веригата на капани, използвани в Windows функция CallNextHookEx, първият параметър е манипулатор към текущия капана, получи функция SetWindowsHookEx. Сега, обърнете внимание: сме си поставили капан в process1, т.е. SetWindowsHookEx функция, осъществявана в DLL, който се намира в AP process1 (вж. Фигура 1) и, съответно, на дръжката, върнат от инсталираната капан SetWindowsHookEx принадлежи DLL данни, разположени в AP process1. Нека Process2 случи събитие, към който набор капан след Dll от първия процес, проектирана върху AP Process2, DLL данни Process2 на инициализира наново и се оказва, че Process2 променлива, в която "лежи" ЕВРОВОК поставят капани process1, ще бъде равна на 0. филтър функция Process2, изпълнена, ще трябва да изпратите съобщение по веригата на капани, т.е. CallNextHookEx извършване на определена функция, първият параметър, който трябва да бъде настоящите капаните ЕВРОВОК, но не и в този DLL ЕВРОВОК данни, намиращи се в Process2 (променлива, която трябва да съдържа включва нула). "Как да бъде в такъв случай. Откъде знаем справи с капан, поставен в друг процес, ако самите процеси не знаят нищо един за друг?" - Вие питате. На този въпрос ще отговоря по-късно, но за сега, нека разгледаме видовете повърхностни капани, въпреки че информация за видовете напълно определен в SDK.

Както вече знаете, капанът се задава с помощта на функцията за Win32 API SetWindowsHookEx ():

функция SetWindowsHookEx (idHook: число; lpfn: TFNHookProc; hmod: HINST; dwThreadID: DWORD): HHOOK; stdcall;
idHook. Той описва вида на капани. Този параметър може да приема една от следните стойности:

прилагане Филтър обвивка. Trap функция филтър се нарича, когато създава и унищожава прозорец най-високо ниво, или когато се изисква обвивката на приложение, за да стане активен.

Смисълът на всеки параметър на филтър функция капани варира в зависимост от типа на инсталираната капана. За по-подробно обяснение вижте стойности на параметри на помощ за Win32 API.

hmod. Този параметър трябва да има стойност hInstance ЕХЕ или DLL-файл, който съдържа функция улавящ филтър (припомни, че това е функция обаждане). Ако ние говорим за глобална кука, този параметър може да отнеме само дръжката на DLL, от която се помещава в капана. Причината е очевидна - EXE файл не може да бъде показана на ДР на друг процес, а с DLL фаловете са специално създадени за тази цел. Подчертавам този факт отново: глобални капани могат да се поставят само в DLL, но не и във файла EXE.

dwThreadID. Този параметър идентифицира поток се свързва с капан. Ние говорим за глобална кука, така че тази опция винаги ще бъде равна на 0, което означава, че капанът е свързано с всички теми, в системата.

Връщане стойност: функцията SetWindowsHookEx връща манипулатор за задаване на капана, тя е на дръжката и ние ще трябва да се направи достъпна за всички случаи на показаната DLL. Как мога да ви кажа, след кратък пример, показващ на практика необходимостта от поддържане на дескриптора капан за който ще бъде в състояние да си спомни предишната капана във веригата.

Забележка. когато два различни вида капани, системата ще създаде две капани верига. Т.е. всеки вид има своя собствена верига от капани. По този начин, когато инсталирате тип капан и WH_MOUSE WH_KEYBOARD двете капани ще бъдат в различни вериги и, съответно, ще се обработват самостоятелно.

За да отстраните определена функция от филтъра за опашката, трябва да се обадите функция UnhookWindowsHookEx. Тази функция може да отнеме един получен дръжка капани функция SetWindowsHookEx. Ако отстраняване не е възможно, тогава функцията връща нула, в противен случай, различен от нула стойност. В това, което следва, изразът "премахнете капан" означава отстраняване филтър функция.

Сега, че знаете как да се създаде капана и как да го премахнете, помислете два примера, който ще даде ясна представа за изолацията на AP процеси и точка за един от най-често срещаните грешки.

Сега мисля, да се разбере източник библиотеките с код от първия пример, ти осъзнаваш, как не трябва да напише DLL, от които можете инсталирате глобален кука. Представете си, че ако потребителят използва програмата си, която включва глобална кука, тече друга програма, която също се установи един и същ вид капан, че ваш, но го инсталирате на опашката, в този случай, ако последният, на втората програма ще бъде написан погрешно - програмата ви вече няма да работи, защото на вашия капан ще бъде изпратено послание от предна камера. Това е един пример за това как с ниско качество на работа на един програмист може да развали отлично свършената работа и двете.

Сега няколко думи за инсталирането на софтуера по-горе.

Конструира подават дисплей. Тази функция връща указател (дръжка), за да дисплея на обект файл.

Тази функция затваря картографирани в паметта файл и да освободи дръжката му. При успешно функция затваряне връща ненулева стойност, и 0 в противен случай.

За повече информация относно параметрите на горните функции, се отнасят до SDK, и както ще бъде разгледано в примера, които ще бъдат обсъдени по-долу.

Забележка. CreateFileMapping функция първия параметър () трябва да бъде предадена на файлов дескриптор, който ние ще се покаже. защото ние ще се покаже на данните в суап файл, той трябва да премине FFFFFFFF на стойност $ или DWORD (-1), което съответства на една и съща стойност; но тъй като идва ерата на 64-битови системи, е необходимо да се използва INVALID_HANDLE_VALUE на стойност, която ще бъде в системата на 64-битова версия е равно на $ ffffffffffffffff съответно. За тези, които са преминали от по-ранните версии на Delphi по-късно (например с Delphi2 на Delphi4) те може да са изправени пред този вид проблеми в техните програми.
И как ще се създаде име обект за показване на файлове, функцията на последния параметър CreateFileMapping () ще даде на обекта име, което по-късно ще бъдат използвани за други препратки процеси по отношение на едно и също място на паметта. Трябва да се отбележи, че така получената обект трябва да има фиксиран размер, т.е. тя не може да промени хода на програмата.

Сега, ние притежаваме всички необходими познания за разглеждането на втория пример. Пример 2. Отворете папката и следвайте същите стъпки, както в първия пример, след като внимателно сортиране на изходния код. След като изпълните двете приложения и да зададете два от тях-филтър функция на един и същ вид, опитайте се да щракнете с десния бутон върху някой от прозорците и ще видите, че сега изпълнява и двете се поставят капани, без значение коя от прозорците имаше едно кликване на мишката (т.е., въпреки че някои от DLL инстанция повикване чрез CallNextHookEx () функция). По този начин, когато всяко приложение ще покаже своята AP DLL, която е функция на филтър, DLL този случай ще има достъп до данните се преобразува в паметта от process1 или Process2, в зависимост от DLL. Мисля, че след като подробно обяснение на всички трябва да е ясно.

Юрий Zotov благодаря за подкрепата им.

Архив с примери за статията: example.zip

Литература:

  1. Microsoft Win32 Набор за софтуерна разработка.
  2. Стив Тейшейра и Ксавие Пачеко, "Ръководство Delphi5 програмиста том 1:... Основни методи и техники"
  3. Кайл Марш ", куки в Win32" (в оригинал).
  4. Д-р Joseph М. Newcomer "куки и DLL-" (в оригинала).

Москва енергетика институт (ТУ)
Факултет на ядрените централи
27/2/02

Подкрепете проекта - споделете линка, благодаря!