Разработка вспомогательной системной программы в системе программирования Delphi с использованием средств WinApi

Разработка многопоточного приложения, выполняющего обмен данными между двумя процессами и анализ содержимого служебной области системного диска. Описание логической структуры программы, создание программы-инсталлятора, методика и результаты испытаний.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 27.03.2011
Размер файла 4,3 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

procedure WriteDataInMMF(s:string);

procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);

procedure N5Click(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

procedure ToolButton3Click(Sender: TObject);

procedure ToolButton1Click(Sender: TObject);

procedure N8Click(Sender: TObject);

procedure N2Click(Sender: TObject);

private

procedure AppHint(Sender: TObject);

public

HMutex:THandle;

ThreadRec:TThreadReceiver;

HEvent:THandle;

HFileSender:Thandle;

NicName:string;

end;

var

Form1: TForm1;

TxtFile:TextFile;// пременная файла

St:PansiChar;

lincInt:Boolean;

TxtContaningStr:String;

userName:string;

implementation

{$R *.dfm}

//процедура для показа кртких справок

procedure TForm1.AppHint(Sender: TObject);

begin

StatusBar1.SimpleText:=Application.Hint; //для отображения ииформации в панели соостояния

end;

//закрытие всех хендлов в этой копии программы

procedure TForm1.CloseHandles();

begin

CloseHandle(HFileSender);

CloseHandle(HMutex);

CloseHandle(HEvent);

end;

// создание всех необходимых объектов

procedure TForm1.CreateHandles;

begin

// проекция файла

HFileSender:=CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SHARED_MEMORY_SIZE,MMFName);

lincInt:=(GetLastError() <> ERROR_ALREADY_EXISTS);

if HFileSender = 0 then

begin

st:='не удалось создать проекцию файла';

Application.MessageBox(st,'Сообщение...',MB_OK);

exit;

end;

// мьютекс

HMutex:=CreateMutex(nil,false,MutxName);

if HMutex = 0 then

begin

CloseHandle(HFileSender);

st:='не удалось синхронизировать приложение';

Application.MessageBox(st,'Сообщение...',MB_OK);

exit;

end;

// событие

HEvent:=CreateEvent(nil,true,false,EvntName);

if HEvent = 0 then

begin

CloseHandle(HFileSender);

CloseHandle(HMutex);

st:='не удалось осуществить обмен сообщениями';

Application.MessageBox(st,'Сообщение...',MB_OK);

exit;

end;

end;

// отсоединиться

procedure TForm1.Button1Click(Sender: TObject);

begin

ThreadRec.Terminate;

WriteDataInMMF('Пользователь '+NicName+' отключился');

ThreadRec.WaitFor;

ThreadRec.Free;// правильно уничтожаем поток

CloseHandles();

button2.Visible:=true;

button1.Visible:=false;

bitbtn2.Visible:=false;

end;

// загрузить историю переписки

procedure TForm1.N4Click(Sender: TObject);

begin

if OpenDialog1.Execute then

begin

AssignFile(TxtFile,OpenDialog1.FileName);

Reset(TxtFile);

Memo1.Text:=Memo1.Text +'{-----------Загруженная переписка ниже-------------}' + #13#10;

while not eof(TxtFile) do

begin

readln(TxtFile,TxtContaningStr);

Memo1.Text:=Memo1.Text + TxtContaningStr + #13#10;

end;

Memo1.Text:=Memo1.Text +'{-----------Загруженная переписка выше -------------}' + #13#10;

CloseFile(TxtFile);

end;

end;

//процедура записи данных в MMF

procedure TForm1.WriteDataInMMF(s:string);

var

PBaseAdress:Pointer;

begin

WaitForSingleObject(HMutex, INFINITE);

PBaseAdress:=MapViewOfFile(HFileSender,FILE_MAP_WRITE,0,0,Length(s)+4);

if(PBaseAdress = nil) then

begin

CloseHandle(HFileSender);

st:='не удалось передать данные';

Application.MessageBox(st,'Сообщение...',MB_OK);

exit;

end;

begin

integer(PBaseAdress^):=length(s);

CopyMemory(Pointer(Integer(PBaseAdress)+4),PChar(s),length(s));

UnmapViewOfFile(PBaseAdress);

SetEvent(HEvent);

ReleaseMutex(HMutex);

end;

end;

// процедура записи данных в PBaseAdress

procedure TForm1.BitBtn2Click(Sender: TObject);

begin

if Edit1.Text <> '' then

begin

WriteDataInMMF(Nicname+' написал:'+#13#10+string(Edit1.Text));

Edit1.Text:='';

end

else

exit;

end;

// Закрытия формы

procedure TForm1.BitBtn3Click(Sender: TObject);

begin

close;

end;

//создаём хендлы и потоки

procedure TForm1.FormCreate(Sender: TObject);

begin

Memo1.Clear;

// создание потока принимающего данные из файла

ThreadRec:=TThreadReceiver.Create(false);

ThreadRec.Priority:=tpLowest;

CreateHandles();// создаем хендлы

end;

// соединение

procedure TForm1.Button2Click(Sender: TObject);

begin

CreateHandles();

ThreadRec:=TThreadReceiver.Create(false);

button2.Visible:=false;

button1.Visible:=true;

bitbtn2.Visible:=true;

WriteDataInMMF(NicName+' Cоединился!');

end;

// Запрос подтверждения при закрытии формы

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

begin

case messageBox(Handle,'Действительно выйти?','Внимание!', MB_YESNO) of

IDYES:

begin

if Button1.Visible = true then

begin

ThreadRec.Terminate;

WriteDataInMMF('Пользователь '+NicName+' отключился');

ThreadRec.WaitFor;

ThreadRec.Free;

CanClose:=true;

end

else

CanClose:=true;

end;

IDNO: CanClose:=false;

end;

end;

//Сохранить историю переписки

procedure TForm1.N5Click(Sender: TObject);

begin

If SaveDialog1.Execute then

begin

AssignFile(TxtFile,SaveDialog1.FileName);

rewrite(TxtFile);

TxtContaningStr:= Memo1.Text;

Write(TxtFile,TxtContaningStr);

CloseFile(TxtFile);

St:='Файл сохранён';

Application.MessageBox(St,'Сообщение...',MB_OK);

exit;

end

else

begin

St:='файл не сохранён';

Application.MessageBox(St,'Сообщение...',MB_OK);

end;

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin

if Form1.Visible = true then

begin

Application.OnHint:=AppHint;

Timer1.Enabled:=false;

Timer1.Destroy;

end;

end;

procedure TForm1.ToolButton3Click(Sender: TObject);

begin

Application.CreateForm(TForm3, Form3);

Application.ShowMainForm:=false;

Form3.Visible:=true;

end;

procedure TForm1.ToolButton1Click(Sender: TObject);

begin

//вызов справки (основная форма программы)

Application.HelpContext(2);

end;

procedure TForm1.N8Click(Sender: TObject);

begin

Application.HelpCommand(HELP_FINDER,0);

end;

procedure TForm1.N2Click(Sender: TObject);

begin

ShowMessage('Программу подготовил студент группы 742:'+#13#10+'Шипилов Д.А.');

end;

end.

3) Текст модуля Unit2 (Модуль формы «Авторизация»):

unit Unit2;

interface

uses

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

Dialogs, StdCtrls,Unit1, ComCtrls, Buttons;

type

TForm2 = class(TForm)

Button2: TButton;

Edit1: TEdit;

Label1: TLabel;

BitBtn1: TBitBtn;

procedure Button2Click(Sender: TObject);

procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);

procedure BitBtn1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form2: TForm2;

formClose:boolean=false;

implementation

{$R *.dfm}

// закрытие формы

procedure TForm2.Button2Click(Sender: TObject);

begin

close;

end;

// запрос подтверждения при завершении программы из дочерней формы

procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

begin

if formClose = true then

begin

CanClose:=true;

end

else

begin

case messageBox(Handle,'Действительно выйти?','Внимание!', MB_YESNO) of

IDYES:

begin

Application.Terminate;

end;

IDNO: CanClose:=false;

end;

end;

end;

procedure TForm2.BitBtn1Click(Sender: TObject);

var

St:PansiChar;

begin

if Edit1.Text <> '' then

begin

formClose:=true;

Form1.Memo1.Clear;

Form1.NicName:=Edit1.Text;

Form1.WriteDataInMMF('Пользователь '+Form1.NicName+' подключился');

