- •Лабораторна робота 1 Тема: Процеси і потоки
- •Створення процесу в win32 api
- •Створення потоку в win32 api
- •Лабораторна робота 2 Тема: Планування і взаємодія процесів і потоків
- •1.Дослідити роботу програми.
- •Приклад синхронізації потоків за допомогою об’єкта critical_section
- •3.За завданням викладача розробити власний проект на основі існуючого. Синхронізація потоків, які виконуються в різних процесах за допомогою м’ютекса
- •Лабораторна робота 4 Тема: Керування оперативною пам’яттю
- •1.Дослідити роботу програми.
- •2.Описати документацію на типи даних, структури та функції win32 api, які використовуються в програмі.
- •3.За завданням викладача розробити власний проект на основі існуючого. Ініціалізація і копіювання блоків віртуальної пам’яті
- •Лабораторна робота 3 Тема: Практична реалізація багатопотоковості
- •1.Дослідити роботу програми.
- •2.Описати документацію на типи даних, структури та функції win32 api, які використовуються в програмі.
- •Лабораторна робота 5 Тема: Файлові системи і операції з файлами і каталогами
- •1.Дослідити роботу програми.
- •2.Описати документацію на типи даних, структури та функції win32 api, які використовуються в програмі.
- •3.За завданням викладача розробити власний проект на основі існуючого. Функції Win32api для файлових операцій
- •Лабораторна робота 6 (ч.1) Тема: Керування пристроями вводу-виводу
- •1.Дослідити роботу програми.
- •2.Описати документацію на типи даних, структури та функції win32 api, які використовуються в програмі.
- •3.За завданням викладача розробити власний проект на основі існуючого. Отримання інформації про перший фізичний диск в системі за допомогою функції DeviceIoControl
- •Лабораторна робота 6 (ч.2) Тема: Створення та використання dll
- •2.Описати документацію на типи даних, структури та функції win32 api, які використовуються в програмі.
- •3.За завданням викладача розробити власний проект на основі існуючого.
- •Створення модальних форм розміщених у dll
- •Лабораторна робота 7 Тема: Взаємодія з користувачем в Windows xp
- •1.Дослідити роботу програми.
- •2.Описати документацію на типи даних, структури та функції win32 api, які використовуються в програмі.
- •3.За завданням викладача розробити власний проект на основі існуючого. Основи створення gui в Win32api
- •Лабораторна робота 8 Тема: Мережні засоби операційних систем
- •3.За завданням викладача розробити власний проект на основі існуючого.
- •Лабораторна робота 9 Тема: Безпека даних в ос
- •1.Дослідити роботу програми.
- •2.Описати документацію на типи даних, структури та функції win32 api, які використовуються в програмі.
- •3.За завданням викладача розробити власний проект на основі існуючого. Додання елементів в список вибіркового керування доступом (dacl) файла або каталога
Лабораторна робота 8 Тема: Мережні засоби операційних систем
Завдання:
1.Дослідити роботу програми для обміну текстовими повідомленнями через мережу.
2.Описати документацію на типи даних, структури та функції, які використовуються в програмі.
3.За завданням викладача розробити власний проект на основі існуючого.
Послідовність виконання:
1 Помістіть на форму програми-сервера компоненти TIdTCPServer, TMemo і заповніть код:
//конструктор форми
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
IdTCPServer1->DefaultPort=8090;//задати порт
IdTCPServer1->Active=true;//зробити сервер активним
Memo1->Lines->Clear();//очистити Memo1
}
//обробник події OnExecute компонента IdTCPServer1
//AThread - потік, який використовується для клієнтських з'єднань
void __fastcall TForm1::IdTCPServer1Execute(TIdPeerThread *AThread)
{
try
{//добавити в Memo1 отриманий рядок
Memo1->Lines->Add(AThread->Connection->ReadLn());
//добавити в Memo1 віддалену IP адресу
Memo1->Lines->Add(AThread->Connection->Binding->PeerIP);
//надіслати локальну IP адресу
AThread->Connection->WriteLn(AThread->Connection->Binding->IP);
}
catch(...)
{//при помилці надіслати "помилка"
AThread->Connection->WriteLn("помилка");
}
AThread->Connection->Disconnect();//роз'єднати з'єднання
}
3 Для можливості роботи програми-сервера на комп’ютері без середовища Borland C++ Builder 6 задайте опції проекту: Project/Options.../Packages/зніміть прапорець Build with runtime packages. На цей комп’ютер також необхідно скопіювати файли: borlndmm.dll і cc3260mt.dll.
4 Скомпілюйте програму-сервер.
5 Помістіть на форму програми-клієнта компоненти TEdit (2 штуки), TButton, TIdTCPClient, і заповніть код:
//конструктор форми
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Edit1->Text="127.0.0.1";//локальний адрес
}
//обробник події OnClick
void __fastcall TForm1::Button1Click(TObject *Sender)
{
IdTCPClient1->Host=Edit1->Text;//вказати адресу віддаленого комп'ютера
IdTCPClient1->Port=8090;//вказати порт
try
{
IdTCPClient1->Connect();//з'єднати з сервером
IdTCPClient1->WriteLn(Edit2->Text);//надіслати рядок
Edit2->Text = IdTCPClient1->ReadLn();//отримати рядок
}
catch(...)
{//при помилці вивести повідомлення
ShowMessage("Помилка з'єднання");
}
IdTCPClient1->Disconnect();//роз'єднати з'єднання
}
6 Скомпілюйте програму-клієнт.
7 Скопіюйте програму-сервер та файли borlndmm.dll і cc3260mt.dll на віддалений комп’ютер з адресою, наприклад, 192.168.1.5. Виконайте програму-сервер на віддаленій машині і програму клієнт на локальній. Введіть в Edit1 клієнта адресу віддаленого комп’ютера і передайте йому будь-який текст. Для тестування програм без мережі на локальній машині слід вводити адресу 127.0.0.1.
Лабораторна робота 9 Тема: Безпека даних в ос
Завдання:
1.Дослідити роботу програми.
2.Описати документацію на типи даних, структури та функції win32 api, які використовуються в програмі.
3.За завданням викладача розробити власний проект на основі існуючого. Додання елементів в список вибіркового керування доступом (dacl) файла або каталога
#ifndef UNICODE
#define UNICODE
#endif
#include <windows.h>
#include <stdio.h>
#include <lm.h>
int main()
{
wchar_t wchDirName[248]; // имя каталога
wchar_t wchUserName[UNLEN]; // имя пользователя
ACL *lpOldDacl; // указатель на старый DACL
ACL *lpNewDacl; // указатель на новый DACL
LPVOID lpAce; // указатель на элемент ACE
DWORD dwDaclLength = 0; // длина DACL
DWORD dwSdLength = 0; // длина SD
DWORD dwSidLength = 0; // длина SID
DWORD dwLengthOfDomainName = 0; // длина имени домена
PSID lpSid = NULL; // указатель на разрешающий SID
LPTSTR lpDomainName = NULL; // указатель на имя домена
SID_NAME_USE typeOfSid; // тип учетной записи
SECURITY_DESCRIPTOR *lpSd = NULL; // адрес дескриптора безопасности
SECURITY_DESCRIPTOR sdAbsoluteSd; // абсолютный формат SD
BOOL bDaclPresent; // признак присутствия списка DACL
BOOL bDaclDefaulted; // признак списка DACL по умолчанию
DWORD dwRetCode; // код возврата
// читаем имя файла или каталога
printf("Input a file or directory name: ");
_getws(wchDirName);
// получаем длину дескриптора безопасности
if (!GetFileSecurity(
wchDirName, // имя файла
DACL_SECURITY_INFORMATION, // получаем DACL
lpSd, // адрес дескриптора безопасности
0, // определяем длину буфера
&dwSdLength)) // адрес для требуемой длины
{
dwRetCode = GetLastError();
if (dwRetCode == ERROR_INSUFFICIENT_BUFFER)
// распределяем память для буфера
lpSd = (SECURITY_DESCRIPTOR*) new char[dwSdLength];
else
{
// выходим из программы
printf("Get file security failed.\n");
printf("Error code: %d\n", dwRetCode);
return dwRetCode;
}
}
// читаем дескриптор безопасности
if (!GetFileSecurity(
wchDirName, // имя файла
DACL_SECURITY_INFORMATION, // получаем DACL
lpSd, // адрес дескриптора безопасности
dwSdLength, // длину буфера
&dwSdLength)) // адрес для требуемой длины
{
dwRetCode = GetLastError();
printf("Get file security failed.\n");
printf("Error code: %d\n", dwRetCode);
return dwRetCode;
}
// вводим имя пользователя, которого добавляем в DACL
printf("Input a user name: ");
_getws(wchUserName);
// определяем длину SID пользователя
if (!LookupAccountName(
NULL, // ищем имя на локальном компьютере
wchUserName, // имя пользователя
NULL, // определяем длину SID
&dwSidLength, // длина SID
NULL, // определяем имя домена
&dwLengthOfDomainName, // длина имени домена
&typeOfSid)) // тип учетной записи
{
dwRetCode = GetLastError();
if (dwRetCode == ERROR_INSUFFICIENT_BUFFER)
{
// распределяем память для SID
lpSid = (SID*) new char[dwSidLength];
lpDomainName = (LPTSTR) new wchar_t[dwLengthOfDomainName];
}
else
{
// выходим из программы
printf("Lookup account name failed.\n");
printf("Error code: %d\n", dwRetCode);
return dwRetCode;
}
}
// определяем SID
if(!LookupAccountName(
NULL, // ищем имя на локальном компьютере
wchUserName, // имя пользователя
lpSid, // указатель на SID
&dwSidLength, // длина SID
lpDomainName, // указатель на имя домена
&dwLengthOfDomainName, // длина имени домена
&typeOfSid)) // тип учетной записи
{
dwRetCode = GetLastError();
printf("Lookup account name failed.\n");
printf("Error code: %d\n", dwRetCode);
return dwRetCode;
}
// получаем список DACL из дескриптора безопасности
if (!GetSecurityDescriptorDacl(
lpSd, // адрес дескриптора безопасности
&bDaclPresent, // признак присутствия списка DACL
&lpOldDacl, // адрес указателя на DACL
&bDaclDefaulted)) // признак списка DACL по умолчанию
{
dwRetCode = GetLastError();
printf("Get security descriptor DACL failed.\n");
printf("Error code: %d\n", dwRetCode);
return dwRetCode;
}
// определяем длину нового DACL
dwDaclLength = lpOldDacl->AclSize +
sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD) + dwSidLength;
// распределяем память под новый DACL
lpNewDacl = (ACL*)new char[dwDaclLength];
// инициализируем новый DACL
if (!InitializeAcl(
lpNewDacl, // адрес DACL
dwDaclLength, // длина DACL
ACL_REVISION)) // версия DACL
{
dwRetCode = GetLastError();
printf("Lookup account name failed.\n");
printf("Error code: %d\n", dwRetCode);
return dwRetCode;
}
// добавляем нового элемент в новый DACL
if (!AddAccessDeniedAce(
lpNewDacl, // адрес DACL
ACL_REVISION, // версия DACL
FILE_WRITE_ATTRIBUTES, // запрещаем писать атрибуты
lpSid)) // адрес SID
{
dwRetCode = GetLastError();
perror("Add access allowed ace failed.\n");
printf("The last error code: %u\n", dwRetCode);
return dwRetCode;
}
// получаем адрес первого ACE в старом списке DACL
if (!GetAce(
lpOldDacl, // адрес старого DACL
0, // ищем первый элемент
&lpAce)) // адрес первого элемента
{
dwRetCode = GetLastError();
printf("Get ace failed.\n");
printf("Error code: %d\n", dwRetCode);
return dwRetCode;
}
// переписываем элементы из старого DACL в новый DACL
if (bDaclPresent)
{
if (!AddAce(
lpNewDacl, // адрес нового DACL
ACL_REVISION, // версия DACL
MAXDWORD, // добавляем в конец списка
lpAce, // адрес старого DACL
lpOldDacl->AclSize - sizeof(ACL))) // длина старого DACL
{
dwRetCode = GetLastError();
perror("Add access allowed ace failed.\n");
printf("The last error code: %u\n", dwRetCode);
return dwRetCode;
}
}
// проверяем достоверность DACL
if (!IsValidAcl(lpNewDacl))
{
dwRetCode = GetLastError();
perror("The new ACL is invalid.\n");
printf("The last error code: %u\n", dwRetCode);
return dwRetCode;
}
// создаем новый дескриптор безопасности в абсолютной форме
if (!InitializeSecurityDescriptor(
&sdAbsoluteSd, // адрес структуры SD
SECURITY_DESCRIPTOR_REVISION))
{
dwRetCode = GetLastError();
perror("Initialize security descriptor failed.\n");
printf("The last error code: %u\n", dwRetCode);
return dwRetCode;
}
// устанавливаем DACL в новый дескриптор безопасности
if (!SetSecurityDescriptorDacl(
&sdAbsoluteSd, // адрес дескриптора безопасности
TRUE, // DACL присутствует
lpNewDacl, // указатель на DACL
FALSE)) // DACL не задан по умолчанию
{
dwRetCode = GetLastError();
perror("Set security descriptor DACL failed.\n");
printf("The last error code: %u\n", dwRetCode);
return dwRetCode;
}
// проверяем структуру дескриптора безопасности
if (!IsValidSecurityDescriptor(&sdAbsoluteSd))
{
dwRetCode = GetLastError();
perror("Security descriptor is invalid.\n");
printf("The last error code: %u\n", dwRetCode);
return dwRetCode;
}
// устанавливаем новый дескриптор безопасности
if (!SetFileSecurity(
wchDirName, // имя файла
DACL_SECURITY_INFORMATION, // устанавливаем DACL
&sdAbsoluteSd)) // адрес дескриптора безопасности
{
dwRetCode = GetLastError();
printf("Set file security failed.\n");
printf("Error code: %d\n", dwRetCode);
return dwRetCode;
}
// освобождаем память
delete[] lpSd;
delete[] lpSid;
delete[] lpDomainName;
delete[] lpNewDacl;
return 0;
}
