Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];

Вниз

Работа с boot-сектором диска   Найти похожие ветки 

 
DFF ©   (2004-08-08 11:34) [0]

Можно ли ТОЛЬКО средствами Windows API прочитать/записать boot-сектор диска/дискеты/Flash-карты в файл/из файла. Заранее всем огромное спасибо.


 
Ihor Osov'yak ©   (2004-08-08 15:18) [1]

если имеется ввиду win32 api - то для NT-ряда  - да (для жесткого и флоппи, для флеш - не знаю, но вероятнее всего да). Для W9x - для HDD нет, для флоппи можно, за флеш - не знаю. Но за пределами win32 можно и для W9x (для жесткого и флоппи, для флеш - не знаю).


 
DFF ©   (2004-08-08 16:20) [2]

А премерчиком никто не поделиться?


 
Sergey Kaminski ©   (2004-08-08 16:34) [3]

Ну, для NT примерно так.

 DiskString := Format ("\\.\%s",[DiskLetter]);
 H := CreateFile(
     PChar(DiskString),
     GENERIC_READ,
     FILE_SHARE_WRITE,
     nil,
     OPEN_EXISTING,
     FILE_ATTRIBUTE_NORMAL,
     0
   );

И пиши себе, что угодно по всему диску. Только смотри, меня потом не обвиняй :)

Неплохо было бы также изучить геометрию диска, например так:


var
 IOCTL_DISK_GET_DRIVE_GEOMETRY: Cardinal;
 DiskGeometry: _DISKG_GEOMETRY;

.......

 IOCTL_DISK_GET_DRIVE_GEOMETRY :=
   GetCtlCode(FILE_DEVICE_DISK,0,METHOD_BUFFERED,FILE_ANY_ACCESS);
   Res := DeviceIoControl(
     H,
     IOCTL_DISK_GET_DRIVE_GEOMETRY,
     nil,
     0,
     @DiskGeometry,
     SizeOf(DiskGeometry),
     BytesReturned,
     nil
   );


А потом смотреть поля DiskGeoMetry:

DiskGeometry.MediaType
DiskGeometry.Cylinders.QuadPart
DiskGeometry.TracksPerCylinder
DiskGeometry.SectorsPerTrack]
DiskGeometry.BytesPerSector]

и так далее...


 
Sergey Kaminski ©   (2004-08-08 16:36) [4]

Описка, файл создавать нужно, разумеется для записи, т.е
GENERIC_WRITE


 
DFF ©   (2004-08-08 17:06) [5]

А как узнать, где именно распологается boot-сектор?


 
Sergey Kaminski ©   (2004-08-08 17:08) [6]

Смотреть структуру MBR


 
DFF ©   (2004-08-08 17:11) [7]

Это - то примерно понятно. А как эту структуру получить? Насколько я знаю, boot-сектора бывают разной длинны.


 
Ihor Osov'yak ©   (2004-08-08 17:15) [8]

2 Sergey Kaminski ©   (08.08.04 16:34) [3]

Это будет даже не логический диск,  а неизвестно что.. А человеку надобно физический диск.

>А премерчиком никто не поделиться?

ну так бы писал, что примерчик нужен.. А то льзя-нельзя..
Ps - Ctrl+F1 нажми на CreateFile...

а вообще зачем бут-сектор переписывать?


 
DFF ©   (2004-08-08 17:28) [9]