Application.ShowMainForm:=true;

Form1.Visible:=true;

Form2.Close;

end

else

begin

st:='Пожалуйста введите псевдоним для авторизации';

Application.MessageBox(st,'Сообщение...',MB_OK);

exit;

end;

end;

end.

4) Модуль Unit 3 (Модуль формы, осуществляющей работу с носителями информации в системе):

unit Unit3;

interface

uses

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

Dialogs, StdCtrls, FileCtrl, ExtCtrls, Grids, ValEdit,HDDInfo, Buttons,

ComCtrls;

const

IOCTL_DISK_GET_DRIVE_GEOMETRY = $70000;

type

// версия ОС

TWinVersion = (wvUnknown,wv95,wv98,wvME,wvNT3,wvNT4,wvW2K,wvXP,wv2003,wvVista,wv7);

//геометрия

TDiscGeometry = packed record

Cylinders: Int64; // колличество цилиндров

MediaType: DWORD; // тип носителя

TracksPerCylinder: DWORD; // дорожек на цилиндре

SectorsPerTrack: DWORD; // секторов на дорожке

BytesPerSector: DWORD; // байт в секторе

end;

//TForm

TForm3 = class(TForm)

Button1: TButton;

DriveComboBox1: TDriveComboBox;

Panel1: TPanel;

Button2: TButton;

Grid1: TStringGrid;

Button3: TButton;

GroupBox1: TGroupBox;

bpbList: TValueListEditor;

Label1: TLabel;

GroupBox2: TGroupBox;

Disks: TLabel;

BitBtn1: TBitBtn;

GroupBox3: TGroupBox;

Memo1: TMemo;

Grid2: TStringGrid;

Label2: TLabel;

Memo2: TMemo;

Label3: TLabel;

procedure Button1Click(Sender: TObject);

procedure DiscGeometryShow;

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure FormActivate(Sender: TObject); // Result = LoDWORD

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form3: TForm3;

hDrive,hMBRDrive: THandle;

DiscGeometry:TDiscGeometry;

typeOfDisc:string;

implementation

{$R *.dfm}

// определение версии ОС

function DetectWinVersion : TWinVersion;

var

OSVersionInfo : TOSVersionInfo;

begin

Result := wvUnknown; // Неизвестная версия ОС

OSVersionInfo.dwOSVersionInfoSize := sizeof(TOSVersionInfo);

if GetVersionEx(OSVersionInfo)

then

begin

case OSVersionInfo.DwMajorVersion of

3: Result := wvNT3; // Windows NT 3

4: case OSVersionInfo.DwMinorVersion of

0: if OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT

then Result := wvNT4 // Windows NT 4

else Result := wv95; // Windows 95

10: Result := wv98; // Windows 98

90: Result := wvME; // Windows ME

end;

5: case OSVersionInfo.DwMinorVersion of

0: Result := wvW2K; // Windows 2000

1: Result := wvXP; // Windows XP

2: Result := wv2003; // Windows 2003

end;

6: case OSVersionInfo.DwMinorVersion of

0: Result := wvVista; // Windows Vista

1: Result := wv7; // Windows 7

end;

end;

end;

end;

// для вывода версии

function DetectWinVersionStr : string;

const

VersStr : array[TWinVersion] of string = (

'Unknown',

'Windows 95',

'Windows 98',

'Windows ME',

'Windows NT 3',

'Windows NT 4',

'Windows 2000',

'Windows XP',

'Windows 2003',

'Windows Vista',

'Windows Seven');

begin

Result := VersStr[DetectWinVersion];

end;

// для перемещения по диску

function __Mul(a,b: DWORD; var HiDWORD: DWORD):DWORD;

asm

mul edx

mov [ecx],edx

end;

// Чтение сектора жесткго диска(Вызыв когда работа с диском начата)

function ReadSectors(hDrive:Thandle; StartingSector, SectorCount: DWORD;

Buffer: Pointer; BytesPerSector: DWORD): DWORD;

var

br,TmpLo,TmpHi: DWORD;

begin

Result := 0;

TmpLo := __Mul(StartingSector,BytesPerSector,TmpHi);

if SetFilePointer(hDrive,TmpLo,@TmpHi,FILE_BEGIN) = TmpLo then

begin

SectorCount := SectorCount*BytesPerSector;

if ReadFile(hDrive,Buffer^,SectorCount,br,nil) then Result := br;

end;

end;

// вывод геометрии

procedure TForm3.DiscGeometryShow;

begin

Memo1.Clear;

Memo1.Text:='Вы просматриваете логический диск: '+DriveComboBox1.Drive+#13#10;

Memo1.Text:= memo1.Text + 'Количество цилиндров: '+inttoStr(DiscGeometry.Cylinders)+#13#10;

case DiscGeometry.MediaType of

12:typeOfDisc:=' жёсткий диск';

11:typeOfDisc:=' съёмный носитель';

end;

Memo1.Text:= memo1.Text + 'Тип носителя: '+typeOfDisc+#13#10;

Memo1.Text:= memo1.Text + 'Дорожек на цилиндре: '+intToStr(DiscGeometry.TracksPerCylinder)+#13#10;

Memo1.Text:= memo1.Text + 'Секторов на дорожке: '+intToStr(DiscGeometry.SectorsPerTrack)+#13#10;

Memo1.Text:= memo1.Text + 'Байт в секторе: '+intToStr(DiscGeometry.BytesPerSector)+#13#10;

end;

//создаем файл диска/выводим геомертию

//начинаем работу с жёстким диском

procedure TForm3.Button1Click(Sender: TObject);

var

discNameBPB,discNameMBR:string;

junk:Cardinal;

result:boolean;

begin

if hDrive <> 0 then CloseHandle(hDrive);

if hMBRDrive <> 0 then CloseHandle(hMBRDrive);

discNameBPB:='\\.\'+DriveComboBox1.Drive+':';

discNameMBR:='\\.\PHYSICALDRIVE'+intToStr(0);

hMBRDrive:= CreateFile(PChar(discNameMBR),GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,nil,OPEN_EXISTING,0,0);

hDrive:= CreateFile(PChar(discNameBPB),GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,nil,OPEN_EXISTING,0,0);

if (hDrive <> INVALID_HANDLE_VALUE) and (hMBRDrive <> INVALID_HANDLE_VALUE) then

begin

Result := DeviceIoControl(hDrive,IOCTL_DISK_GET_DRIVE_GEOMETRY,nil,0,

@DiscGeometry,SizeOf(TDiscGeometry),junk,nil) and (junk = SizeOf(TDiscGeometry));

DiscGeometryShow();

end

else

begin

ShowMessage('Не возможно создать дескрипторы носителя');

exit;

end;

end;

// Чтение и рашифровка BPB

procedure TForm3.Button2Click(Sender: TObject);

var

i,j,k:integer;

read:Cardinal;

s:string;

buffer: array[1..131072] of byte;

begin

if ReadSectors(hDrive,0,1,@buffer,DiscGeometry.BytesPerSector) = DiscGeometry.BytesPerSector then

begin

for i:= 1 to 16 do

Grid1.Cells[i,0]:=intToHex((i-1),1);

i:=1; j:=1; k:=1;

while k<=DiscGeometry.BytesPerSector do

begin

if i=1 then Grid1.Cells[0,j]:=IntToHex(((j-1)*16+(i-1)),3);

Grid1.Cells[i,j]:=IntToHex(Buffer[k],2);

inc(k);

inc(i);

if i>16 then

begin

i:=1;

j:=j+1;

Grid1.RowCount:= Grid1.RowCount+1;

end;

end;

// расшифровка данных BPB

for i:= 1 to 3 do

s:=s+ intToHex(buffer[i],2);

bpbList.Cells[1,1]:= s + 'h';

s:='';

// чтение имени ОС

for i:= 4 to 4 + 7 do

s:=s+ chr(buffer[i]);

bpbList.Cells[1,2]:= s;

s:='';

//--------------------------

bpbList.Cells[1,3]:=IntToStr(buffer[$C+1] shl 8 + buffer[$C]);

bpbList.Cells[1,4]:=IntToStr(buffer[$C + 2]);

bpbList.Cells[1,5]:=intToStr(buffer[$C + 4] shl 8 + buffer[$C+3]);

bpbList.Cells[1,6]:=intToStr(buffer[$C+5]);

