Основни модули в windows



Дата10.05.2017
Размер325.81 Kb.
#21034

ОСНОВНИ МОДУЛИ В WINDOWS





APIинтерфейс за приложни програми

WIN 3x

KERNEL32.DLL

KRNL386.EXE

USER32.DLL

USER.EXE

GDI32.DLL

GDI.EXE

В USER има средства на потребителския интерфейс.



Манипулатори (Handle) – указатели към елемент, които имат 32 битов линеен адрес.


KERNEL

HANDLE

USER

HWND

GDI

HPEN

HFILE

HBRUSH

HGLOBAL

HMENU

HBITMAP

HLOCAL

HDC


COMCTL32.DLL – пример: treeview, listview, tabcontrol

COMDLG32.DLL

ADVAPI32.DLL – пример: NT: Services

Security


SHELL32.DLL – средства за работа с “черупката” на Windows (Explorer, Desktop с Toolbar)
ShellExecute – функция за автоматично стартиране


ТИП

WIN32

WIN16, DOS

char

8

8

int

32

16

short

16

16

long

32

32



БИБЛИОТЕКИ С ДИНАМИЧНО СВЪРЗВАНЕ



1. Създаване

Примерна програма:

#include “mylib”

MyFunc (…);

---------------------------

в LINK


MYLIB.LIB
2. Работа с DLL
Пример:

  • Имаме UTILS.DLL

  • Знаем, че експортира функция F с два int параметъра, връщащи int

int (ftype) (int, int);

HMDDMLE.DLL = LoadLibrary (“UTOLS.DLL”);

ftype F = GetProcAddress (hDLL, “F”);

int x = F1 (3, 5);

……………


FreeLibrary (hDLL);

……………
Ако не е указан DLL, то такъв се търси в:

1) директорията на програмата;

2) текущата директория;

3) ;

4) ;

5) директория, указана в пътя.

ОСНОВЕН .h ЗА WINDOWS
#include

#include


Недокументирани функции

 функции, включени в .LIB, .DLL, но не са включени в


Пример:
BOOL SetSystemPowerState (BOOL suspend, BOOL force);

// смисълът на force е, дали принудително да се влезе в suspend или чрез възможност от

// потребителя

…………


SetSystemPowerState (TRUE, TRUE);
// SetSystemPowerState ()е записана в KERNEL32.DLL
ACPIHibernateизискват се настройки от BIOS
 функции, невключени в .LIB, но ги има в .DLL
Пример: DWORD RegisterServiceProcess (HANDLE, BOOL);
В Windows 9.х за скриване в TaskList. Регистрира въпросния процес като service, т.е. за всеки потребител. HANDLE е манипулатор на процес, който ще става service процес. Може да се използва NULL – текущия процес става service.

BOLLTRUE или FALSE – за показване или скриване при натискане на Ctrl + Alt + Del.
typedef DWORD (WINAPI *LSP) (HANDLE, BOOL);

RSP RegisterServiceProcess = NULL; // желателна инициализация


HMODULE LDLL = LoadLibrary (“KERNEL32.DLL”); // независимо, че винаги е зареден, ни е необходим адресен достъп до KERNEL32.DLL
RegisterServiceProcess = (RSP) GetProcAddress (LDCC, “RegisterServiceProcess”);

if (RegisterServiceProcess != NULL) RegisterServiceProcess (NULL, TRUE);


Този начин на използване на функциите е препоръчителен, когато искаме да правим програми и за Windows 98 и да стават и за Windows 95 (т.е. става и за нови и по –стари версии на ОС). Ако функция би била писана по предходния начин, то е възможно Windows 95 да не допусне изпълнението на програмата, която пишем.
3. Експортиране на функции
а) за Visual C чрез параметри от командния ред към

LINK - / export: <име>

CL.EXE (за компилатор)

LINK.EXE

// работят в DOS прозорец в конзолен режим
б) чрез дефиниционен файл (.DEF)

EXPORTS


F0

F1

// имена на функции, използвани в проекта


в) чрез специфично Microsoft разширение на езика

­­__declspec

int ­__declspec (dllexport) F0 (int, int); // функцията F0 ще бъде експортирана в .DLL-a
за компилатора: ?F0@@YAHH@Z
г) extern “c” int __declspec (dllexport)

Да се използват конвекции на съответния език – в случая С). В С няма overload на функциите



ОПТИМИЗАЦИЯ НА РАБОТНАТА СРЕДА. КОНФИГУРАЦИОННИ ФАЙЛОВЕ



1. CONFIG.SYS
Това е текстов файл.
device =

devicehig.h =

device = c:\cdrom\atapi.sys // излишни драйвери за реален режим,

device = c:\sb\sblive.sys // които можем да изтрием


Команда от CONFIG.SYS: dos = AUTO / NOAUTO // по подразбиране за версии V 7.0 за DOS – при Windows 95 и следващи версии
device = himem.sys // свързан с XMS паметта

device = ifshlp.sys // от File System Helping

device = setver.exe // различните програми да получават информация за версията на DOS и за някои програми да въведат заблуда относно версията на DOS.
2. ВАТ файлове
ВАТСН файлове за пакетна обработка.

Подобни на Shell скриптовете на Unix.

В ВАТ файловете са възможни следните конструкции:

if; for; call (за извикване на друг ВАТ файл); %1, %2 – параметри от позиционния ред (извиквани)


3. AUTOEXEC.BAT

Подчинява се на правилата на ВАТ файловете. Използва още и GoTo. Може да има например: C:\SB\sbinit.com – път до изпълним файл. Сам по себе си е текстов файл. След изпълнението на изпълним файл връща управлението пак към себе си.

Възможно е да има няколко изброени пътя, ни все пак има някакво ограничение.
Set path = C:\MICROS~1\COMMON\MSDEV\BIN;
4. DOSSTART.BAT и WINSTART.BAT
Първият се изпълнява, когато се влиза под DOS или чрез рестартиране на компютъра в DOS режим. Зарежда периферните устройства в чист DOS.

Вторият се изпълнява при стартиране на Windows.


