Главная страница
Навигация по странице:

  • 2.2. Задание для выполнения к части 1 лабораторной работы

  • 3.2.2. Разработать и выполнить приложение Delphi , в котором

  • Задание для выполнения к части 3 лабораторной работы

  • Создание приложений Windows с использованием средств интерфейса прикладного программирования Win API. Отчет о лабораторной работе по операционным системам 8


    Скачать 264.47 Kb.
    НазваниеОтчет о лабораторной работе по операционным системам 8
    АнкорСоздание приложений Windows с использованием средств интерфейса прикладного программирования Win API
    Дата26.02.2023
    Размер264.47 Kb.
    Формат файлаdocx
    Имя файлаLR8 (1).docx
    ТипОтчет
    #956541

    Министерство науки и высшего образования Российской Федерации

    Федеральное государственное бюджетное образовательное

    учреждение высшего образования

    «Рязанский государственный радиотехнический университет имени

    В.Ф. Уткина»
    Кафедра «Информационная безопасность»

    Отчет

    О лабораторной работе по операционным системам №8

    «Создание приложений Windows с использованием средств

    интерфейса прикладного программирования Win API »

    Выполнил:

    Студент гр. 042

    Ерохин П.Е.

    Проверил:

    доц. Засорин С.В., ст. пр. Дудко И.С.

    Рязань 2022


    2.2. Задание для выполнения к части 1 лабораторной работы


    Разработать приложение Windows, выполняющее следующие файловые операции:

    2.2.1. На текущем диске в текущем каталоге создать каталожную структуру, которая использовалась в лабораторной работе № 2.

    2.2.2. В текущем каталоге S1 создать файл с именем file1.txt и записать в него строку 'Текстовая строка'. (Рис. 1.1 и Рис. 1.2)



    Рис. 1.1 Каталожная структура



    Рис. 1.2 Содержимое файла ‘file1.txt’
    2.2.3. Прочитать содержимое файла file1.txt в память и вывести его на экран
    (Рис. 2).



    Рис. 2 Содержимое файла ‘file1.txt’ в байтовом представлении

    2.2.4. Прочитать 8 байт из файла file1.txt, начиная с байта 5, и вывести их на экран (Рис. 3).



    Рис. 3

    2.2.5. Добавить к концу файла file1.txt символьную строку 'Дополнительная строка' и вывести содержимое файла на экран (Рис. 4).
    Рис. 4.1 Содержимое файла



    Рис.4.2 Записанная в файле строка

    2.2.6. Установить для файла file1.txt атрибуты "только чтение" и "скрытый"
    (Рис. 5.1).


    Рис. 5 Установка атрибутов «Скрытый» и «Только чтение»


    2.2.7. Снять с файла file1.txt атрибут "скрытый" и изменить дату и время.

    (Рис. 6.1,6.2,6.3)



    Рис. 6.1 Снятие атрибута «Скрытый»



    Рис.6.2 Выбор даты и времени



    Рис.6.3 результат изменения


    2.2.8. Переименовать файл file1.txt в текущем каталоге, дав ему имя file2.txt

    (Рис. 7).



    Рис. 7 Переименование файла
    2.2.9. Переслать файл file2.txt из текущего каталога в подкаталог S2 и скопировать в S3. Прочитать содержимое S1, S2, S3 и отобразить его на экране.



    Рис. 8.1 Содержимое каталога S1


    Рис. 8.2 Содержимое каталога S2



    Рис. 8.3 Содержимое каталога S3

    2.2.10. Создать в корневом каталоге диска запись с меткой тома 'LABEL'.



    Рис. 8.4

    2.2.11. Найти в корневом каталоге диска запись с меткой тома и убедиться, что метка совпадает с заданной в п.2.2.10.

    2.2.12. Средствами операционной системы изменить метку диска и проверить работу программы. Затем стереть метку и снова проверить выполнение программы (Рис. 9.1 и 9.2)



    Рис. 9.1 Измененная метка диска E:



    Рис. 9.2 Результат перепроверки выполнения работы программы

    Программный код.

    unit Unit8;

    interface

    uses

    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

    Dialogs, StdCtrls;

    type

    TForm1 = class(TForm)

    Button1: TButton;

    Button2: TButton;

    Button3: TButton;

    Button4: TButton;

    Button5: TButton;

    Button6: TButton;

    Button7: TButton;

    Button8: TButton;

    Button9: TButton;

    Button10: TButton;

    Button11: TButton;

    Label1: TLabel;

    Label2: TLabel;

    DateTimePicker1: TDateTimePicker;

    DateTimePicker2: TDateTimePicker;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure Button3Click(Sender: TObject);

    procedure Button4Click(Sender: TObject);

    procedure Button5Click(Sender: TObject);

    procedure Button6Click(Sender: TObject);

    procedure Button7Click(Sender: TObject);

    procedure Button8Click(Sender: TObject);

    procedure Button9Click(Sender: TObject);

    procedure Button10Click(Sender: TObject);

    procedure Button11Click(Sender: TObject);

    function SetFileTime(handle:longint; var cTime, laTime, lwTime: FILETIME):longint; stdcall;

    private

    { Private declarations }

    public

    { Public declarations }

    end;

    var

    Form1: TForm1;

    implementation

    {$R *.dfm}

    // 2.2.1

    procedure TForm1.Button1Click(Sender: TObject);

    begin

    CreateDirectory('E:\OS\LR8\S1', nil);

    CreateDirectory('E:\OS\LR8\S1\S2', nil);

    CreateDirectory('E:\OS\LR8\S1\S2\S3', nil);

    CreateDirectory('E:\OS\LR8\S1\S2\S3\S4', nil);

    CreateDirectory('E:\OS\LR8\S1\S2\S3\S5', nil);

    CreateDirectory('E:\OS\LR8\S1\S2\S3\S6', nil);

    Button1.Enabled:= False;

    end;

    // 2.2.2

    procedure TForm1.Button2Click(Sender: TObject);

    var

    MyFile: hFile;

    ReOpenBuff: TOFStruct;

    buffer: string;

    count: integer;

    begin

    // Создание файла

    MyFile:= OpenFile(

    'E:\OS\LR8\S1\file1.txt',

    ReOpenBuff,

    OF_CREATE

    );

    // Запись текстовой строки

    buffer:= 'Текстовая строка';

    count:= length(buffer);

    _lwrite(MyFile, @buffer[1], count);

    _lclose(MyFile);

    Button2.Enabled:= False;

    end;

    // 2.2.3

    procedure TForm1.Button3Click(Sender: TObject);

    var

    MyFile: hFile;

    buff: array[0..255] of char;

    dwBytesRead: DWORD;

    data: string;

    i: integer;

    begin

    // Открываем файл

    MyFile:= _lopen(

    'E:\OS\LR8\S1\file1.txt',

    OF_READWRITE

    );

    // читаем содержимое файла

    ReadFile(MyFile, buff, 256, dwBytesRead, nil);

    //ShowMessage(buff);

    _lclose(MyFile);

    // Отображение содержимого на экране

    data:= IntToHex(Ord(buff[0]), 2);

    for i:= 1 to 255 do begin

    data:= data + ' ' + IntToHex(ord(buff[i]), 2)

    end;

    ShowMessage(data);

    button3.Enabled:= false;

    end;

    // 2.2.4

    procedure TForm1.Button4Click(Sender: TObject);

    var

    MyFile: hFile;

    dwPos: DWORD;

    buff: array[0..7] of char;

    dwBytesRead: DWORD;

    data: string;

    i: integer;

    begin

    // Открытие файла

    MyFile:= _lopen(

    'E:\OS\LR8\S1\file1.txt',

    OF_READWRITE

    );

    // Позиционирование на 5 байт

    dwPos:= SetFilePointer(MyFile, 5, nil, FILE_BEGIN);

    // Чтение

    ReadFile(MyFile, buff, 8, dwBytesRead, nil);

    _lclose(MyFile);

    // Вывод на экран

    data:= IntToHex(Ord(buff[i]), 2);

    for i:= 1 to 7 do begin

    data:= data + ' ' + IntToHex(Ord(buff[i]), 2);

    end;

    ShowMessage(data);

    ShowMessage(buff);

    button4.Enabled:= false;

    end;

    // 2.2.5

    procedure TForm1.Button5Click(Sender: TObject);

    var

    MyFile: hFile;

    buffer: string;

    count: integer;

    dwPos: DWORD;

    dwBytesRead: DWORD;

    buff: array[0..50] of char;

    data: string;

    i: integer;

    begin

    MyFile:= _lopen(

    'E:\OS\LR8\S1\file1.txt',

    OF_READWRITE

    );

    // Позиционирование на конец файла

    dwPos:= SetFilePointer(MyFile, 0, nil, FILE_END);

    LockFile(MyFile, dwPos, 0, dwPos + dwBytesRead, 0);

    // Запись текстовой строки

    buffer:= 'Дополнительная строка';

    count:= length(buffer);

    _lwrite(MyFile, @buffer[1], count);

    UnlockFile(MyFile, dwPos, 0, dwPos + dwBytesRead, 0);

    // Чтение

    dwPos:= SetFilePointer(MyFile, 0, nil, FILE_BEGIN);

    ReadFile(MyFile, buff, 51, dwBytesRead, nil);

    _lclose(MyFile);

    data:= IntToHex(Ord(buff[0]), 2);

    for i:= 1 to 50 do begin

    data:= data + ' ' + IntToHex(Ord(buff[i]), 2);

    end;

    ShowMessage(data);

    //ShowMessage(buff);

    button5.Enabled:= false;

    end;

    // 2.2.6

    procedure TForm1.Button6Click(Sender: TObject);

    var

    MyFile: hFIle;

    begin

    MyFile:= _lopen(

    'E:\OS\LR8\S1\file1.txt',

    OF_READWRITE

    );

    SetFileAttributes(

    'E:\OS\LR8\S1\file1.txt',

    FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_READONLY

    );

    _lclose(MyFile);

    button6.Enabled:= false;

    end;

    { Функция замены времени создания (Дополнение к заданию 2.2.7) }

    function SetFileDateTime(FileName: string; NewDateTime: TDateTime): Boolean;

    var

    FileHandle: integer;

    FileTime: TFileTime;

    LFT: TFileTime;

    LST: TSystemTime;

    begin

    Result := False;

    try

    DecodeDate(NewDateTime, LST.wYear, LST.wMonth, LST.wDay);

    DecodeTime(NewDateTime, LST.wHour, LST.wMinute, LST.wSecond, LST.wMilliSeconds);

    if SystemTimeToFileTime(LST, LFT) then

    begin

    if LocalFileTimeToFileTime(LFT, FileTime) then

    begin

    FileHandle := FileOpen(FileName, fmOpenReadWrite or

    fmShareExclusive);

    if SetFileTime(FileHandle, nil, nil, @FileTime) then

    Result := True;

    end;

    end;

    finally

    FileClose(FileHandle);

    end;

    end;

    // 2.2.7

    procedure TForm1.Button7Click(Sender: TObject);

    var

    MyFile: hFile;

    begin

    MyFile:= _lopen(

    'E:\OS\LR8\S1\file1.txt',

    OF_READWRITE

    );

    SetFileAttributes(

    'E:\OS\LR8\S1\file1.txt',

    FILE_ATTRIBUTE_READONLY

    );

    _lclose(MyFile);

    { Изменение даты и времени создания файла }

    { Связываем время элемента, в котором указали дату, со вторым элементом, в котором указали время }

    DateTimePicker1.Time := DateTimePicker2.Time;

    { Меняем дату создания файла }

    if SetFileDateTime('E:\OS\LR8\S1\file1.txt', DateTimePicker1.DateTime) then

    ShowMessage('Дата и время создания файла: file1.txt изменены на пользовательские!')

    else

    ShowMessage('Файл: file1.txt защищен от изменений!');

    end;

    // 2.2.8

    procedure TForm1.Button8Click(Sender: TObject);

    var

    MyFile: hFile;

    buff: array[0..50] of char;

    dwBytesRead: DWORD;

    begin

    RenameFile(

    'E:\OS\LR8\S1\file1.txt',

    'E:\OS\LR8\S1\file2.txt'

    );

    button8.enabled:= false;

    end;

    // 2.2.9

    procedure TForm1.Button9Click(Sender: TObject);

    var

    MyFile: hfile;

    buff: array[0..511] of char;

    dwBytesRead: DWORD;

    dwPos: DWORD;

    data: string;

    i: integer;

    isFailed: bool;

    begin

    // Пересылка файла из S1 в S2

    MoveFile(

    'E:\OS\LR8\S1\file2.txt',

    'E:\OS\LR8\S1\S2\file2.txt'

    );

    CopyFile(

    'E:\OS\LR8\S1\S2\file2.txt',

    'E:\OS\LR8\S1\S2\S3\file2.txt',

    isFailed

    );

    // Чтение содержимого S1, S2, S3

    // S1

    MyFile:= _lopen(

    'E:\OS\LR8\S1',

    OF_READWRITE

    );

    ReadFile(MyFile, buff, 512, dwBytesRead, nil);

    // Отображение

    data:= 'Содержимое S1:' + #10#13 + IntToHex(Ord(buff[0]), 2);

    for i:= 1 to 511 do begin

    data:= data + ' ' + IntToHex(Ord(buff[i]), 2);

    end;

    ShowMessage(data);

    _lclose(MyFile);

    // S2

    MyFile:= _lopen(

    'E:\OS\LR8\S1\S2',

    OF_READWRITE

    );

    ReadFile(MyFile, buff, 512, dwBytesRead, nil);

    // Отображение

    data:= 'Содержимое S2:' + #10#13 + IntToHex(Ord(buff[0]), 2);

    for i:= 1 to 511 do begin

    data:= data + ' ' + IntToHex(Ord(buff[0]), 2);

    end;

    ShowMessage(data);

    _lclose(MyFile);

    // S3

    MyFile:= _lopen(

    'E:\OS\LR8\S1\S2\S3',

    OF_READWRITE

    );

    ReadFile(MyFile, buff, 512, dwBytesRead, nil);

    // Отображение

    data:= 'Содержимое S3:' + #10#13 + IntToHex(Ord(buff[0]), 2);

    for i:= 1 to 511 do begin

    data:= data + ' ' + IntToHex(Ord(buff[0]), 2);

    end;

    ShowMessage(data);

    _lclose(MyFile);

    button9.Enabled:= false;

    end;

    // 2.2.10

    procedure TForm1.Button10Click(Sender: TObject);

    begin

    SetVolumeLabel('E:\' + #0, 'LABEL');

    button10.Enabled:= false;

    end;

    procedure TForm1.Button11Click(Sender: TObject);

    var

    VolumeName,

    FileSystemName : array [0..MAX_PATH-1] of Char;

    VolumeSerialNo : DWord;

    MaxComponentLength,FileSystemFlags: Cardinal;

    volume: string[5];

    i: integer;

    begin

    // Получение информации о диске

    GetVolumeInformation('E:\', VolumeName, MAX_PATH, @VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, MAX_PATH);

    // Чтение метки диска

    volume:='';

    for i := 0 to 4 do

    volume:=volume+VolumeName[i];

    // Проверка на совпадение заданной и измененной метки диска

    if volume = 'LABEL' then

    ShowMessage('Метка диска успешно изменена!')

    else

    ShowMessage('Метка диска не изменена.');

    button11.Enabled := false;

    end;

    end.

    3.2.2. Разработать и выполнить приложение Delphi, в котором:

    с помощью функции GetSystemInfo() получить основную системную информацию об используемой ОС (Рис. 10.1):



    Рис. 10.1

    с помощью функции GlobalMemoryStatus() проанализировать текущее состояние адресного пространства (Рис. 10.2):



    Рис. 10.2

    с помощью функции VirtualQuery() получить детальную информацию о состоянии виртуального адресного пространства (Рис. 10.3):



    Рис. 10.3

    Программный код.

    unit Unit1;

    interface

    uses

    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

    Dialogs, StdCtrls;

    const

    Sproc = 'Архитектура процессора %s';

    SPIntel = 'Intel';

    SpageSize = 'Размер страницы $%.8x байт';

    SminAddr = 'Минимальный адрес приложения $%p';

    SmaxAddr = 'Минимальный адрес приложения $%p';

    SnumProcs= 'Количество процессоров %d';

    SallocGra = 'Детализация распределения $%.8x байт';

    SProcLev1 = 'Уровень процессора %s';

    SIntel3 = '80386';

    SIntel4 = '80486';

    SIntel5 = 'Pentium';

    SIntel6 = 'Pentium Pro';

    SprocRev = 'Версия процессора %.4x';

    SmemUse = 'Используемая память %d%%';

    StotMem = 'Общая физическая память $%.8x байт';

    SfreeMem = 'Свободная физическая память $%.8x байт';

    StotPage = 'Общая память файла подкачки $%.8x байт';

    SfreePage = 'Свободная память для файла подкачки $%.8x байт';

    StotVirt = 'Общая виртуальная память $%.8x байт';

    SfreeVirt = 'Свободная виртуальная память $%.8x байт';

    type

    TForm1 = class(TForm)

    Button1: TButton;

    Memo1: TMemo;

    Button2: TButton;

    Button3: TButton;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure Button3Click(Sender: TObject);

    private

    { Private declarations }

    public

    { Public declarations }

    end;

    var

    Form1: TForm1;

    ms: TMemoryStatus;

    si: SYSTEM_INFO;

    lpBuffer: TMemoryBasicInformation;

    implementation

    {$R *.dfm}

    // Процедура получения системной информации

    procedure TForm1.Button1Click(Sender: TObject);

    begin

    GetSystemInfo(si);

    Memo1.Lines.Clear();

    // Заполнение полей с системной информацией

    Memo1.Lines.Add(Format(SProc, [SPIntel]));

    Memo1.Lines.Add(Format(SPageSize, [si.dwPageSize]));

    Memo1.Lines.Add(Format(SMinAddr, [si.lpMinimumApplicationAddress]));

    Memo1.Lines.Add(Format(SMaxAddr, [si.lpMaximumApplicationAddress]));

    Memo1.Lines.Add(Format(SNumProcs, [si.dwNumberOfProcessors]));

    Memo1.Lines.Add(Format(SAllocGra, [si.dwAllocationGranularity]));

    case si.wProcessorLevel of

    3: Memo1.Lines.Add(Format(SProcLev1, [SIntel3]));

    4: Memo1.Lines.Add(Format(SProcLev1, [SIntel4]));

    5: Memo1.Lines.Add(Format(SProcLev1, [SIntel5]));

    6: Memo1.Lines.Add(Format(SProcLev1, [SIntel6]));

    else Memo1.Lines.Add(Format(SProcLev1, [IntToStr (si.wProcessorLevel)]));

    end;

    end;

    // Процедура определения текущего состояния памяти

    procedure TForm1.Button2Click(Sender: TObject);

    begin

    ms.dwLength:= SizeOf(ms);

    GlobalMemoryStatus(ms);

    Memo1.Lines.Clear();

    // Заполнение полей информацией о состоянии памяти

    Memo1.Lines.Add(Format(SMemUse, [ms.dwMemoryLoad]));

    Memo1.Lines.Add(Format(STotMem, [ms.dwTotalPhys]));

    Memo1.Lines.Add(Format(SFreeMem, [ms.dwAvailPhys]));

    Memo1.Lines.Add(Format(STotPage, [ms.dwTotalPageFile]));

    Memo1.Lines.Add(Format(SFreePage, [ms.dwAvailPageFile]));

    Memo1.Lines.Add(Format(STotVirt, [ms.dwTotalVirtual]));

    Memo1.Lines.Add(Format(SFreeVirt, [ms.dwAvailVirtual]));

    end;

    // Процедура получения детальной информации о состоянии

    // виртуального адресного пространства

    procedure TForm1.Button3Click(Sender: TObject);

    begin

    VirtualQuery(si.lpMinimumApplicationAddress, lpBuffer, ms.dwTotalVirtual);

    Memo1.Lines.Clear();

    // Заполнение полей

    Memo1.Lines.Add('Атрибут защиты: ' + IntToHex(lpbuffer.AllocationProtect, 8));

    Memo1.Lines.Add('Суммарный размер группы страниц: ' + IntToHex(lpbuffer.RegionSize, 8));

    Memo1.Lines.Add('Состояние страниц: ' + IntToHex(lpbuffer.State, 8));

    Memo1.Lines.Add('Защита страниц: ' + IntToHex(lpbuffer.Protect, 8));

    Memo1.Lines.Add('Тип физической памяти: ' + IntToHex(lpbuffer.Type_9, 8));

    end;

    end.

    Задание для выполнения к части 3 лабораторной работы

    Для приведенного примера изучите текст основной процедуры, разработайте форму и выполните соответствующее приложение (Рис. 11).


    Рис. 11

    Программный код.

    unit Unit1;
    interface
    uses

    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

    Dialogs, StdCtrls, ExtCtrls;
    type

    TForm1 = class(TForm)

    Timer1: TTimer;

    ListBox1: TListBox;

    Label1: TLabel;

    procedure Timer1Timer(Sender: TObject);

    private

    { Private declarations }

    public

    { Public declarations }

    end;
    var

    Form1: TForm1;
    implementation
    {$R *.dfm}
    procedure TForm1.Timer1Timer(Sender: TObject);

    const

    PredefinedClipboardNames: array[1..17] of string =

    ('CF_TEXT', 'CF_BITMAP', 'CF_METAFILEPICT', 'CF_SYLK', 'CF_DIF',

    'CF_TIFF', 'CF_OEMTEXT', 'CF_DIB', 'CF_PALETTE',

    'CF_PENDATA', 'CF_RIFF', 'CF_WAVE', 'CF_UNICODETEXT',

    'CF_ENHMETAFILE', 'CF_HDROP', 'CF_LOCALE',

    'CF_MAX');

    var

    FormatID: UINT;

    FormatName: array[0..255] of char;

    Len: Integer;

    begin

    // очищаю окно выхода

    // ListBox1.Items.Clear();

    // Кол-во поддерживаемых форматов БО

    Label1.Caption:=

    'Всего форматов доступно: ' + IntToStr(CountClipboardFormats);

    OpenClipboard(0);

    // Читаю первый формат БО

    FormatID:= EnumClipboardFormats(0);

    CloseClipboard;

    while (FormatID <> 0) do begin

    Len:= GetClipboardFormatName(FormatID, FormatName, 255);

    if Len = 0 then begin

    ListBox1.Items.Add(PredefinedClipboardNames[FormatID] +

    '(Предопределенный)' + '[' + IntToStr(FormatId) + ']');

    end else begin

    ListBox1.Items.Add('FormatID: [' + IntToStr(FormatID) + ']');

    FormatID:= EnumClipboardFormats(FormatID);

    end;

    end;

    CloseClipboard;

    end;
    end.


    написать администратору сайта