У меня стоит VMWare Workstation, там есть диск с Windows 98, из которой я убрал почти всё, и оставил 15 mb. Файл диска занимает примерно 700 mb. Вот я и хочу скопировать всё на другой диск, размером 20 mb. Файлы - то копируються нормально, а вот boot-сектор просто так не скопируеш. Я софтину для этого 3 дня искал, так и не нашол ;-(  Вот и хочу сам написать.


 
Sergey Kaminski ©   (2004-08-08 18:04) [10]

Ihor Osov"yak ©   (08.08.04 17:15) [8]

Disk Devices
Windows NT: You can use the CreateFile function to open a disk drive or a partition on a disk drive. The function returns a handle to the disk device; that handle can be used with the DeviceIOControl function. The following requirements must be met in order for such a call to succeed:

· The caller must have administrative privileges for the operation to succeed on a hard disk drive.
· The lpFileName string should be of the form \\.\PHYSICALDRIVEx to open the hard disk x. Hard disk numbers start at zero. For example:

String Meaning
\\.\PHYSICALDRIVE2 Obtains a handle to the third physical drive on the user"s computer.


· The lpFileName string should be \\.\x: to open a floppy drive x or a partition x on a hard disk. For example:

String Meaning
\\.\A: Obtains a handle to drive A on the user"s computer.
\\.\C: Obtains a handle to drive C on the user"s computer.

Это будет даже не логический диск,  а неизвестно что..
DiskDrive или partition - это неизвестно что?

Вот бутсектор,прочитанный при помощи примера, который я привел.

EB 52 90 4E 54 46 53 20 ? 20 20 20 00 02 08 00 00
00 00 00 00 00 F8 00 00 ? 3F 00 FF 00 3F 00 00 00
00 00 00 00 80 00 80 00 ? 36 16 71 02 00 00 00 00
00 00 0C 00 00 00 00 00 ? 63 11 27 00 00 00 00 00
F6 00 00 00 01 00 00 00 ? 74 B0 16 EC E8 16 EC 68
00 00 00 00 FA 33 C0 8E ? D0 BC 00 7C FB B8 C0 07
8E D8 E8 16 00 B8 00 0D ? 8E C0 33 DB C6 06 0E 00
10 E8 53 00 68 00 0D 68 ? 6A 02 CB 8A 16 24 00 B4
08 CD 13 73 05 B9 FF FF ? 8A F1 66 0F B6 C6 40 66
0F B6 D1 80 E2 3F F7 E2 ? 86 CD C0 ED 06 41 66 0F
B7 C9 66 F7 E1 66 A3 20 ? 00 C3 B4 41 BB AA 55 8A
16 24 00 CD 13 72 0F 81 ? FB 55 AA 75 09 F6 C1 01
74 04 FE 06 14 00 C3 66 ? 60 1E 06 66 A1 10 00 66
03 06 1C 00 66 3B 06 20 ? 00 0F 82 3A 00 1E 66 6A
00 66 50 06 53 66 68 10 ? 00 01 00 80 3E 14 00 00
0F 85 0C 00 E8 B3 FF 80 ? 3E 14 00 00 0F 84 61 00
B4 42 8A 16 24 00 16 1F ? 8B F4 CD 13 66 58 5B 07
66 58 66 58 1F EB 2D 66 ? 33 D2 66 0F B7 0E 18 00
66 F7 F1 FE C2 8A CA 66 ? 8B D0 66 C1 EA 10 F7 36
1A 00 86 D6 8A 16 24 00 ? 8A E8 C0 E4 06 0A CC B8
01 02 CD 13 0F 82 19 00 ? 8C C0 05 20 00 8E C0 66
FF 06 10 00 FF 0E 0E 00 ? 0F 85 6F FF 07 1F 66 61
C3 A0 F8 01 E8 09 00 A0 ? FB 01 E8 03 00 FB EB FE


 
Sergey Kaminski ©   (2004-08-08 18:11) [11]

http://www.sergeykaminski.narod.ru/ntfs_iso.gif


 
DFF ©   (2004-08-08 18:44) [12]

Sergey Kaminski ©   (08.08.04 18:04) [10]

Что - то у меня не получается его так читать. Функция CreateFile проходит нормально, а вот ReadFile пишет, что типа ACCESS DENIDED.


 
KSergey ©   (2004-08-08 21:03) [13]

> DFF ©   (08.08.04 17:28) [9]

Norton Ghost? (мой выбор)
Partition Magic?


 
Sergey Kaminski ©   (2004-08-08 21:05) [14]

Вот накарябал. Примерно так. Прочитает первый сектор (обычно 512 байт).


program ReadSect;
{$APPTYPE CONSOLE}
uses
 Windows,
 SysUtils;

const
 FILE_DEVICE_DISK = 7;
 METHOD_BUFFERED = 0;
 FILE_ANY_ACCESS = 0;

type
 _MEDIA_TYPE = DWORD;

 _DISKG_GEOMETRY = packed record
   Cylinders: LARGE_INTEGER;
   MediaType: _MEDIA_TYPE;
   TracksPerCylinder: DWORD;
   SectorsPerTrack: DWORD;
   BytesPerSector: DWORD;
 end;

var
 DiskString,
 DiskLetter,
 OutName: string;
 H,HOut: THandle;
 IOCTL_DISK_GET_DRIVE_GEOMETRY: Cardinal;
 DiskGeometry: _DISKG_GEOMETRY;
 BytesReturned: Cardinal;
 Res: BOOL;

 Buff: PChar;
 BuffSize,BytesRead,BytesWritten: Cardinal;

function GetCtlCode (_DeviceType,_Function,_Method,_Access: WORD): Cardinal;
begin
 Result := (_DeviceType shl 16) or (_Access shl 14)
   or (_Function shl 2) or _Method;
end;

begin
 // куда будем писать
 OutName := ExtractFilePath(ParamStr(0))+"512.iso";

 // что будем читать
 DiskLetter := "C:";
 DiskString := Format ("\\.\%s",[DiskLetter]);

 // создаем "файл" - раздел
 H := CreateFile(
     PChar(DiskString),
     GENERIC_READ,
     FILE_SHARE_WRITE,
     nil,
     OPEN_EXISTING,
     FILE_ATTRIBUTE_NORMAL,
     0
   );

 if H <> 0 then
 begin
   // определяем геометрию диска
   IOCTL_DISK_GET_DRIVE_GEOMETRY :=
     GetCtlCode(FILE_DEVICE_DISK,0,METHOD_BUFFERED,FILE_ANY_ACCESS);

   Res := DeviceIoControl(
     H,
     IOCTL_DISK_GET_DRIVE_GEOMETRY,
     nil,
     0,
     @DiskGeometry,
     SizeOf(DiskGeometry),
     BytesReturned,
     nil
   );

   // если определили...
   if Res then
   begin
     // выделяем буфер под чтение одного сектора
     BuffSize := DiskGeometry.BytesPerSector;
     Buff := AllocMem(BuffSize);

     // читаем нулевой сектор
     ReadFile (H,Buff^,BuffSize,BytesRead,nil);
     // отчитываемся :)
     WriteLn ("Bytes read ",BytesRead);
     // создаем файл для записи
     HOut := CreateFile(
         PChar(OutName),
         GENERIC_WRITE,
         FILE_SHARE_READ,
         nil,
         CREATE_ALWAYS,
         FILE_ATTRIBUTE_ARCHIVE,
         0
     );
     // если файл создался
     if HOut <> 0 then
     begin
       // записываем в него наш буфер
       WriteFile (HOut,Buff^,DiskGeometry.BytesPerSector,BytesWritten,nil);
       WriteLn ("Bytes written ",BytesWritten);
       //закрываем файл для записи
       CloseHandle (HOut);
     end;
   end;
   // особобождаем буфер
   FreeMem (Buff);
   // закрываем файл, открытый для чтения ("раздел")
   CloseHandle (H);
 end;
 WriteLn ("--- ENTER for exit ----");
 ReadLn;
end.


 
Ihor Osov'yak ©   (2004-08-09 01:24) [15]

2 [10] Sergey Kaminski ©   (08.08.04 18:04)

Давай не будем кипишить, а внимательно прочтем, что написано.
На момент написания [3] Sergey Kaminski ©   (08.08.04 16:34) речь шла о физическом устройстве, а не о логическом томе. А даже если и о логическом, то из Вашего примера не понятно, что после буквы тома должен присутсвовать символ двойной точки. Этим и обьяснялась моя реплика в [8]. И рекомендация почитать хелп к CreateFile в котором подробно и полностью освещен соотв. вопрос.  
Да, и относительно дампа, приведенного вами в постинге [10]. Лень мне сейчас побайтно анализировать его, но чувствует мое серце, что мы лицезреем первый сектор логического тома, а не сектор загрузчика. Внесистемного. Который собственно и "boot-сектор диска"  именуется.  Который на первом физическом секторе физического устройства.    Уж больно мне что то последовательность 4E 54 46 53  напоминает.. Случаем не NTFS?

Кстати, прочтите внимательно ту цитату, что Вы приводили мне:

· The lpFileName string should be of the form \\.\PHYSICALDRIVEx to open the hard disk x. Hard disk numbers start at zero.

· The lpFileName string should be \\.\x: to open a floppy drive x or a partition x on a hard disk.

Разницу улавливаете?


 
Ihor Osov'yak ©   (2004-08-09 01:34) [16]

а вот кстати и дамп действительно загрузчика из одного hdd, установленных у меня в системе:

000: 33 C0 8E D0 BC 00 7C FB  -  50 07 50 1F FC BE 1B 7C 3&#9492;О&#9576;&#9565;.|&#8730;P.P.№&#9563;.|
010: BF 1B 06 50 57 B9 E5 01  -  F3 A4 CB BD BE 07 B1 04 &#9488;..PW&#9571;х.єд&#9574;&#9564;&#9563;.&#9618;.
020: 38 6E 00 7C 09 75 13 83  -  C5 10 E2 F4 CD 18 8B F5 8n.|.u.Г&#9532;.тЇ&#9552;.Лї
030: 83 C6 10 49 74 19 38 2C  -  74 F6 A0 B5 07 B4 07 8B Г&#9566;.It.8,tЎа&#9569;.&#9508;.Л
040: F0 AC 3C 00 74 FC BB 07  -  00 B4 0E CD 10 EB F2 88 Ём<.t№&#9559;..&#9508;.&#9552;.ыЄИ
050: 4E 10 E8 46 00 73 2A FE  -  46 10 80 7E 04 0B 74 0B N.шF.s*&#9632;F.А~..t.
060: 80 7E 04 0C 74 05 A0 B6  -  07 75 D2 80 46 02 06 83 А~..t.а&#9570;.u&#9573;АF..Г
070: 46 08 06 83 56 0A 00 E8  -  21 00 73 05 A0 B6 07 EB F..ГV..ш!.s.а&#9570;.ы
080: BC 81 3E FE 7D 55 AA 74  -  0B 80 7E 10 00 74 C8 A0 &#9565;Б>&#9632;}Uкt.А~..t&#9562;а
090: B7 07 EB A9 8B FC 1E 57  -  8B F5 CB BF 05 00 8A 56 &#9558;.ыйЛ№.WЛї&#9574;&#9488;..КV
0A0: 00 B4 08 CD 13 72 23 8A  -  C1 24 3F 98 8A DE 8A FC .&#9508;.&#9552;.r#К&#9524;$?ШК&#9616;К№
0B0: 43 F7 E3 8B D1 86 D6 B1  -  06 D2 EE 42 F7 E2 39 56 CўуЛ&#9572;Ж&#9555;&#9618;.&#9573;юBўт9V
0C0: 0A 77 23 72 05 39 46 08  -  73 1C B8 01 02 BB 00 7C .w#r.9F.s.&#9557;..&#9559;.|
0D0: 8B 4E 02 8B 56 00 CD 13  -  73 51 4F 74 4E 32 E4 8A ЛN.ЛV.&#9552;.sQOtN2фК
0E0: 56 00 CD 13 EB E4 8A 56  -  00 60 BB AA 55 B4 41 CD V.&#9552;.ыфКV.`&#9559;кU&#9508;A&#9552;
0F0: 13 72 36 81 FB 55 AA 75  -  30 F6 C1 01 74 2B 61 60 .r6Б&#8730;Uкu0Ў&#9524;.t+a`
100: 6A 00 6A 00 FF 76 0A FF  -  76 08 6A 00 68 00 7C 6A j.j..v..v.j.h.|j
110: 01 6A 10 B4 42 8B F4 CD  -  13 61 61 73 0E 4F 74 0B .j.&#9508;BЛЇ&#9552;.aas.Ot.
120: 32 E4 8A 56 00 CD 13 EB  -  D6 61 F9 C3 49 6E 76 61 2фКV.&#9552;.ы&#9555;a&#8729;&#9500;Inva
130: 6C 69 64 20 70 61 72 74  -  69 74 69 6F 6E 20 74 61 lid partition ta
140: 62 6C 65 00 45 72 72 6F  -  72 20 6C 6F 61 64 69 6E ble.Error loadin
150: 67 20 6F 70 65 72 61 74  -  69 6E 67 20 73 79 73 74 g operating syst
160: 65 6D 00 4D 69 73 73 69  -  6E 67 20 6F 70 65 72 61 em.Missing opera
170: 74 69 6E 67 20 73 79 73  -  74 65 6D 00 00 00 00 00 ting system.....
180: 00 00 00 00 00 00 00 00  -  00 00 00 00 00 00 00 00 ................
190: 00 00 00 00 00 00 00 00  -  00 00 00 00 00 00 00 00 ................
1A0: 00 00 00 00 00 00 00 00  -  00 00 00 00 00 00 00 00 ................
1B0: 00 00 00 00 00 2C 44 63  -  4B 66 96 61 00 00 00 01 .....,DcKfЦa....
1C0: 01 00 0C FE FF FE 3F 00  -  00 00 94 CD 5D 01 00 00 ...&#9632;.&#9632;?...Ф&#9552;]...
1D0: C1 FF 0F FE FF FF D3 CD  -  5D 01 31 26 9C 0C 00 00 &#9524;..&#9632;..&#9561;&#9552;].1&Ь...
1E0: 00 00 00 00 00 00 00 00  -  00 00 00 00 00 00 00 00 ................
1F0: 00 00 00 00 00 00 00 00  -  00 00 00 00 00 00 55 AA ..............Uк

Можете сравнить.


 
GuAV ©   (2004-08-09 01:48) [17]


> EB 52

Ну да, бут-сектор начинается на jmp short
про запись бута в файл, файла в mbr и ваще чего угодно куда угодно под 95/98 -- diskedit - rulez


 
GuAV ©   (2004-08-09 01:49) [18]

У меня бут-сектор 9х
00000000:  EB 58 90 4D-53 57 49 4E-34 2E 31 00-02 10 20 00  ыXРMSWIN4.1 
00000010:  02 00 00 00-00 F8 00 00-3F 00 F0 00-DF B0 09 00      °  ? Ё __
00000020:  C1 28 97 03-CC 72 00 00-00 00 00 00-95 61 34 00  -(Ч¦r      Хa4
00000030:  01 00 06 00-00 00 00 00-00 00 00 00-00 00 00 00   
00000040:  80 00 29 A6-60 52 00 47-45 4E 45 52-41 4C 00 00  А )ж`R GENERAL
00000050:  00 00 46 41-54 33 32 20-20 20 FA 33-C9 8E D1 BC    FAT32   ·3+О-+
00000060:  F8 7B 8E C1-BD 78 00 C5-76 00 1E 56-16 55 BF 22  °{О-+x +v VU+"
00000070:  05 89 7E 00-89 4E 02 B1-0B FC F3 A4-8E D9 BD 00  Й~ ЙN_ №єдО++
00000080:  7C C6 45 FE-0F 8B 46 18-88 45 F9 38-4E 40 7D 25  |¦E_¤ЛFИE•8N@}%
00000090:  8B C1 99 BB-00 07 E8 97-00 72 1A 83-EB 3A 66 A1  Л-Щ+ шЧ rГы:fб
000000A0:  1C 7C 66 3B-07 8A 57 FC-75 06 80 CA-02 88 56 02  |f;КW№uА-ИV
000000B0:  80 C3 10 73-ED BF 02 00-83 7E 16 00-75 45 8B 46  А+sэ+ Г~ uEЛF
000000C0:  1C 8B 56 1E-B9 03 00 49-40 75 01 42-BB 00 7E E8  ЛV¦ I@uB+ ~ш
000000D0:  5F 00 73 26-B0 F8 4F 74-1D 8B 46 32-33 D2 B9 03  _ s&_°OtЛF23-¦
000000E0:  00 3B C8 77-1E 8B 76 0E-3B CE 73 17-2B F1 03 46   ;+wЛv;+s+ёF
000000F0:  1C 13 56 1E-EB D1 73 0B-EB 27 83 7E-2A 00 77 03  Vы-s ы"Г~* w
00000100:  E9 FD 02 BE-7E 7D AC 98-03 F0 AC 84-C0 74 17 3C  щ¤+~}мШЁмД+t<
00000110:  FF 74 09 B4-0E BB 07 00-CD 10 EB EE-BE 81 7D EB  _t ¦+ -ыю+Б}ы
00000120:  E5 BE 7F 7D-EB E0 98 CD-16 5E 1F 66-8F 04 CD 19  х+}ырШ-^fП-
00000130:  41 56 66 6A-00 52 50 06-53 6A 01 6A-10 8B F4 60  AVfj RPSjjЛЇ`
00000140:  80 7E 02 0E-75 04 B4 42-EB 1D 91 92-33 D2 F7 76  А~u¦BыСТ3-ўv
00000150:  18 91 F7 76-18 42 87 CA-F7 76 1A 8A-F2 8A E8 C0  СўvBЗ-ўvКЄКш+
00000160:  CC 02 0A CC-B8 01 02 8A-56 40 CD 13-61 8D 64 10  ¦
¦+КV@-aНd
00000170:  5E 72 0A 40-75 01 42 03-5E 0B 49 75-B4 C3 03 18  ^r
@uB^ Iu¦+
00000180:  01 27 0D 0A-49 6E 76 61-6C 69 64 20-73 79 73 74  "
Invalid syst
00000190:  65 6D 20 64-69 73 6B 79-0D 0A 44 69-73 6B 20 49  em disky
Disk I
000001A0:  2F 4F 20 65-72 72 6F 72-79 0D 0A 52-65 70 6C 61  /O errory
Repla
000001B0:  63 65 20 74-68 65 20 64-69 73 6B 2C-20 61 6E 64  ce the disk, and
000001C0:  20 74 68 65-6E 20 70 72-65 73 73 20-61 6E 79 20   then press any
000001D0:  6B 65 79 0D-0A 00 00 00-49 4F 20 20-20 20 20 20  key
  IO
000001E0:  53 59 53 4D-53 44 4F 53-20 20 20 53-59 53 7E 01  SYSMSDOS   SYS~
000001F0:  00 57 49 4E-42 4F 4F 54-20 53 59 53-00 00 55 AA   WINBOOT SYS  Uк


 
Ihor Osov'yak ©   (2004-08-09 02:01) [19]

2 [5] DFF ©   (08.08.04 17:06)
> А как узнать, где именно распологается boot-сектор?
> Насколько я знаю, boot-сектора бывают разной длинны.

Если внеситемный загрузчик - то всегда начинается на первом секторе физического устройства. Длинна - обычно 1 сектор, но есть исключения - всякие там менеджеры загрузок. Поэтому если делать какой-то утиль резервного копирования, то желательно снимать копию всех секторов перед первым логическим диском, но не более одного трека.

Если речь о загрузчике операционной системы - то первый сектор соотв. логического диска. Для операционнок от MS это будет первый логический том на физическом диске, в независимости от того, на какой логический том установлена сама операционная система. Собственно дамп загрузчика операционной системы и привел Sergey Kaminski (еще раз подчеркиваю - дамп загрузчика операционной системы, а не дамп внесистемного загрузчика).

Для утилиты копирования желательно иметь свойство сохранять также таблицу разделов. Первых четыре вхождения этой таблицы - по смещениям 1be..1fe первого физического сектора, следующие вхождения - также в первом секторе следующих разделов диска (собственно зона логического диска и зона раздела - немного разные вещы - посмотрите в мсдн, кажется, это там нормально описано)    

> там есть диск с Windows 98

Увы, решение с CreateFile для 98 не пройдет. Там нужно работать через int 13. К сожалению, стандартный финт с помощью VWIN32DIOC для int 13 в части hdd не пройдет - не знаю, баг это или фича.. Майкрософт рекомендует работать с int 13 для HDD посредством 16-битной длл. Есть еще один вариант - сделать простойку в виде vxd.

Удачи.


 
Ihor Osov'yak ©   (2004-08-09 02:12) [20]

2 [18] GuAV ©   (09.08.04 01:49)

Это снова загрузчик операционки. Не путайте загрузчик операционки (который в области логического тома) и внесистемный загрузчик (который размещен перед зоной логических томов)

Зы. Хотя, как я не понимаю, зачем для решения задачи, упомянутой в [9] вообще связываться с загрузчиками. И позасистемными, и операционки.
Хотя бы потому, что они в процессе работы не меняются. То есть делаем в вмваре новый том, форматируем его - и как следствие - оба загрузчика уже на месте. Правда, как потом туде обратно файлы переписать? Разве что образ монтировать как дополнительный диск.

Вариант второй. VMWare, кажется, допускает также создание образов не фиксированого размера, а за принцыпом - сколько надо, столько и кушаю.
Тогда все эта свистопляска нафиг кому нужна.
И даже если это не так - делаем образ, в котором занято только то, что нужно, какой-то утилитой обнуляем пустое пространство образа - и запускаем архифатор на образ. Сожмет, аки рашен фантастик.. Это вариант третий.


 
GuAV ©   (2004-08-09 02:29) [21]

Хм... я всегда аньше думал,  что то что в начале диска называется Master Boot Record - mbr. А boot-sector - это начало какоголибо primary partition. более того информацию я взял из файла старого загрузчика 9х, файл создан при установке ХР, и она его обозвала bootsect.dos


 
Sergey Kaminski ©   (2004-08-09 02:43) [22]


Ihor Osov"yak ©   (09.08.04 01:24) [15]
Давай не будем кипишить, а внимательно прочтем, что написано.


И не думал "кипишить". И внимательно читал, то, что написано.

Просили показать чтение/запись boot sector. Замечу, что не уточнялось, что имеется в виду под этим термином. Можно понять как Master boot record (который также часто именуют boot sector).
С другой стороны, можно понять как OS Boot Record First Sector AKA Bootstrap code AKA boot sector (и закономерно,кстати).
Мое право выбирать трактовку неуточненного и неоднозначного термина. Тем более, что я был последователен и привел работающий код, реализующий мои мысли + дамп того, что я имел ввиду.

----
А если перейти из технической области в дурацкую область выяснения того кто "кипишует", то замечу, что ваши первые посты содержали лишь два "конструктивных" замечания:

Это будет даже не логический диск,  а неизвестно что..
Ctrl+F1 нажми на CreateFile...

Но я же первый соглашусь, что лучше не переходить в эту область.

Мои наилучшие пожелания.
-----

П.С., любопытствующим. Указываю, где можно найти оригинальный boot sector AKA OS boot strap code, например для XP и сравнить его с моим дампом.
Привожу только один файл, хотя наверняка можно найти в куче других:
 autochk.exe
 версия файла  5.1.2600.х
 начиная со смещения 0x57220 по 0x5741F
 далее следует 15 секторов NTLDR.


 
Sergey Kaminski ©   (2004-08-09 02:45) [23]


GuAV ©   (09.08.04 02:29) [21]
Хм... я всегда аньше думал,  что то что в начале диска называется Master Boot Record - mbr.


Именно так оно и есть на самом деле.


 
Sergey Kaminski ©   (2004-08-09 02:55) [24]

Все никак не остановлюсь :)