5. MSDOS.SYS
Преди версии V 7.0 – Инсталируем драйвер с всички функции на DOS, т.е. техният машинен код. От V 7.0 и нагоре е текстов файл. Позволява се документирани и недокументирани възможности за ВООТ (зареждане на Windows).
[paths] Важно за MSDOS.SYS

……… да не се трие. Принципно е скрит файл.

[options] ключ = стойност – разновидности в зареждане на Windows

………


xxxxx
BOOTGUI = 1/0 – дали автоматично да се зареди в графичен интерфейс.

LOGO = 1/0 – да се показва картинката с облачета на Windows, т.н. LOGO. 0 – черен екран на DOS.



- logo.sys

BOOTKEYS = 1/0 – 1 – дали да се интерпретират функционалните клавиши F5, F8.

BOOTSAFE = 0/1 – 1– винаги влиза в SafeMode.

AUTOSCAN = 0/1/2: 0 – за отмяна на ScanDisk; 1 – въпрос, дали да се стартира ScanDisk; 2 – автоматично стартира ScanDisk.


6. INI файлове – WIN.INI, SYSTEM.INI
Текстови файлове.

СТРУКТУРА: [секция 1] [секция 2] ключът: string

Ключ 1 = стойност 1 ………… стойностите: string, integer, bool,

Ключ 2 = стойност 2 ………… 0, N, No, F (false)

; коментар [секция n] 1, Y, Yes, T (true)

Не може да има едноименни ключове.


[windows]

load = ……… (може да има списък от .ЕХЕ)

run = ………
SYSTEM.INI

[vcache]

// тази секция е възможно и да я няма. Каква част от RAM е заредена в кеша. Ако липсва Windows автоматично си наглася [KB]. Съществуват и такива програми за нагласа. Например: CacheMam. Подобрението на системата е най-много 4,5%

MinFileCache = x

MaxFileCache = y

[386 Enh]

// за защитения режим на работа

device =

// зареждат се виртуални драйвери. Възможна е поредица от ключове, като се повтарят. Device = според брой ключове

MinPagingFileSize = a

MaxPagingFileSize = b

// доспъпни от MyComputer\Proparties\Performance\VirtualMemory. Всяка промяна изисква Restart.

PagingDrive = C:

// място на разполагане на swap файла

[boot]

shell = explorer.exe
WIN.INI

[windows]

load = C:\progr1.exe; C:\progr2.exe; ……

run =

Основни функции за работа с .INI файлове:
GetProfileInt (…) – подаваме секция, връща се ключ = ………

GetProfileString (…) – ако го няма ключа или секцията се връща зададения от нас резултат по подразбиране

WriteProfileInt (…)

WriteProfileString (…)

GetPrivateProfileInt (…) – същите параметри като в GetProfileInt + пътя, указващ къде се намира INI файла, който четем.

GetPrivateProfileString (…)


7. Windows Registry
Всичко, което в INI файловете се пази в Registry. За NT имат особено значение!

а) логическа организация

Състои се от ключове и стойности (keys and values). Разширението от INI файловете е, т.нар. дървовидна структура (ключовете могат да се влагат един в друг). Ключове на директории; стойности на файлове.


Коренни ключове – отделни дървета
HKEY_LOCALMACHINE (HKLM)

HKEY_USER (HKU)

HKEY_CLASSES_ROOT (HKCR)

HKEY_CURRENT_USER (HKCU) – за отделните потребители, които са регисттрирани

HKEY_CURRENT_CONFIG

HKEY_DYN_DATA (9x) – информация за текущото състояние на компютъра, например …

или

HKEY_PERFORMANCE_DATA (NT) - … натоварване на CPU


HKLM\NetWork\Logon – Ключ съставен от подключове

@ - подразбираща се стойност (default)

NULL – неинициализирана стойност

Username = sp1 – значение на стойността – типът е string


б) физическа организация – за 9х; SYSTEM.DAT (HKLM); USER.DAT (HKU/HKCU)

Намират се в директорията на Windows, обикновено в Windows\System

Ако работата е многопотребителска: Windows\Profile\ - тук се намира USER.DAT за всеки потребител.

В Windows NT – SYSTEM. (HKLM)

SOFTWARE. (HKLM)

Без разширения са. Намират се в: Windows\System32\Config

Потребителската информация NTUSER>DAT (HKCU) се намира в: Windows\Document and Settings\Profile\
в) предназначение

HKCU\SOFTWARE\Microsoft

HKLM\SOFTWARE\Microsoft

Определят поведението на системата


Програма за копие на регистрите на системата Ashampoo Uninstaller.

HKCU\Software\Micrisoft\Windows\CurrentVersion\Policies\Explorer


ClearRecentDocSOnExit = 1 – да се изтриват от Start Menu документите, които последно са използвани.
TweafUI – Програма за промяна поведението на Windows, както и за поведението на външния вид на Explorer.
Връзки:

ProgIDS – Свързан със стартиране на програми (идентификатори на програми)


HKCR \ .ZIP @ = WinZip

HKCR \ .AGJ @ = WinZip

HKCR \ .AVI @ = AVIFile

………


HKCR \ WinZip @ = WinZip Archive

HKCR \ WINZIP \ DefaultIcon @ = WinZip.exe, 1

HKCR \ WINZIP \ Shell \ Open \ Command @ = “WinZip.exe %1” // %1 параметър по подразбиране, смисълът е каква команда ще се задейства при натискане на Open

HKCR \ WinZip \ Shell \ OpenwithMyProg \ Command – ще излиза в командното меню при щракване с десен бутон.


За Visual C:

MFC AppWizard

Singe.doc

Multiple


Document/View Architecture – свързва код в Registry
г) грижи за Registry
Norton Utilities – относно връзките, когато са нарушени

WinDoctor; RegClean.exe


д) ред на зареждане (9х)


  1. MSDOS.SYS

  2. CONFIG.SYS

  3. AUTOEXEC.BAT

  4. WINSTART.BAT

  5. зареждате се VxD (статични) драйвери от [386Enh] в SYSTEM.INI

  6. Зареждат се VxD

HKLM \ SYSTEM \ CURRENTCONTROLSET \ SERVICES \ VxD

  1. Програми:

