Диски
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.
- Подробности
- Родительская категория: Работа с железом
- Категория: Диски
Страница 2 из 2