bpbList.Cells[1,7]:=IntToStr(buffer[$F + 4] shl 8 + buffer[$F + 3]);

bpbList.Cells[1,8]:=intToStr(buffer[$F+6] shl 8 + buffer[$F + 5]);

bpbList.Cells[1,9]:=intToHex(buffer [22],2);

if bpbList.Cells[1,9] = 'F8' then bpbList.Cells[1,9]:='Системный носитель инФормации'

else if bpbList.Cells[1,9] = 'FDh' then bpbList.Cells[1,9]:=' накопитель - 2 стороны, 9 секторов'

else if bpbList.Cells[1,9] = 'F9h' then bpbList.Cells[1,9]:=' накопитель - 2 стороны, 9 секторов'

else if bpbList.Cells[1,9] = 'F0h' then bpbList.Cells[1,9]:=' накопитель - 2 стороны, 15 секторов';

bpbList.Cells[1,10]:=intToStr(buffer[$F+9] shl 8 + buffer[$F+8]);

bpbList.Cells[1,11]:=intToStr(buffer[$F+11] shl 8 + buffer[$F+10]);

bpbList.Cells[1,12]:=intToStr(buffer[$F+13] shl 8 + buffer[$F+12]);

bpbList.Cells[1,13]:=intToStr(buffer[$F+17] shl 32 + buffer[$f+16]+ buffer[$f+15]+buffer[$f+14]);

bpbList.Cells[1,14]:=intToStr(buffer[$F + 21] shl 24 + buffer[$F + 20] shl 16 + buffer[$F + 19] shl 8 + buffer[$F + 18]);

bpbList.Cells[1,15]:=intToStr(buffer[$C + 25]);

bpbList.Cells[1,16]:=intToStr(buffer[$F + 23]);

bpbList.Cells[1,17]:=intToStr(buffer[$F + 24]);

bpbList.Cells[1,18]:=intToHex((buffer[$F + 28] shl 24 + buffer[$F + 27] shl 16 + buffer[$F + 26] shl 8 + buffer[$F + 25]),8);

//-----------вывод метки -----------

s:='';

for i:=29 to 40 do

s:=s+chr(buffer[$F+i]);

bpbList.Cells[1,19]:= s;

s:='';

//----------------------------------

//-- чтение ID ОС-------------

for i:= 55 to 62 do

s:=s+ chr(buffer[i]);

bpbList.Cells[1,20]:= s;

s:='';

//----------------------------

end

else

ShowMessage('Не удалось считать блок параметров Bios');

end;

// чтение данных из структуры DriveInfo

procedure TForm3.Button3Click(Sender: TObject);

var

i,j,k:integer;

read:Cardinal;

s:string;

buffer: array[1..131072] of byte;

begin

Memo2.Clear;

if ReadSectors(hMBRDrive,0,1,@buffer,DiscGeometry.BytesPerSector) = DiscGeometry.BytesPerSector then

begin

for i:= 1 to 16 do

Grid2.Cells[i,0]:=intToHex((i-1),1);

i:=1; j:=1; k:=1;

while k<=DiscGeometry.BytesPerSector do

begin

if i=1 then Grid2.Cells[0,j]:=IntToHex(((j-1)*16+(i-1)),3);

Grid2.Cells[i,j]:=IntToHex(Buffer[k],2);

inc(k);

inc(i);

if i>16 then

begin

i:=1;

j:=j+1;

Grid2.RowCount:= Grid2.RowCount+1;

end;

end;

// Расшифровка PartitionTable

// первая часть

Memo2.Text:=Memo2.Text+'Первый элемент таблицы разделов системного диска: '+#13#10;

Memo2.Text:=Memo2.Text+'Признак загрузки: '+intToHex(buffer[$1bf],2)+#13#10;

Memo2.Text:=Memo2.Text+'Начало раздела диска{';

Memo2.Text:=Memo2.Text+'Головка: '+intToStr(buffer[448]);

Memo2.Text:=Memo2.Text+' Сектор: '+intToStr(buffer[449]);

Memo2.Text:=Memo2.Text+' Цилиндр: '+intToStr(buffer[450]);

Memo2.Text:=Memo2.Text+' }'+#13#10;

Memo2.Text:=Memo2.Text+'Тип раздела {';

Memo2.Text:=Memo2.Text+'Ос: '+intToStr(buffer[451]);

Memo2.Text:=Memo2.Text+' }'+#13#10;

Memo2.Text:=Memo2.Text+'Конец раздела диска{';

Memo2.Text:=Memo2.Text+'Головка: '+intToStr(buffer[$1c4]);

Memo2.Text:=Memo2.Text+' Сектор: '+intToStr(buffer[$1c5]);

Memo2.Text:=Memo2.Text+' Цилиндр: '+intToStr(buffer[$1c6]);

Memo2.Text:=Memo2.Text+' }'+#13#10;

Memo2.Text:=Memo2.Text+'Номер Сектора {';

Memo2.Text:=Memo2.Text+': '+intToStr(buffer[458]shl 32+buffer[457]+buffer[456]+buffer[455]);

Memo2.Text:=Memo2.Text+' }'+#13#10;

Memo2.Text:=Memo2.Text+'Размер раздела {';

Memo2.Text:=Memo2.Text+': '+intToStr(buffer[462]shl 24 +buffer[461] shl 16 +buffer[460]shl 8+buffer[459]);

Memo2.Text:=Memo2.Text+' }'+#13#10+#13#10+#13#10;

//вторая часть

Memo2.Text:=Memo2.Text+'Второй элемент таблицы разделов системного диска: '+#13#10;

Memo2.Text:=Memo2.Text+'Признак загрузки: '+intToHex(buffer[$1CF],2)+#13#10;

Memo2.Text:=Memo2.Text+'Начало раздела диска{';

Memo2.Text:=Memo2.Text+'Головка: '+intToStr(buffer[465]);

Memo2.Text:=Memo2.Text+' Сектор: '+intToStr(buffer[466]);

Memo2.Text:=Memo2.Text+' Цилиндр: '+intToStr(buffer[467]);

Memo2.Text:=Memo2.Text+' }'+#13#10;

Memo2.Text:=Memo2.Text+'Тип раздела {';

Memo2.Text:=Memo2.Text+'Ос: '+intToStr(buffer[468]);

Memo2.Text:=Memo2.Text+' }'+#13#10;

Memo2.Text:=Memo2.Text+'Конец раздела диска{';

Memo2.Text:=Memo2.Text+'Головка: '+intToStr(buffer[469]);

Memo2.Text:=Memo2.Text+' Сектор: '+intToStr(buffer[470]);

Memo2.Text:=Memo2.Text+' Цилиндр: '+intToStr(buffer[471]);

Memo2.Text:=Memo2.Text+' }'+#13#10;

Memo2.Text:=Memo2.Text+'Номер Сектора {';

Memo2.Text:=Memo2.Text+': '+intToStr(buffer[$1D7+3]shl 24+buffer[$1D7+2] shl 16+buffer[$1D7+1]shl 8 +buffer[$1D7]);

Memo2.Text:=Memo2.Text+' }'+#13#10;

Memo2.Text:=Memo2.Text+'Размер раздела {';

Memo2.Text:=Memo2.Text+': '+intToStr(buffer[$1db+3]shl 24 +buffer[$11db+2] shl 16 +buffer[$1db+1]shl 8+buffer[$1db]);

Memo2.Text:=Memo2.Text+' }'+#13#10+#13#10+#13#10;

end

else

ShowMessage('Не удалось считать PartitionTable');

end;

// получение инфо о нужных дисках

procedure TForm3.FormActivate(Sender: TObject);

var

S,SOut : String;

i:Integer;

VolumeName,FileSystemName,NewDiscNumber : String;

MaxComponentLength,FileSystemFlags:LongWord;

// от переменной VolumeSerialNo : DWord;

begin

S:=GetDisks(DiskHDD); {Получаем список Жёстких дисков (Параметр DiskHDD)}

s:=s+GetDisks(DiskFDD);

s:=s+GetDisks(DiskNet);

s:=s+GetDisks(DiskCDROM);

s:=s+GetDisks(DiskRAM);

SOut:='';

For i:=1 to Length(S) do {Получаем информацию о всех дисках и пишем в TLabel на форме}

begin

{Если диск существует/вставлен ...}

if GetHDDInfo(S[I], VolumeName, FileSystemName,NewDiscNumber,

MaxComponentLength, FileSystemFlags) then {... тогда собираем информацию}