HKLM \ Software \ Microsoft \ Windows \ CurrentVersion \ RunServices

RunServicesOnce

Run

RunOnce


  1. load = от...

run = …WIN.INI

  1. shell = от SYSTEM>INI

  2. Всяко от StartUp директории



ПРЕКЪСВАНИЯ. РЕЖИМ НА РАБОТА НА CPU

Прекъсванията са механизми, които заставят CPU да прекъсне за кратко време изпълнението на текущата програма и да обработи заявката за прекъсване. Максималният брой прекъсвания е 256.


1. Външни прекъсвания (апаратни)

Те биват маскируеми и немаскируеми.


1.1. немаскируеми прекъсвания – не могат да се забранят по програмен път и имат по-висок приоритет. Те се генерират при използване на копроцесор или при грешка при четене в паметта.

1.2. маскируеми прекъсвания – генерират се от контролера (контролерите) за прекъсвания по заявка на определени периферни устройства. Контролерите могат да бъдат 1 или 2. От 286 нататък имат 2 контролера на прекъсвания, които са каскадно свързани. Могат да се свържат до 8 периферни устройства чрез линиите IRQ 0, …, IRQ 7.

Към IRQ 0 по принцип е свързан таймерът.

IRQ 0 за І контролер се използват 2 порта:

IRQ 1 020h и 021h

IRQ 2 за ІІ контролер те са 0A0h и 0A1h

………


IRQ 7 за инициализация се използват и инициализационни думи в точно определена последователност ICQ 1 … ICQ4.

Операционните команди и думи (OCQ) са 3 и могат да се използват в произволен ред.

За І контролер номера на прекъсването се получава, като към номера на прекъсването се прибави 8 (за IRQ 0  Intr 8).

За ІІ контролер:

IRQ 8  Intr 70h

……

IRQ F Intr 77h


Ако е подадена заявка за прекъсване към IRQ 2 се изпълнява програма, която обработва прекъсване Intr Ah. Тази програма чете регистрите на ІІ контролер, за да определи номера на IRQ. По този номер се извиква едно от прекъсванията от Intr 70h до Intr 77h като софтуерно.
1.3. процедура на прекъсване:

- контролера на прекъсване получава заявка от определено периферно устройство и, като спазва схемата на приоритета генерира сигнал Intr, който е входен за процесора.

- процесорът проверява IR (Interrupt Flag). Ако има стойност 1, прекъсванията не са маскирани.

- ако прекъсванията не са маскирани процесът генерира сигнал INTA (потвърждение на прекъсване).

- щом получи този сигнал, контролерът изпраща.

- изпълнява се процедура по предаване на управлението на обслужващата програма:

= IF и IT се нулират;

= флаговият регистър, указателят на инструкцията се запазват в стека;

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

- след като завърши работата си програмата трябва да изпълни инструкция IRET, при което запазените в стека стойности се възстановяват и процесорът може да продължи изпълнението от мястото, където е бил прекъснат.


2. Вътрешни прекъсвания (изключителни събития)

Възникват при изпълнение на дадена програма и са свързани с програмни или апаратни особености на системата. Делят се на 3 типа: нарушения, капани и критични грешки.

нарушения – при тях грешката се забелязва преди нейното възникване (нарушение на привилегиите);

капани – възникват след изпълнение на дадени инструкции (препълване). Трябва да има схема за обработване на грешката;

критични грешки – възникват при програмни или апаратни проблеми, при които е невъзможно да се определи причината за грешката. Изпълнението на програмата се прекратява.
3. Програмни (софтуерни) прекъсвания

Изпълняват се с помощта на двубайтова инструкция INT, следвана от номера на прекъсването.


3.1. забрана и разрешаване на прекъсванията

Използват се инструкции STI и CLI.


3.2. най-приоритетно прекъсване RESET (начално установяване) Intr 19h
3.3. таблица на преходите на прекъсване

Връзката между номера на дадено прекъсване и съответната обслужваща програма се осъществява с помощта на векторите на прекъсване. Под DOS, таблицата с векторите на прекъсване заема първият един килобайт от ОП. За всеки вектор се заемат 4 байта. Може да се получи конфликт между вътрешно прекъсване и функции на BIOS, ако потребителската програма не е предвидила средства за обработване на вътрешните прекъсвания.


Прекъсване 0 заема адреси от 000h до 003h. Това е вътрешна грешка – деление на 0.

Прекъсване 1 заема адреси от 004h до 007h. Това е прекъсване по единична стъпка trace.

Прекъсване 2 заема адреси от 008h до 00Bh. Това е NMI прекъсване.

Прекъсване 8 заема адреси от 020h до 023h. Това е прекъсване от таймера.

Началният номер на вектора се получава, като се умножи номера на прекъсването по 4.

В защитен режим също има 256 прекъсвания, на за всяко прекъсване сте отделят по 8 байта.

Таблицата може да заема произволно място в паметта. Регистър IDTR указва къде се намира таблицата в защитен режим.
4. Режим на работа на процесора.
4.1. реален режим на работа

При реален режим адресирането става чрез сегмент и отместване. Максималният размер на сегмента е 64 КВ. Максималното адресируемо пространство е 1 МВ. Адресът е 20 разряден. Получава се, като се измести наляво с 4 бита и добавяне на отместване.

Прекъсванията и изключителните събития се обслужват с помощта на вектори, разположени на постоянни адреси. За всяко прекъсване има 4 байта.
4.2. защитен режим на работа

адресното пространство е до 4 GB. Може да се работи с виртуалната памет до 64 ТВ. Основни различия между режим със защита и реалният режим са в размера на адресното пространство и механизма на адресиране.

организация на паметта – получаването на базовия адрес на сегмента става косвено. Използва се 16 битов селектор, който сочи индекс от специална таблица, поддържана от ОС. Тази таблица съдържа 64 битови дескриптори. Едно от полетата на дескриптора представлява 32 битов адрес на сегмента. Физическият адрес се получава чрез сумиране на адреса на сегмента и 32 битово отместване. В дескриптора се съдържа и 20 битово поле, което определя границите на сегмента.

Съществува гранулираност на сегмента – специален бит. Ако е 0 имаме максимална големина от 1 МВ. Ако стойността е 1 гранулираността е 4 КВ и се получава максимален размер на сегмента 4 GB.

Налично е странично разделение на паметта – големината на страниците е 4 КВ. Страницирането е опционно. Адресът, получен чрез сумиране на сегмента и отместването, се подава на входа на странициращото устройство. Странициращото устройство работи с 3 типа таблици.

- разделяне на 32 битовия адрес.

дескриптори (таблици на описанията) – размер на таблицата 8В ÷ 64 КВ.



І тип – глобална дескипторна таблица GDT. Тя съдържа дескрипторите за сегменти, които са достъпни за всички задачи в системата.

ІІ тип – локална дескрипторна таблици LDT. Дефинира се за всяка самостоятелна задача под управлението на кода, данните, стека, шлюзовете на задачите и изискванията. Осигурява механизма за защита на кода и данните за текущата задача от останалите задачи. Даден сегмент не може да бъде използван от текущата задача, ако не е описан в главната ДТ или в нейната локална ДТ.

ІІІ тип – дескриптор на прекъсването IDT. Използват се 4 нива на защита.

Най-висок приоритет има ниво 0. Потребителските програми се разполагат на ниво 3.



Правила за достъп до данни: от текущото ниво на привилегия може да има достъп до данни сегмент със същото ниво на привилегия или по-малко.

Достъп до програми: програма може да извика друга програма само, ако втората има същото ниво на привилегия или по-високо.
4.3. режим V-86

Създаден е, за да могат в режим със защита да се изпълняват програми, написани за реален режим. Възможно е при многозадачна работа част от задачите да работят в режим V-86, а други в обикновен защитен режим. Начинът на адресация е еднакъв с реален режим на работа. Прекъсванията се прихващат и обработват чрез ДТ на прекъсванията. Желателно е да се използва страницирането на паметта.


4.4. режим на ситемно управление SMM

За пръв път при процесора 386S4. При този режим се реализира конкретна функция от системата със сигурност на процесора или от системата за обслужване на консумация.



ПРОЦЕСИ И НИШКИ. ПРИОРИТЕТИ. СИНХРОНИЗАЦИЯ.



1. Общи положения

Windows 9x, NT – preemptive



Нишка (thread) – път на изпълнение (фрагмент от код) на програмата.

Процес (process) – включва 1 или повече нишки, кода, данни и други ресурси (отворени файлове, манипулатори). Всяка нишка работи самостоятелно, без да вижда другите нишки.

Приоритет – разпределянето на ресурси между процесите и нишките зависи от тях.
Клас приоритет (за процес):

REALTIME_PRIORITY_CLASS

HIGH_PRIORITY_CLASS

NORMAL_PRIORITY_CLASS

IDLE_PRIORITY_CLASS
Нишков приоритет (общо 7):

THREAD_PRIORITY_TIME_CRITICAL1

…………………………

…………………………

…………………………NORMAL

…………………………IDLE


2. Процеси и нишки
2.1. създаване и унищожаване

процес: CreateProcess (…)

ShellExecute (…)

PROCESS_INFORMATION pinf; //MANDLE hpROCESS; DWORD PLD;

CreateProcess (“C:\myprog.exe”,…,HIGH_PRIORITY_CLASS &pinf);

ShellExecute (NULL, “print”,”doc1.doc”,””,SW_SHOW);
нишка: CreateThread (…, ThreadProc, param,…);

DWORD WINAPI ThreadProc (LPVOID P);


TerminateThread (HANDLE h, DWORD exitcode);

TerminateProcess (HANDLE h, DWORD exitcode);


BOOL GetExitCodeProcess (HANDLE h LPDWORDlp ExitCode);

BOOL GetExitCodeThread (………);

DWORD SuspendThread (HANDLE h);2

DWORD ResumThread (HANDLE h);3


2.2. получаване на манипулатори

HANDLE GetCurrentProcess ();

HANDLE GetCurrentThread ();

2.3. промяна на приоритет

BOOL SetPriorityClass (HANDLE h, DWORD priority);

BOOL SetThreadPriority (HANDLE h, DWORD priority);
­­­­­­­­­­­­­­­­­­­­­­­SetPriorityClass (GetCurrentProcess(), REALTIME_PRIORITY_CLASS);

SetThreadPriority (GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);

while (1);4
3. Синхронизация

i ++;  inc [i]

i = i + 1;  move eax, [i]

inc eax


mov [i], eax

3.1. средства
• специфични API функции:

InterlockedIncrement (…);

InterlockedDecrement (…);

InterlockedExchange (…);


• критична секция – може да се притежава само от една нишка в момента в рамките на процеса.

EnterCriticalSection (LPCRITICAL_SECTION sectn);

LeaveCriticalSection (……);

InitializeCriticalSection (……);

DeleteCriticalSection (……);
CRITICAL_SECTION sect;

InitializeCriticalSection (8 sect);

……………

EnterCriricalSection (8 sect);



// обработка на общ ресурс

LeaveCriticalSection (8 sect);

……………

DeleteCriticalSection (8 sect);


• синхронизационни обекти

Общи черти: имат 2 състояния – активно и неактивно (signaled и nonsignalled). Могат да се използват във функциите:

WaitForSingleObject (HANDLE h, DWORD milliseconds);

WaitForMultipleObject (…);
Обектите са:

• mutex;


• semaphore;

• event.


DWORD WaitForSingleObject (HANDLE h, DWORD timeout);
WAIT_OBJECT_05

WAIT_TIMEOUT

WAIT_ABANDONED
Функцията променя h, ако е mutex, semaphore, event

WaitForMultipleObject (…);

PROG 1;

……………


HANDLE Proc = CreateProcess (…, “c:\prog2.exe”, …);

DWORD excode;

do

{

GetExitCodeProcess (hProc, &excode);



}

while (excode == STILL_ACTIVE);

……………

WaitForSingleObject (hProc, INFINITE);6


Семафор – цяло число

• сигнализиран – при > 0

• несигнализиран – при == 0
HANDLE h = CreateSemaphore (…);

WaitForSingleObject (h, INFINITE);

ReadFile (…);

//обработка

WriteFile (…);

ReleaseSemaphore (h, 1, NULL);


BOOL ReleaseSemaphore (HANDLE h, LONG releasecnt, LPLONG);

mutex – MUTuallyExclusive

• несигнализиран == 0 – зает, притежван

• сигнализиран == 1 – свободен
HANDLE CreateMutex (LPSECURITY_ATTRIBUTES s, bool initialowner, LPCTSTR name);

WaitForSingleObject (h, INFINITE);

ReadFile (…);

//обработка

WriteFile (…);

ReleaseMutex (n);


BOOL ReleaseMutex (HANDLE h);
HANDLE h = CreateMutex (NULL, TRUE, “MyMutex”);

BOOL isfirst = (GetLastError ()!+ERROR_ALREADY_EXISTS);

…………………………

CloseHandle(h);


Събитие event

• сигнализирано – SetEvent (HANDLE h);

• несигнализирано – ResetEvent (HANDLE h);
HANDLE CreatEvent (LPSECURITY_ATTRIBUTES s, BOOL manula7, BOOL initialstate, LPCTSTR name);

PulseEvent (HANDLE h);8

HANDLE ev = CreateEvent (NULL, FALSE, FALSE, “setting_event”);

……………


DWORD WINAPI Thread (LPVOIDP)

{

while (1)



{

WaitForSingleObject (ev, INFINITE);

ReadSettings ();

}

}



……………

CreateThread (…, Thread, …);

……………

//промяна на настройките

WriteSettings ();

PulsEvent (ev);

……………


CloseHandle (ev);


ОСНОВНИ ТИПОВЕ В Windows API

Типовете се пишат с главни букви




• покриват стандартните С/С++ типове




• следват Асемблерски имена

API




С тип










INT

-

int (32b) typedef




BYTE

-

unsigned char (8b)

SHORT

-

short (16b)




WORD

-

unsigned short (16b)

LONG

-

long (32b)




DWORD

-

unsigned (32b)

ULONG

-

unsigned long













USHORT

-

unsigned short













UINT

-

unsigned int













CHAR

-

char (8b)












• конвенции за имена на указателни типове



9префикс Р – указател (*)

префикс LP – далечен указател (long pointer) far *

LPBYTE BYTE FAR *

PBYTE BYTE *

В 16 bit Win:

#define FAR far

В 32 bit Win:

#define FAR

Р

LP



PBYTE BYTE *

LPBYTE BYTE FAR *

PVOID void *



HANDLE void *

HPEN void *



CHAR char 8bits символ ANSI



WCHAR wchar_t 16bits символ UNICODE

TCHAR CHAR или WCHAR


#fdef UNICODE

#defin TCHAR NCHAR

#else

#define TCHAR CHAR



#endif
LPSTR CHAR * (тип за масиви)

LPWSTR WCHAR *

LPTSTR TCHAR *
TCHAR msg [] = “Hello”; //не е преносимо към UNICODE

TCHAR msg [] = _T(“Hello”) //преносимо е към UNICODE


LPCSTR const CHAR *

LPCWSTR const WCHAR *

LPCTSTR const TCHAR *
GetWindowText (…) //LPSTRtext

GetWindowText A(…) //LPSTRtext

GetWindowTextW (…) //LPWSTRtext
Int INC (int a, int &res1, int *ts2)

{

res1=a+1; int r1, r2;



*res2=a+1; int r3.INC (1, r1, &r2);

return a+1;

}
GetWindowText (HANDw, LPTSTR t, int maxeg);

LPTSTR txt;

GetWindowText (HWND, txt, 128);
Txt=new TCHAR [129]; ≡ TCHAR txt [129];

Delete txt; GetWindowText (HWND, txt, sizeof-1);


ВЪВЕДЕНИЕ В СОМ (Component Object Model) и DirectX

COM е MS технология. Позволява обекти, работещи в нишки, процеси да си взаимодействат толкова лесно, както и ако работят в един процес.



1. СОМ



1.1. Интерфейси

СОМ – съвкупност от класове (интерфейси)


Получаване на интерфейси:



  • CoCreateInstans (…)

  • С използване на друга специфична функция:

DirectDrawCreator (…) IndirectDraw

  • чрез извикване на методи на интерфейса, който вече сме придобили


1.2. Уникални идентификатори.

128 битови цели числа, представят се като 16-ични разради: 8-4-4-12


Пример:

ABCDEF01 – 0000-1111-2222-333344445555

H KCR\CLSID
Основни:

UUID – универсално – уникален идентификатор

GUID – глобално – уникален идентификатор

LUID – локално – уникален идентификатор
IID

REFID


GUIDGEN.EXE
1.3. Интерфейс (клас) IUnKnown

ULONG IUnknown AddRef ();

ULONG IUnknown Release ();

HRESULT IUnknown Interface (REFID void, void **pvObject);


1.4. Жизнен цикъл на обектите (екземпляр на класовете). Брояч на използванията на класовете

Увеличаване на броя с 1  AddRef () ++ бр

Намаляване броя с 1  Release () – бр

Трябва да има достатъчен брой Release, за да може да се освободят всички интерфейси.


1.5. Метод QueryInterface

IDirectDraw *lpDD;

IDirectDraw2 *lpDD2;

DirectDrawCreate (NULL, &lpDD, NULL);

If (lpDD == NULL) ………//грешка

lpDD QueryInterface (IIDD_DirectDraw2, (void**)10 & lpDD211);

HRESULT.IUnknownDrawInterface (…………);

== 0 – OK

!= 0 – грешка

if (lpDD2 == NULL) ………



РАЗРАБОТВАНЕ НА РЕЗИДЕНТНИ ПРОГРАМИ (TSR)




1. Приложение


Разработване на TSR се налага, когато ОС не поддържа многозадачност (например DOS). Създава се т.нар. псевдомногозадчност.

Пример: кирилизация на DOS

В някои случаи драйвера на мишката под DOS е също TSR.

Когато се изпълнява TSR се отнема от времето за изпълнение на основната задача. Това води до забавяне при нейното изпълнение. Колкото повече TSR имаме, толкова основни задачи се изпълняват по-трудно.

Изисквания:

1) броят на стартираните TSR не трябва да бъде голям;

2) да се изпълняват максимално бързо, което води до използване на Assembler;

3) да са малки по размер;



2. Действия, извършвани от TSR


TSR се инсталират еднократно. Обявяват заеманата от тях памет за неизползваема от други програми. Прихващат 1 или няколко прекъсвания. Освобождават излишна памет. Връщат управлението на DOS.

Активирането на TSR става при настъпване на някакво събитие. Например натискането на релейна клавишна комбинация, задаване на команда от командния ред или активиране по време.

При TSR има елементарна форма на събитийно програмиране.

Резидентната програма се състои от 2 основни части: резидентна част и инсталационна част.

Възможни са комбинациите:

1) първо резидентната част, а след това инсталационната част;

2) първо инсталационната част, а след това резидентната част.

За предпочитане инсталационната част да е в края на програмата. При стартиране има 1 скок към инсталационната част. Желателно е да е в края, защото след инсталирането TSR няма нужда от инсталационната част. Паметта, която тя заема може да се освободи и се намалява размера на TSR програма. В резидентната част може да има няколко входа в зависимост от прихванатите прекъсвания.

Препоръки при разработване на резидентни програми:

- да се намали размера на заемания от резидентната програма блок памет до възможния минимум (размера на резидентната част);

- да се освободи блока, принадлежащ на резидентната програма, ако не се използва;

- да се запомнят адресите на прихванатите прекъсвания;

- резидентната програма да може да бъде активирана и деактивирана по всяко време от потребителя;

- резидентната програма да може да бъде деинсталирана (да се премахне от паметта);

- да не позволява зареждане на 2 копие в паметта;

- да се освобождава заеманата памет след деинсталиране;

- да се възстановят оригиналните вектори на прихванатите прекъсвания;

- да се разреши проблема с нерекурсивността на DOS при използване на DOS функции;

- да се прави проверка, дали е възможно използването на дисковия драйвер.

3. Инсталиране на резидентни програми


Съществуват два начина за инсталиране чрез използване функциите на DOS.

1) Използване на 27 прекъсване на DOS – използва се, когато големината на резидентната програма е до 64КВ. Програмите могат да бъдат във формат .ехе и .соm. Програмите, които използват това прекъсване не могат да се зареждат в адаптерния сегмент. В регистър DX трябва да се зареди адресът на последния байт от резидентната част.

2) Като се използва 31h функция на прекъсване 21 на DOS – резидентната програма може да бъде по-голяма от 64КВ, може да се зарежда в адаптерния сегмент. В DX трябва да се подаде големината на резидентната част в параграфи.

4. Освобождаване на излишна памет


Може да се използва функция 4Аh на 21 прекъсване. Ако се използва резидентна програма може да се използва 49h на 21 прекъсване.

5. Пренасочване на вектор на прекъсване


Активирането на резидентната програма става при генериране на прекъсване. За целта е необходимо да се промени таблицата с вектори на прекъсванията, като се замени началният адрес на програмата, облажваща съответното прекъсване на BIOS или DOS с началния адрес на резидентната програма. По този начин при всяко генериране на прекъсване първо ще се активира резидентната програма. След прихващане на прекъсването са възможни два варианта. При първият се изпълнява кода на резидентната програма и след това управлението се връща на оригиналната програма, обработваща прекъсването (най-често използвания вариант). При втория вариант не се връща управлението. В този случай кода на резидентната програма трябва да изпълнява функциите на оригиналната програма за обработване на прекъсването.

Прихващането и пренасочването на вектор на прекъсване се извършва по следния алгоритъм:



1) забраняват се прекъсванията – CLI

2) използва се функция 34h на 21h прекъсване за получаване адреса на вектора на прекъсване

АН = 35


AL = номера на вектора на прекъсване

Inter 21h

ES:BX се получава сегмента и отместването на вектора на прекъсването

3) запомня се адреса в променливи от резидентната част

4) пренасочване на вектора на прекъсването

Fun 25h Inter 21h

AH = 25h

AL = номера на вектора, който искаме да пренасочим

DS:SH – сегмент:отместването на новия адрес

DS трябва да сочи резидентната програма



5) STI – разрешаване на прекъсванията – ако резидентната програма прихваща повече от 1 вектор на прекъсване за всяко прекъсване се използва този алгоритъм

6. Проверка за наличност на резидентна програма


Резидентната програма трябва само веднъж да се зареди в паметта. Има няколко метода за проверка. Проверката за наличност се извършва в инсталационната част, т.е. ако се опитаме да заредим второ копие от програмата, проверката се осъществява от инсталационната част на второто копие.

Методите са:

1) Използване на свободна клетка от работната област на BIOS като флаг за наличност.

Недостатък: тази клетка може да бъде попроменена от други програми или да се използва от друга версия на BIOS.

2) Използване на клетка от самата резидентна програма.

Недостатък: сложно търсене.

3) Използване на уникална последователност от символи.

Недостатък: усложнено търсене.

4) Поименно търсене на резидентната програма – трябва да се проверят всички МСВ. На отместване 8 от началото на блока започва началото на резидентната програма.

Недостатък: усложнено търсене.

5) Дефиниране на потребителска функция на прекъсване на DOS или BIOS – да се дефинира потребителската функция на едно от прихванатите прекъсвания. Дефинирането на нова функция се извършва в инсталационната част. Обработката се извършва от резидентната част. Проверката се извършва от инсталационната част.

7. Деактивиране на резидентната програма


Използва се, когато работата на резидентната програма временно трябва да бъде спряна. За целта се използва клетка от резидентната част, която служи като флаг за активност/неактивност. Когато резидентната програма е неактивна тя веднага трябва да върне управлението на прихванатите вектори на прекъсването. Деактивирането се прилага и в случаите, когато резидентната програма не може да бъде деинсталирана.

8. Деинсталиране на резидентната програма


Всяка добре резработена резидентна програма трябва да дава възможност за деинсталиране. Трябва да се направи следното:

- да се направи проверка, дали деинсталирането е възможно. Ако е невъзможно се извършва деактивиране и се извежда съобщение. Ако е възможно се възстановяват адресите на прихванатите от резидентната програма вектори на прекъсване. След това се извършва освобождаване на заемания от резидентната програма блок от паметта.

Деинсталирането става в ред, обратен на инсталирането.

Деинсталирането е възможно само, ако адресите на прихванатите прекъсвания сочат началото на резидентната програма. За възстановяване векторите на прекъсването се използва 25h функция на 21h прекъсване. Освобождаването на блока от паметта, принадлежащ на резидентната програма става с помощта на 49h функция на 21h прекъсване.



9. Разрешаване проблема с нерекурсивността на DOS


Не може да се влага DOS функция в друга функция. Има флаг inDOS. Стойност 1, когато се изпълнява DOS функция и стойност 0, когато не се изпълнява.

Много често се използва 28h прекъсване.



10. Проверка за използване на дисков драйвер


Трябва да се прихване 1Вh прекъсване и да се организира брояч на дисковите операции.

СТАНДАРТНИ И ИНСТАЛИРУЕМИ ДРАЙВЕРИ (DOS)

1. Стандартни драйвери


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

CON, PRN=LP1, AUV=COM1, COM2, LP2

Всички тези драйвери са обединени във файл IO.SYS на DOS. Драйверите са подредени в свързан линеен списък. В заглавието на всеки драйвер се указва адреса на заглавието на следващия драйвер. Всички драйвери имат една и съща структурна схема. DOS притежава специална функция 44h на 21h прекъсване за работа със стандартни драйвери (IOCL).

2. Видове драйвери в зависимост от обслужваното устройство


По отношение на DOS устройствата са 2 основни типа:

- символни;

- блокови.

Съответно драйверите са за символно и блоково устройство.


2.1. Драйвери за блоково устройство

Характерно за тях е, че обменят информация под формата на големи блокове от байтове. Тези устройства се използват като външна памет (дискове, магнитни ленти). Драйверите за външни устройства нямат имена, а обръщението към тях става с буквите А, В, С … Ако блок драйвери са повече от 1, подреждането им във верига определя символ за обръщение.

Създаването на драйвери за блокови устройства е доста трудно.
2.2. Драйвери за символни устройства

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



3. Специализирани драйвери


Освен стандартните устройства могат да бъдат включени и специализирани устройства. За да се облекчи достъпът на потребителя до тези устройства са необходими драйвери. Чрез тях се осъществява връзка с потребителските програми. Възможни са три начина за създаване на специализирани драйвери с възможност за достъп от потребителски програми.

- специализиран начин да бъде вмъкнат в кода на потребителската програма. Създава се от програмиста с цел достъп до ресурсите на периферното устройство. Използва се само от конкретната програма. Пример са компютърните игри. Те имат собствени драйвери.

- специализиран драйвер се създава като отделен модул във вид на резидентна програма. Такъв драйвер може да бъде използван от всяка потребителска програма, ако се знае каква входна информация се подава и каква е изходната информация накрая.

- специализираните драйвери се създават по подобие на стандартните драйвери и се зареждат в паметта от DEVICE= и DEVICEHIGH= във файла SONFIG.SYS. Тези драйвери се наричат инсталируеми.



4. Инсталируеми драйвери


Създават се като стандартен DOS интерфейс по отношение драйверите на устройство. Освен поддържането на нови периферни устройства инсталируемите драйвери могат да модифицират някои от стандартните драйвери. Инсталируемите драйвери винаги се добавят в началото на веригата от драйвери. Ако вашият инсталируем драйвер има същото име като стандартния драйвер, то DOS първо ще намери инсталируемия драйвери, тъй като прекъсването е в началото. Инсталируемия драйвер се създава като асемблерска програма със зададен формат.

5. Структура на инсталируемите драйвери


Инсталируемите драйвери имат 3 основни части:

- заглавна част;

- стратегически блок;

- изпълним (основен) блок.


5.1. Заглавна част

Заглавната част съдържа указател към следващия драйвер в списъка. Съдържа атрибути на драйвера, указател към стратегическия и основния блок и името на драйвера. Големината на заглавната част е 18В. Първите 2В са отместването на указателя към следващия драйвер в списъка. Следващите 2В – атрибути на инсталируемия драйвер. Те характеризират драйвера. Следващите 2В са указател към стратегическия блок. Други те 2В – указател към изпълнимия блок. 8В – за име на драйвера.

Когато се създава драйвер първите 4В се попълват с FFFF:FFFF (указател за следващ драйвер).
Блок за заяква към драйвера (Request Header (RH))

Блок за заявка към драйвера се изгражда от DOS пир всяко обръщение към драйвера. Драйверът получава достъп до заявката чрез указател, съдържащ се в регистрите ES:EX. Блокът за заявка се състои от 2 части – постоянна и променлива част. Променливата зависи от заявката. В постоянната част се съдържа информация за дължината на блока заявка (максимален размер 256), номер на устройство, код на командата, дума за състоянието на драйвера. Променливата част зависи от това каква команда ще се извърши. Поддържат се около 23 функции на DOS, така че може да има 23 вида променливи части.

След като драйверът дешифрира кода на функцията, той осъществява съответното обслужване. Резултатите от изпълнението на заявката се поместват в думата за състоянието в блока на заявката. Думата за състоянието се обработва от COMMAND.COM и в зависимост от резултата се извежда съответното съобщение.
5.2. Стратегически блок

Състои се от 5 реда програмен код. Задачата му е да буферира заявките от DOS. Запазва информация от ES:EX, така че тази информация после да бъде използвана от изпълнимия блок. Стратегическият блок задължително завършва с команда RET, за да върне управлението на DOS. След това DOS извиква изпълнимия блок.




7 – DOS извиква изпълнимия блок

11 – попълва дума за състоянието


5.3. Изпълним блок

Неговата задача е да провери блока за заявка и в зависимост от указаната команда да осъществи изпълнение. Резултатът от обслужването се записва в думата на състоянието (11). Изпълнимият блок трябва да съдържа около 23 функции. Мога да бъдат игнорирани всички функции с изключение на нулевата. Това е инициализиращата функция. Нейната задача е да запише адреса за края на драйвера в блока за заявка. По този начин DOS получава информация къде може да зареди следващия драйвер.



6. Инсталиране на драйвер


Драйверите се инсталират по време на процеса на начално зареждане. Използват се командите DEVICE, DEVICEHIGH във файла CONFIG.SYS.

7. Опит за запис във дисков файл


От потребителската програма се извиква 21h прекъсване. Това прекъсване извиква 26h прекъсване. То попълва блок за заявка и извиква стратегическия блок на драйвера за обслужване на диска. Стратегическият блок запазва адреса на заявката и връща управлението процедурата, обслужваща 26h прекъсване. След това DOS извиква изпълнимия блок. Той прочита блока за заявка. Установява каква функция трябва да изпълни и предава управлението на вътрешна за драйвера процедура, която осъществява записа, като използва 13h прекъсване на BIOS. Когато записа завърши управлението се връща по веригата.

ЛОГИЧЕСКА ОРГАНИЗАЦИЯ НА ДИСКОВЕТЕ

Под логическа организация на дисковете се разбира разделянето на общото пространство на диска на фиксирани области с различно предназначение.

MBR – съществува само при твърдите дискове, чест от него е таблицата на дяловете.

BR – запис на начално зареждане на ОС. Има го при дискети и дискове, като при дисковете се намира в активния дял.

FAT – таблица с местоположението на дяловете. Поддържат се 2 копия на FAT.

Основна директория.

Област за данни.

1. Запис за начално зареждане


Големината му е 1 сектор = 512В и служи за зареждане на ОС. При дискети се намира на 1 сектор, 0 глава, 0 пътечка. При твърдите дискове на това място се намира MBR. За зареждане на ОС се използва 19h прекъсване. Това прекъсване зарежда на адрес 000:7С00h. При твърди дискове ВIOS претърсва областта от MBR, наречена РТ за активен дял (този дял, от който може да се зареди ОС). РТ поддържа информация за 4 дяла, като за всеки дял информацията е 16В. Поддържа се следната информация:

- дали дяла е активен или не;

- откъде започва този дял;

- принадлежност на дяла;

- къде завършва дяла;

- кой е първият сектор в дяла;

- брой сектори.

При грешна структура на дял се извежда съобщение за невалиден РТ. Ако се открие активен дял от него се взема BR и се прави опит той да бъде зареден на 0000:7С00h. Ако това е невъзможно се извежда грешка при зареждане на ОС. Ако се зареди BR се прави проверка за следния идентификатор в края на областта: 55ААh. Извежда се съобщение за невалидна ОС. След като се зареди успешно BR, той поема управлението от BIOS. Започва с 3В jump към процедура, наречена BoolStrap, служеща за зареждане на ОС.

След това има 8В с версия, име на производител – служебна информация. След това има област наречена ВРВ (BIOS Parameter Block). В ВРВ се поддържа следната информация:

- брой байтове в сектор;

- брой сектори в клъстер;

- брой копия на FAT;

- максимален брой елементи в главната директория;

- общ брой на секторите;

- брой сектори във FAT таблицата;

- брой сектори в пътечка;

- брой глави.

2. Таблица с разположение на файловете – FAT


FAT таблицата указва кои части на листа на кой файл принадлежат. Тъй като тази информация е много важна, съществуват 2 копия. Съществуват 3 версии:

- FAT12 – за описание на всеки елемент се отделят 12В. Използва се при дискети.

- FAT16 – малки твърди дискове.

- FAT32 – максималното пространство, което може да се опише е 2ТВ.

Клъстер представлява най-малката област от адресното пространство.

Всеки клъстер се състои от 1 или няколко последователни сектора. Размера му се избира като се прави компромис между големината на FAT таблицата и ефективното използване на дисковото пространство. 1 клъстер = 1 сектор. 2048 елемента е големината на FAT (3КВ).

Когато файловете не са разположени в последователни клъстери се говори за фрагментиране. Номерата на клъстерите съответстват на номера в FAT таблицата. Нулев и 1 елемент от FAT таблицата не описват клъстерите. Нулевият елемент е идентификатор на типа на диска, а първият е пълен само с 1.

Ако в елемент от FAT таблицата има 0, това означава, че съответният клъстер е свободен. Например FFF7 е идентификатор на повреден клъстер. Ако се съдържа FFFF – край на верига от клъстери. Информацията за това кой е началния клъстер на файла се получава от описанието на директорията, в която се намира файла. Има специални байтове, които определят кой е номера на първия клъстер. След като се открие първия клъстер се проследява веригата от клъстери, докато се открие FFFF.



3. Основна директория


Тя е в основата на дървовидната структура на диска. Разполагат се на точно определено място след второто копие на FAT. При FAT12 и FAT16 има фиксирана големина. В основната директория са описани поименно всички файлове и директории, които му принадлежат.

4. Област за данни


Заема преобладаващата част от диска и се намира от края на основата директория до последния клъстер.

5. Функции на BIOS за работа с дискове


Достъпни са през 13h прекъсване – функция за инициализиране, за четене, за запис, за форматиране. Функция се поставя в АН, а в регистър DL се указва устройството, с което ще се работи. За твърди дискове се използва 80h и 81h (в DL). Номер на четящо – записващата глава се указва в DH. При BIOS информацията се разглежда по секторно. Номер на сектора се указва в CL. Ако трябва да се прочетат и запишат повече от 1 сектор, техният брой се записва в регистър AL.

6. Функции на DOS за работа с дискове


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


1 непрепоръчително

2 спира изпълнението на нишка

3 възстановява изпълнението на нишка

4 системата блокира

5 синхронизираният обект е влязъл в сигнализирано състояние

6 този ред заменя по-горния отделен фрагмент

7 TRUE е ръчно нулиране, а FALSE автоматично нулиране

8 вкарва го в сигнализирано състояние; нишките се освобождават и след това събитието става отново несигнализирано

9 32 bit линеен адрес

10 изходен параметър на функцията

11 ако всичко е ОК, ще върне !=0






Сподели с приятели:




©obuch.info 2024
отнасят до администрацията

    Начална страница