Работа с железом
Code: |
{ ... } if DefineDosDevice(DDD_RAW_TARGET_PATH, 'P:', 'F:\Backup\Music\Modules') then ShowMessage('Drive was created successfully') else ShowMessage('Error creating drive'); { ... } |
- Подробности
- Родительская категория: Работа с железом
- Категория: Диски
Code: |
type TDriveState(DS_NO_DISK, DS_UNFORMATTED_DISK, DS_EMPTY_DISK, DS_DISK_WITH_FILES);
function DriveState(driveletter: Char): TDriveState; var mask: string[6]; sRec: TSearchRec; oldMode: Cardinal; retcode: Integer; begin oldMode: = SetErrorMode(SEM_FAILCRITICALERRORS); mask := '?:\*.*'; mask[1] := driveletter; {$I-} { не возбуждаем исключение при неудаче } retcode := FindFirst(mask, faAnyfile, SRec); FindClose(SRec); {$I+} case retcode of 0: Result := DS_DISK_WITH_FILES; { обнаружен по крайней мере один файл } -18: Result := DS_EMPTY_DISK; { никаких файлов не обнаружено, но ok } -21: Result := DS_NO_DISK; { DOS ERROR_NOT_READY } else Result := DS_UNFORMATTED_DISK; { в моей системе значение равно -1785!} end; SetErrorMode(oldMode); end; { DriveState } |
- Подробности
- Родительская категория: Работа с железом
- Категория: Диски
Многие помнят легендарный Norton DiskEditor - утилиту, дающую огромный простор для исследовательской и прочей деятельности. И сейчас есть множество аналогов. WinHex, например.
В этой статье я расскажу как написать свой простой редактор диска. Нужную функциональность каждый сможет добавить сам, я покажу основы.
Для начала разберемся как происходит само чтение диска. Проще всего это делать в Windows 2000/XP (с правами администратора, конечно). Работа с жестким диском в этих операционных системах производится путем открытия диска как файла с помощью функции CreateFile и указания диска или раздела по схеме Device Namespace (открывается физический диск - '\\.\PHYSICALDRIVE<n>'), полученный хэндл в дальнейшем используется для работы с диском с помощью функций ReadFile, WriteFile и DeviceIoControl.
- Подробности
- Родительская категория: Работа с железом
- Категория: Диски
Code: |
unit Unit1; {©Drkb v.3}
interface
uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TUndocSHFormat = class(TForm) Label1: TLabel; Combo1: TComboBox; cmdSHFormat: TButton; cmdEnd: TButton; lbMessage: TLabel; procedure FormCreate(Sender: TObject); procedure cmdSHFormatClick(Sender: TObject); procedure cmdEndClick(Sender: TObject); private procedure LoadAvailableDrives; public end;
var UndocSHFormat: TUndocSHFormat;
implementation
{$R *.DFM}
type POSVERSIONINFO = ^TOSVERSIONINFO; TOSVERSIONINFO = record dwOSVersionInfoSize: Longint; dwMajorVersion: Longint; dwMinorVersion: Longint; dwBuildNumber: Longint; dwPlatformId: Longint; szCSDVersion: PChar; end;
function GetVersionEx(lpVersionInformation: POSVERSIONINFO): Longint; stdcall; external 'kernel32.dll' name 'GetVersionExA';
const VER_PLATFORM_WIN32s = 0; const VER_PLATFORM_WIN32_WINDOWS = 1; const VER_PLATFORM_WIN32_NT = 2;
function SHFormatDrive(hwndOwner: longint; iDrive: Longint; iCapacity: LongInt; iFormatType: LongInt): Longint; stdcall; external 'shell32.dll';
const SHFD_CAPACITY_DEFAULT = 0; const SHFD_CAPACITY_360 = 3; const SHFD_CAPACITY_720 = 5;
//Win95 //Const SHFD_FORMAT_QUICK = 0; //Const SHFD_FORMAT_FULL = 1; //Const SHFD_FORMAT_SYSONLY = 2;
//WinNT //Public Const SHFD_FORMAT_FULL = 0 //Public Const SHFD_FORMAT_QUICK = 1
const SHFD_FORMAT_QUICK: LongInt = 0; const SHFD_FORMAT_FULL: LongInt = 1; const SHFD_FORMAT_SYSONLY: LongInt = 2;
function GetLogicalDriveStrings(nBufferLength: LongInt; lpBuffer: PChar): LongInt; stdcall; external 'kernel32.dll' name 'GetLogicalDriveStringsA';
function GetDriveType(nDrive: PChar): LongInt; stdcall; external 'kernel32.dll' name 'GetDriveTypeA';
const DRIVE_REMOVABLE = 2; const DRIVE_FIXED = 3; const DRIVE_REMOTE = 4; const DRIVE_CDROM = 5; const DRIVE_RAMDISK = 6;
function IsWinNT: Boolean; var osvi: TOSVERSIONINFO; begin osvi.dwOSVersionInfoSize := SizeOf(osvi); GetVersionEx(@osvi); IsWinNT := (osvi.dwPlatformId = VER_PLATFORM_WIN32_NT); end;
function GetDriveDisplayString(currDrive: PChar): pchar; begin GetDriveDisplayString := nil; case GetDriveType(currDrive) of 0, 1: GetDriveDisplayString := ' - Undetermined Drive Type -'; DRIVE_REMOVABLE: case currDrive[1] of 'A', 'B': GetDriveDisplayString := 'Floppy drive'; else GetDriveDisplayString := 'Removable drive'; end; DRIVE_FIXED: GetDriveDisplayString := 'Fixed (Hard) drive'; DRIVE_REMOTE: GetDriveDisplayString := 'Remote drive'; DRIVE_CDROM: GetDriveDisplayString := 'CD ROM'; DRIVE_RAMDISK: GetDriveDisplayString := 'Ram disk'; end; end;
procedure TUndocSHFormat.LoadAvailableDrives; var a, r: LongInt; lpBuffer: array[0..256] of char; currDrive: array[0..256] of char; lpDrives: pchar;
begin getmem(lpDrives, 256); fillchar(lpBuffer, 64, #32);
r := GetLogicalDriveStrings(255, lpBuffer);
if r <> 0 then begin strlcopy(lpBuffer, lpBuffer, r); for a := 0 to r do lpDrives[a] := lpBuffer[a]; lpBuffer[r + 1] := #0; repeat strlcopy(currDrive, lpDrives, 3); lpDrives := @lpDrives[4]; Combo1.Items.Add(strpas(currDrive) + ' ' + GetDriveDisplayString(currDrive)); until lpDrives[0] = #0; end; end;
procedure TUndocSHFormat.FormCreate(Sender: TObject); begin lbMessage.caption := ''; LoadAvailableDrives; Combo1.ItemIndex := 0; if IsWinNT then begin SHFD_FORMAT_FULL := 0; SHFD_FORMAT_QUICK := 1; end else //it's Win95 begin SHFD_FORMAT_QUICK := 0; SHFD_FORMAT_FULL := 1; SHFD_FORMAT_SYSONLY := 2; end; end;
procedure TUndocSHFormat.cmdSHFormatClick(Sender: TObject); var resp: Integer; drvToFormat: Integer; prompt: string; begin drvToFormat := Combo1.ItemIndex; prompt := 'Are you sure you want to run the Format dialog against ' + Combo1.Text;
if drvToFormat > 0 then resp := MessageDLG(prompt, mtConfirmation, [mbYes, mbNo], 0) else resp := mrYes;
if resp = mrYes then begin lbMessage.Caption := 'Checking drive for disk...'; Application.ProcessMessages; SHFormatDrive(handle, drvToFormat, SHFD_CAPACITY_DEFAULT, SHFD_FORMAT_QUICK); lbMessage.caption := ''; end; end;
procedure TUndocSHFormat.cmdEndClick(Sender: TObject); begin close; end;
end. |
- Подробности
- Родительская категория: Работа с железом
- Категория: Диски
Данный совет содержит исходный код модуля, который может помочь Вам получить, установить и удалить метку тома гибкого или жесткого диска. Код получения метки тома содержит функцию Delphi FindFirst, код для установки и удаления метки тома использует вызов DOS-прерывания 21h и функции 16h и 13h соответственно. Поскольку функция 16h не поддерживается Windows, она должна вызываться через DPMI-прерывание 31h, функцию 300h.
- Подробности
- Родительская категория: Работа с железом
- Категория: Диски
На некоторых laptop компьютерах может не быть флоппи дисковода. Можно ли удалять из списка TDriveComboBox диски которые отключены?
В примере TDriveComboBox не показывает дисководы, которые не готовы. (not ready). Учтите что на многих компьютерах будет ощутимая задержка при поверке plug&play флоппи дисковода.
- Подробности
- Родительская категория: Работа с железом
- Категория: Диски
Code: |
type TForm1 = class(TForm) Button1: TButton; private { Private declarations } procedure WMDeviceChange(var Message: TMessage); message WM_DEVICECHANGE; public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.DFM}
const DBT_DEVICEARRIVAL = $8000; const DBT_DEVICEQUERYREMOVE = $8001; const DBT_DEVICEQUERYREMOVEFAILED = $8002; const DBT_DEVICEREMOVEPENDING = $8003; const DBT_DEVICEREMOVECOMPLETE = $8004; const DBT_DEVICETYPESPECIFIC = $8005; const DBT_CONFIGCHANGED = $0018;
procedure TForm1.WMDeviceChange(var Message: TMessage); var s : string; begin {Do Something here} case Message.wParam of DBT_DEVICEARRIVAL : s := 'A device has been inserted and is now available'; DBT_DEVICEQUERYREMOVE: begin s := 'Permission to remove a device is requested'; ShowMessage(s); {True grants premission} Message.Result := integer(true); exit; end; DBT_DEVICEQUERYREMOVEFAILED : s := 'Request to remove a device has been canceled'; DBT_DEVICEREMOVEPENDING : s := 'Device is about to be removed'; DBT_DEVICEREMOVECOMPLETE : s := 'Device has been removed'; DBT_DEVICETYPESPECIFIC : s := 'Device-specific event'; DBT_CONFIGCHANGED : s:= 'Current configuration has changed' else s := 'Unknown Device Message'; end; ShowMessage(s); inherited; end; |
- Подробности
- Родительская категория: Работа с железом
- Категория: Конфигурация железа
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_) Багель
- Подробности
- Родительская категория: Работа с железом
- Категория: Диски
Структура SYSTEM_INFO содержит сведения о текущем компьютере система. Это включает в себя архитектуру и Тип процессора, количество процессоры в системе, размер страницы, и другая такая информация.
- Подробности
- Родительская категория: Работа с железом
- Категория: Конфигурация железа
Вообще-то загрузочный сектор можно прочитать вот так:
Code: |
type TSector = array[0..511] of Byte; var Boot: TSector; begin ReadBoot(Drive, Boot); |
- Подробности
- Родительская категория: Работа с железом
- Категория: Диски
Офигенский компонент.
Описание от авторов:
Product: MiTeC System Information Component
Delphi 7, Delphi 2006-2007, Delphi 2010, Delphi XExx
- Подробности
- Родительская категория: Работа с железом
- Категория: Конфигурация железа
Страница 4 из 17