SOut:=SOut+

'Диск: '+S[I]+#13#10+

'Метка: '+VolumeName+#13#10+

'Файловая система: '+FileSystemName+#13+#10+

'Серийный номер: '+NewDiscNumber+#13+#10+

'Макс. длина имени файла: '+IntToStr(MaxComponentLength)+#13+#10+

'Flags: '+IntToHex(FileSystemFlags,4)+#13#10+#13#10;

end;

Disks.Caption:=SOut; {Выводим в компонент TLabel полученные данные о дисках}

end;

end.

5) Модуль ThrdRcvr (модуль описывающий работу потока - приёмника сообщений):

unit ThrdRcvr; // принимающий поток

interface

uses

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

Dialogs,StdCtrls, Buttons, Menus, ComCtrls, ActnMan, ActnColorMaps;

type

TThreadReceiver = class(TThread)

private

PBaseAdress:PChar;

TextString:String;

nlineSize:integer;

protected

procedure Execute; override;

public

end;

implementation

uses

Unit1;

// Считываем соержимое из проекции файла в Memo1

procedure TThreadReceiver.Execute;

begin

while (not terminated) do

begin

WaitForSingleObject(Form1.HEvent, INFINITE);

ResetEvent(Form1.HEvent);

try

// резерв. память в потоке для этотой проекции

PBaseAdress:=MapViewOfFile(Form1.HFileSender, FILE_MAP_READ,0,0,65536);

if (PBaseAdress = nil) then

begin

CloseHandle(Form1.HFileSender);

st:='не удалось отобразить файл на адресное пространство';

Application.MessageBox(st,'Сообщение...',MB_OK);

form1.BitBtn2.Visible:=false;

form1.Button1.Visible:=false;

exit;

end;

nlineSize:=integer(PBaseAdress^);

SetLength(TextString,nlineSize);

CopyMemory(PChar(TextString),Pointer(Integer(PBaseAdress)+4),nlineSize);

Form1.Memo1.Text:=Form1.Memo1.Text+'---------'+#13#10;

Form1.Memo1.Text:=Form1.Memo1.Text+TextString+#13#10;

sendmessage(Form1.memo1.handle, em_linescroll, 0, Form1.memo1.lines.count-1);

UnmapViewOfFile(PBaseAdress);

finally

end;

end;

end;

end.

6) Модуль HDDInfo (модуль получающий информацию о жёстких дисках):

unit HDDInfo;

interface

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

Dialogs, StdCtrls, FileCtrl, ExtCtrls, Grids, ValEdit;

const {Константы для TypeOfDisk функции GetDisks}DiskUnknown=0; {Неизвестные диски}

DiskNone=1; {Отсутствующие диски}

DiskFDD=DRIVE_REMOVABLE; {Съёмные диски, дискеты}

DiskHDD=DRIVE_FIXED; {Не съёиные диски, жёсткие диски}

DiskNet=DRIVE_REMOTE; {Сетевые диски}

DiskCDROM=DRIVE_CDROM; {CD ROM}

DiskRAM=DRIVE_RAMDISK; {Диски в ОЗУ}

function GetDisks(TypeOfDisk : Word) : String;

function GetHDDInfo(Disk : Char;Var VolumeName, FileSystemName,NewDiscNumber : String;

MaxComponentLength, FileSystemFlags:LongWord) : Boolean;

implementation

//получить имена доступных дисков

function GetDisks(TypeOfDisk : Word) : String;{Получить имена нужных дисков}

var

DriveArray : array[1..26] of Char;

i:integer;

beginDriveArray:='ABCDEFGHIJKLMNOPQRSTUVWXYZ';

for i:= 1 to 26 do

if GetDriveType(PChar(DriveArray[I]+':\')) = TypeOfDisk then

Result := Result+DriveArray[I];

end;

// определение правильного серийного номера диска

function GetReplaceCDNumber(num: String): String;

var

i, len: Integer;

begin

Result:= '';

len:= Length(num);

if len <> 8 then exit;

for i:= 1 to (len div 2) do begin

Dec(len);

Result:= Result + num[len];

Result:= Result + num[len+1];

Dec(len);

end;

end;

// получить инфо о дисках с нужными именами

function GetHDDInfo(Disk : Char;Var VolumeName, FileSystemName,NewDiscNumber : String;

MaxComponentLength, FileSystemFlags:LongWord) : Boolean;

var

_VolumeName,_FileSystemName:array [0..MAX_PATH-1] of Char;

_VolumeSerialNo,_MaxComponentLength,_FileSystemFlags:LongWord;

_NewDiscNumber:string;

begin

if GetVolumeInformation(PChar(Disk+':\'),_VolumeName,MAX_PATH,@_VolumeSerialNo,

_MaxComponentLength,_FileSystemFlags,_FileSystemName,MAX_PATH) then

begin

NewDiscNumber:=IntToHex(integer(_VolumeSerialNo),8);

NewDiscNumber:=GetReplaceCDNumber(NewDiscNumber);

VolumeName:=_VolumeName;

MaxComponentLength:=_MaxComponentLength;

FileSystemFlags:=_FileSystemFlags;

FileSystemName:=_FileSystemName;

Result:=True;

end

else

Result:=False;

end;

end.

Список литературы:

1) М. Фленов «Библия Delphi»

2) А. Танцер «Синхронизация процессов при работе с Windows»

3) Сайт CitForum > http://citforum.ru/programming/delphi/disk_editor/ </

4)Cайт Delphi-Faq > http://delphi-faq.zoxt.net/a79.htm <.

5) Cайт DelphiSource.

Размещено на Allbest.ru


Подобные документы

  • Изучение основ программирования и создание полноценного приложения в среде программирования Delphi. Разработка эскизного и технического проектов программы. Внедрение выполнения программы. Разработка рабочего проекта, спецификация и текст программы.

    курсовая работа [560,1 K], добавлен 18.07.2012

  • Разработка приложения на WinAPI с реализацией логической структуры в игре "Сапер". Реализация графической части приложения. Проверка на корректность поведения интерфейса программы, работы логической части игры, корректности записи и чтения файла.

    курсовая работа [1,1 M], добавлен 17.10.2012

  • Разработка программы обработки типизированных файлов с кодом на языке Object Pascal, с использованием компонентов Delphi для ввода и вывода данных. Разработка экранных форм и алгоритма программы. Описание программных модулей и инструкция оператору.

    курсовая работа [1,5 M], добавлен 08.02.2011

  • Характеристика системы программирования. Главные составные части Delphi. Интерфейс программного приложения. Результаты работы программы. Руководство системного программиста и оператора. Язык программирования Delphi, среда компилятора Borland 7.0.

    курсовая работа [1,6 M], добавлен 29.05.2013

  • Особенности разработки приложений для операционной системы с помощью императивного, структурированного, объектно-ориентированного языка программирования Delphi. Формальное начало программы. Выделение конца программного блока. Листинг и описание программы.

    курсовая работа [1,2 M], добавлен 04.08.2014

  • Анализ возможных подходов к созданию web-приложения с использованием программирования Java и CGI. Разработка структуры базы данных и реализация полученной модели в рамках СУБД. Обеспечение диалога CGI-программы с пользователем, используя браузер.

    курсовая работа [310,9 K], добавлен 07.08.2011

  • Создание программы "MP3 Player", воспроизводящей аудио файлы формата MP3 для работы в операционной системе Windows с использованием языка программирования Delphi. Разработка интерфейса, алгоритма и документации к разработанному программному продукту.

    курсовая работа [625,0 K], добавлен 18.07.2012

  • Общие сведения о языке ассемблера. Назначение команды прерывания INT число. Описание логической структуры программы: алгоритм работы, используемые методы, входные и выходные данные. Структура и тестирование программы. Руководство оператора программы.

    курсовая работа [90,0 K], добавлен 01.12.2009

  • Функции компилятора как системной обрабатывающей программы. Этапы компиляции: анализ и синтез. Разработка лексического анализатора. Алгоритм и программа лексического анализа. Реализация двухфазного компилятора. Описание логической структуры программы.

    курсовая работа [310,4 K], добавлен 26.03.2010

  • Средства Delphi для разработки Windows приложений. Математическая формулировка задачи, описание программы вычисления определенного интеграла по формуле левых прямоугольников. Руководство пользователя, методика испытаний продукта. Листинг программы.

    курсовая работа [178,1 K], добавлен 14.11.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.