Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.10.2007, 17:06
GaistEndruy GaistEndruy вне форума
Прохожий
 
Регистрация: 10.10.2007
Сообщения: 4
Репутация: 10
Стрелка Невидимка (Призрак)

Привет всем!
Подскажите мне пожалуйста, как мне сделать на винчестере такой раздел.
Ответить с цитированием
  #2  
Старый 11.10.2007, 17:08
Аватар для moo2k
moo2k moo2k вне форума
Активный
 
Регистрация: 05.12.2006
Адрес: где-то там...
Сообщения: 321
Репутация: 35
По умолчанию

Код:
//для 95, 98, Me
 type
   TDiocRegisters = record
     EBX, EDX, ECX, EAX, EDI, ESI, Flags: LongWord end;

   TVWin32CtlCode = (ccNone, ccVWin32IntIoctl, ccVWin32Int25,
     ccVWin32Int26, ccVWin32Int13);

 function VWin32(CtlCode: TVWin32CtlCode; 
   var Regs: TDiocRegisters): Boolean; // вспомогательная процедура
   var
     Device: THandle;
     Count: LongWord;
   begin
   Device := CreateFile('\\.\VWIN32', 0, 0, nil, 0,
     FILE_FLAG_DELETE_ON_CLOSE, 0);
   if Device = INVALID_HANDLE_VALUE then
     raise Exception.Create(SysErrorMessage(GetLastError));
   try
     Result := DeviceIoControl(Device, Ord(CtlCode), @Regs,
       SizeOf(Regs), @Regs, SizeOf(Regs), Count, nil);
   finally
     CloseHandle(Device) end end;

//само чтение
 procedure WriteBoot95(Drive: Char; var Boot: TSector);
   var
     Regs: TDiocRegisters;
   begin
   with Regs do begin
     EAX := Ord(UpCase(Drive)) - Ord('A');
     EBX := LongWord(@Boot);
     ECX := 1;
     EDX := 0 end;
   if not VWin32(ccVWin32Int25, Regs) then
     raise Exception.Create(SysErrorMessage(GetLastError)) end;

//для NT, 2000, XP попроще
 type
   TSector = array[0..511] of Byte;
 procedure WriteBootNT(Drive: Char; var Boot: TSector);
   var
     BytesWrite: Cardinal;
     H: THandle;
   begin
   H := CreateFile(PChar(Format('\\.\%s:', [UpCase(Drive)])),
     GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
   if H = INVALID_HANDLE_VALUE then
     raise Exception.Create(SysErrorMessage(GetLastError));
   try
     if not WriteFile(H, Boot, SizeOf(Boot), BytesWrite, nil)then
       raise Exception.Create(SysErrorMessage(GetLastError));
   finally
     CloseHandle(H) end end;

// а юзать так

var
     Boot: TSector;
   begin
   case Win32Platform of
     VER_PLATFORM_WIN32_WINDOWS:
       WriteBoot95(Drive, Boot);
     VER_PLATFORM_WIN32_NT:
       WriteBootNT(Drive, Boot) end;
__________________
Программирование - это искусство и наш смысл жизни.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:40.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter