Code:

unit Unit1;

{©Drkb v.3}

 

interface

 

uses

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

Dialogs, StdCtrls;

 

type

TForm1 = class(TForm)

   Memo1: TMemo;

   Button1: TButton;

   procedure Button1Click(Sender: TObject);

end;

 

var

Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

procedure TForm1.Button1Click(Sender: TObject);

const

NameSize = 4;

VolumeCount = 26;

TotalSize = NameSize * VolumeCount;

Report = 'Volume: %s %s';

var

Buff, Volume: String;

lpQuery: array [0..MAXCHAR - 1] of Char;

I, Count: Integer;

begin

SetLength(Buff, TotalSize);

Count := GetLogicalDriveStrings(TotalSize, @Buff[1]) div NameSize;

if Count = 0 then

   Memo1.Lines.Add(SysErrorMessage(GetLastError))

else

   for I := 0 to Count - 1 do

   begin

     Volume := PChar(@Buff[(I * NameSize) + 1]);

     case GetDriveType(PChar(Volume)) of

       DRIVE_UNKNOWN: Memo1.Lines.Add(Format(Report, [Volume,

         'The drive type cannot be determined.']));

       DRIVE_NO_ROOT_DIR: Memo1.Lines.Add(Format(Report, [Volume,

         'The root path is invalid. For example, no volume is mounted at the path.']));

       DRIVE_REMOVABLE:

       begin

         Volume[3] := #0;

         QueryDosDevice(PChar(Volume), @lpQuery[0], MAXCHAR);

         Volume[3] := '\';

         if String(lpQuery) = '\Device\Floppy0' then

           Memo1.Lines.Add(Format(Report, [Volume, 'The drive is a Floppy disk A:.']))

         else

           if String(lpQuery) = '\Device\Floppy1' then

             Memo1.Lines.Add(Format(Report, [Volume, 'The drive is a Floppy disk B:.']))

           else

             Memo1.Lines.Add(Format(Report, [Volume, 'The drive is a Flash Drive.']));

       end;

       DRIVE_FIXED:

       begin

         Volume[3] := #0;

         QueryDosDevice(PChar(Volume), @lpQuery[0], MAXCHAR);

         Volume[3] := '\';

         if Copy(String(lpQuery), 1, 22)  = '\Device\HarddiskVolume' then

           Memo1.Lines.Add(Format(Report, [Volume,

             'The disk cannot be removed from the drive.']))

         else

           Memo1.Lines.Add(Format(Report, [Volume,

             'The drive is a SUBST disk on path: "' +

               Copy(String(lpQuery), 5, Length(String(lpQuery))) + '"']));

       end;

       DRIVE_REMOTE: Memo1.Lines.Add(Format(Report, [Volume,

         'The drive is a remote (network) drive.']));

       DRIVE_CDROM: Memo1.Lines.Add(Format(Report, [Volume,

         'The drive is a CD-ROM drive.']));

       DRIVE_RAMDISK: Memo1.Lines.Add(Format(Report, [Volume,

         'The drive is a RAM disk.']));

     else

       Memo1.Lines.Add(Format(Report, [Volume, 'Xpen znaet chto :)']));

     end;

   end;

end;

 

end.

Автор: Александр (Rouse_) Багель

 

Вообще-то загрузочный сектор можно прочитать вот так:

Code:

type

TSector = array[0..511] of Byte;

var

Boot: TSector;

begin

ReadBoot(Drive, Boot);

 

Данный совет содержит исходный код модуля, который может помочь Вам получить, установить и удалить метку тома гибкого или жесткого диска. Код получения метки тома содержит функцию Delphi FindFirst, код для установки и удаления метки тома использует вызов DOS-прерывания 21h и функции 16h и 13h соответственно. Поскольку функция 16h не поддерживается Windows, она должна вызываться через DPMI-прерывание 31h, функцию 300h.

 

Многие помнят легендарный Norton DiskEditor - утилиту, дающую огромный простор для исследовательской и прочей деятельности. И сейчас есть множество аналогов. WinHex, например.

В этой статье я расскажу как написать свой простой редактор диска. Нужную функциональность каждый сможет добавить сам, я покажу основы.

Для начала разберемся как происходит само чтение диска. Проще всего это делать в Windows 2000/XP (с правами администратора, конечно). Работа с жестким диском в этих операционных системах производится путем открытия диска как файла с помощью функции CreateFile и указания диска или раздела по схеме Device Namespace (открывается физический диск - '\\.\PHYSICALDRIVE<n>'), полученный хэндл в дальнейшем используется для работы с диском с помощью функций ReadFile, WriteFile и DeviceIoControl.