АВТОРУ ВЕТКИ.

А если нужен MBR, то есть основной загрузочный сектор (тот, в котором сидят, например, менеджеры загрузок), то, в моем примере нужно заменить строку

 DiskString := Format ("\\.\%s",[DiskLetter]);

на что-нибудь такое:

 DiskString := Format ("\\.\PHYSICALDRIVE%d",[DiskNumber]);

где DiskNumber, номер жесткого диска, считая с 0.

Опять же приведу дамп, полученный в результате, уже в текстовом виде:

FA EB 32 90 AA 01 4C 49 ? 4C 4F 01 00 16 04 00 00
00 00 00 00 57 B9 E5 01 ? B6 00 00 00 00 03 7E 78
E9 87 E0 88 0D F6 86 E0 ? 88 0D 01 76 88 E0 88 0D
0B 87 E0 88 0D E8 00 00 ? 58 2D 38 00 8C CF C1 E8
04 01 F8 8E D0 BC 00 08 ? FB 52 53 06 56 FC 8E D8
8E C0 B8 00 12 B3 36 CD ? 10 B0 0D E8 B4 00 B0 0A
E8 AF 00 B0 4C E8 AA 00 ? BE 30 00 BB 00 02 53 E8
5A 00 B4 99 66 81 7F FC ? 4C 49 4C 4F 75 31 5E CD
12 C1 E0 06 2B 06 1C 00 ? 50 07 31 DB E8 3D 00 75
FB BE 06 00 89 F7 66 A7 ? 75 13 26 80 3D 02 75 0D
A7 A7 75 09 B0 49 E8 69 ? 00 06 6A 00 CB B4 9A 51
59 B0 20 E8 5C 00 E8 49 ? 00 31 C0 CD 13 FE 0E 00
00 75 A5 B9 30 00 B4 86 ? CD 15 CD 18 AD 91 AC A8
60 75 0F 4E AD 89 C2 09 ? C8 74 26 AC B4 02 CD 13
EB 1A 92 AD F6 C2 20 75 ? 02 30 E4 97 F6 C2 10 74
08 03 0E 10 00 13 3E 12 ? 00 E8 22 00 72 B2 80 C7
02 C3 C1 C0 04 E8 03 00 ? C1 C0 04 24 0F 27 04 F0
14 40 50 53 BB 07 00 B4 ? 0E CD 10 5B 58 C3 56 51
53 88 D3 80 E2 8F F6 C3 ? 20 74 2D BB AA 55 B4 41
CD 13 72 24 81 FB 55 AA ? 75 1E F6 C1 01 74 19 5B
59 66 6A 00 57 51 06 53 ? 6A 01 6A 10 89 E6 B8 00
42 CD 13 8D 64 10 EB 45 ? 5B 59 53 52 57 51 06 B4
08 CD 13 07 72 39 51 C0 ? E9 06 86 E9 89 CF 59 C1
EA 08 92 40 83 E1 3F F7 ? E1 96 58 5A 39 F2 73 23
F7 F6 39 F8 77 1D C0 E4 ? 06 86 E0 92 F6 F1 FE C4
00 E2 89 D1 5A 5B 86 F0 ? B8 01 02 CD 13 EB 09 59
5F EB 02 B4 40 5A 5B F9 ? 5E C3 00 00 00 00 00 00
00 00 00 00 00 00 44 63 ? E6 C8 E6 C8 00 00 80 01
01 00 07 FE FF FF 3F 00 ? 00 00 37 16 71 02 00 00
C1 FF 0F FE FF FF 76 16 ? 71 02 8E DD 88 0B 00 00
00 00 00 00 00 00 00 00 ? 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 ? 00 00 00 00 00 00 55 AA


Желающим предлагаю сходить по смещению 07 и увидеть там сигнатуру "LILO" - что соответствует действительно, ибо у меня именно этот бут-менеджер и стоит в MBR.


 
Ihor Osov'yak ©   (2004-08-09 03:38) [25]

2 [21] GuAV ©   (09.08.04 02:29)

>  я всегда аньше думал,  что то что в начале диска называется Master Boot Record - mbr . А boot-sector - это начало какоголибо primary partition

В общем то верно... Если не считать того, что boot-sector присутствует в начале каждой логической партиции также.

Немного подробнее.

В начале физического диска, до partitions размещена область, именуемая  Master Boot Record - mbr. В которой может быть расположен код внесистемного загрузчика.  И в которой всегда присутствуют четыре вхождения таблицы разделов жесткого диска.
Довольно часто эта область именуется внесистемным загрузчиком.

В начале primary partition зарезервирована зона для boot sector. В которой может быть расположен загрузчик операционой системы (если диск есть загрузочным), а может и не быть. primary partition - максимум 3.
Логические партиции размещены в Extended partition.
Условно логическую партицию можно разделить на три части -
1. extended boot record - один сектор
2. boot sector логической партиции
3  область файоловой системы
Уже здесь наблюдается путанница. Так, в мсдн иногда под логическим томом понимается 1+2+3. Но с другой стороны - логический том может быть смонтирован на нескольких партициях. А даже если и на одной - то по CreateFile("\\.\x:", который декларируется как доступ к логическому тому, вы получите доступ только к части 2 и 3, но не к 1.

Ладно, говорить долго можно - лучше посмотреть оригинал - msdn.
А гогда говорят об бут-секторе диска, то желательно уточнять. Какой бут и какого диска. Или физического, или тома.

... а bootsect.dos - это таки да, загрузочный сектор 9x (тот, который с логического тома, а не внесистемный), который хп в процессе установки сохранила в виде файла, если до ее установки уже стоял 9x, и который загрузчик xp использует, если получил указание грузить 9х. В книге Соломона-Руссиновича этот процесс детально рассмотрен.


 
Ihor Osov'yak ©   (2004-08-09 03:54) [26]

2 [22] Sergey Kaminski ©   (09.08.04 02:43)

прочтите внимательно [15], в частности "то из Вашего примера не понятно, что после буквы тома должен присутсвовать символ двойной точки." Напоминаю, что речь ишла о постинге [3].

>Замечу, что не уточнялось, что имеется в виду под этим термином. Можно понять как Master boot record (который также часто именуют boot sector).
С другой стороны, можно понять как OS Boot Record First Sector AKA Bootstrap code AKA boot sector (и закономерно,кстати).
Мое право выбирать трактовку неуточненного и неоднозначного термина.

В принцыпе да. Но эта мелкая склока - лишнее подтверждение того, что отвечать на неоднозначные вопросы - себе лишняя морока. Тем более, что как потом оказалось человеку нужно решение для 98 - а все эти примеры - для ряда нт только.

>Тем более, что я был последователен и привел работающий код, реализующий мои мысли + дамп того, что я имел ввиду.

моя реплика была до того. И была спровоцирована возможностью неоднозначной трактовки того, что нужно ставить на место DiskLetter. Если понимать буквально - то есть один символ - код будет неработоспосбным. Посему и была рекомендация нажать на Сtrl+F1. Не Вам, кстати.


 
Sergey Kaminski ©   (2004-08-09 04:15) [27]

Ihor Osov"yak ©   (09.08.04 03:54) [26]

лишнее подтверждение того, что отвечать на неоднозначные вопросы - себе лишняя морока.


И я с удовольствием подпишусь под этими мудрыми словами.


Но эта мелкая склока...


да и, действительно, спор не по-существу вышел и несколько "несинхронно" проходил. Черт его знает, как оно так вышло.

Посему, предлагаю дальнейшие прения прекратить за бессмысленностью и за неимением предмета спора.


 
Ihor Osov'yak ©   (2004-08-09 04:16) [28]

2 [27] Sergey Kaminski ©   (09.08.04 04:15)

Угу.
Удачи.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.04 c
4-1091449532
CAMCOH
2004-08-02 16:25
2004.09.19
Ошибка при создании сервиса


14-1093917347
Думкин
2004-08-31 05:55
2004.09.19
С днем рождения!


11-1080637617
avakss
2004-03-30 13:06
2004.09.19
KoleDB+Access2000rus+Delphi7+Win2000rus


1-1094119475
happyandry
2004-09-02 14:04
2004.09.19
как правильно называется компонент (индикация по часовой стрелке)


14-1093525768
Копир
2004-08-26 17:09
2004.09.19
H E L P. Damned Javaw !





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский