Форум: "Система";
Текущий архив: 2003.03.13;
Скачать: [xml.tar.bz2];
ВнизПосекторное чтение диска Найти похожие ветки
← →
Vcoder (2002-12-28 20:20) [0]Хочу написать прогу для посекторного сохранения диска. Помнится, есть ДОС прерывания int 25h, int 26h - чтение/запись логического сектора. Но там номер сектора передается 16-разрядным числом, что есть недостаточно для современных дисков.
Может, кто-нибудь подскажет способ обращения к логическим секторам диска, удовлетворяющий современным требованиям? Не обязательно под WIN, можно и под DOS.
← →
Morfein (2002-12-28 20:54) [1]vwin32.vxd + DeviceIOCtrl
← →
Vcoder (2002-12-28 21:42) [2]Поподробней напиши пожалуйста, с чем это едят... Или ссылочку на статью по теме...
← →
Alex Konshin (2002-12-29 03:19) [3]Я так и не понял: так под XP надо или все-таки под DOS?
В вопросе - одно, в тексте - другое.
Vxd ни при чем, если речь о XP.
ReadFile тебе будет достаточно. Открываешь volume или диск (а что тебе нужно-то?) как файл и читай.
Можешь, конечно, через DeviceIoControl, но, думаю, если такие вопросы возникают, то это будет не по зубам. Если все же очень хочется, то смотри DDK, там, помнится, был пример чтения/записи диска через DeviceIoControl (не на Delphi, естественно) для SCSI используя SPTI (в Win2k DDK он лежит в storage/class/spti, как в других DDK - не знаю, может и не быть).
← →
Vcoder (2002-12-29 15:41) [4]
> Я так и не понял: так под XP надо или все-таки под DOS?
Желательно под win, также желательно, чтобы работало и в 9х, и в 2к/XP.
О DOS-е упомянул, т.к. понимаю, что низкоуровневые дисковые операции в винде не приветствуются.
← →
Alex Konshin (2002-12-31 09:43) [5]Что ты понимаешь под диском? Физический диск или все-таки volume(partition)?
Идешь в MSDN, читаешь про функцию CreateFile, там сказано, как открыть файл для диска или тома.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/createfile.asp
Далее попытайся читать с помощью ReadFile. Не уверен, что получится, но если получится, то тебе повезло - больше тебе и не надо ничего. Если же нет, то нужно будет пробовать через BackupRead. В крайнем случае придется через DeviceIoControl читать. Но это, боюсь, будет тебе пока не по зубам.
← →
drpass (2003-01-02 17:35) [6]В 9х получится и традиционно, по-DOSовски. В 2К/ХР не выйдет никак. Можно и не пытаться
← →
Alex Konshin (2003-01-02 17:55) [7]2drpass:
Что значит никак? Я точно знаю, что через DeviceIoControl можно.
Я даже могу сказать, где посмотреть пример, как читать SCSI диск.
Смотри Win2K DDK, пример storage/class/spti (писал на вскидку, могу и промахнуться). Для IDE должно быть аналогично.
Ладно, будет время сам попробую и выложу куда-нибудь.
← →
Alex Konshin (2003-01-03 08:05) [8]Даже через ReadFile вроде получается. Не понятно только, как это проверить - у меня тут дома нет ничего такого, чем можно было бы диск смотреть, да и спать пора.
function readSector( const hDevice : THandle; const sectornum : int64 ) : Boolean;
var
rc : DWORD;
n : DWORD;
pos64 : int64;
rPos64 : int64Rec absolute pos64;
buffer : Array [0..SECTORSIZE-1] of Byte;
begin
FillChar(buffer,SizeOf(buffer),#0);
Result := False;
pos64 := sectornum * SECTORSIZE;
n := Windows.SetFilePointer( hDevice, rPos64.Lo, @rPos64.Hi, FILE_BEGIN );
rc := GetLastError;
if rc<>NO_ERROR then
begin
WriteLn(SysErrorMessage(rc));
Exit;
end;
if n <> rPos64.Lo then
begin
rPos64.Lo := n;
WriteLn("New position = ", pos64 );
end;
if not Windows.ReadFile( hDevice, buffer, SECTORSIZE, n, nil ) then
begin
WriteLn(SysErrorMessage(GetLastError));
Exit;
end;
WriteLn;
WriteLn("Sector #",sectornum);
WriteLn("Success, read ",n," bytes");
WriteLn( Dump( @buffer, n ) );
Result := True;
end;
function OpenHDDAsFile( path : String ) : THandle;
begin
Result := Windows.CreateFile( PChar(path), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 );
end;
var
hDevice : THandle;
begin
hDevice := OpenHDDAsFile("\\.\PhysicalDrive0");
if hDevice=INVALID_HANDLE_VALUE then OutputDebugString(PChar(SysErrorMessage(GetLastError)));
try
readSector(hDevice,0);
readSector(hDevice,1);
readSector(hDevice,2);
readSector(hDevice,3);
readSector(hDevice,64);
readSector(hDevice,100);
readSector(hDevice,1024);
readSector(hDevice,1025);
readSector(hDevice,1024*1024);
finally
CloseHandle(hDevice);
end;
end.
← →
Alex Konshin (2003-01-03 08:20) [9]Блин, все табуляции сожрало... Может так лучше выйдет
function readSector( const hDevice : THandle; const sectornum : int64 ) : Boolean;
var
rc : DWORD;
n : DWORD;
pos64 : int64;
rPos64 : int64Rec absolute pos64;
buffer : Array [0..SECTORSIZE-1] of Byte;
begin
FillChar(buffer,SizeOf(buffer),#0);
Result := False;
pos64 := sectornum * SECTORSIZE;
n := Windows.SetFilePointer( hDevice, rPos64.Lo, @rPos64.Hi, FILE_BEGIN );
rc := GetLastError;
if rc<>NO_ERROR then
begin
WriteLn(SysErrorMessage(rc));
Exit;
end;
if n <> rPos64.Lo then
begin
rPos64.Lo := n;
WriteLn("New position = ", pos64 );
end;
if not Windows.ReadFile( hDevice, buffer, SECTORSIZE, n, nil ) then
begin
WriteLn(SysErrorMessage(GetLastError));
Exit;
end;
WriteLn;
WriteLn("Sector #",sectornum);
WriteLn("Success, read ",n," bytes");
WriteLn( Dump( @buffer, n ) );
Result := True;
end;
function OpenHDDAsFile( path : String ) : THandle;
begin
Result := Windows.CreateFile( PChar(path), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 );
end;
var
hDevice : THandle;
begin
hDevice := OpenHDDAsFile("\\.\PhysicalDrive0");
if hDevice=INVALID_HANDLE_VALUE then OutputDebugString(PChar(SysErrorMessage(GetLastError)));
try
readSector(hDevice,0);
readSector(hDevice,1);
readSector(hDevice,2);
readSector(hDevice,3);
readSector(hDevice,64);
readSector(hDevice,100);
readSector(hDevice,1024);
readSector(hDevice,1025);
readSector(hDevice,1024*1024);
finally
CloseHandle(hDevice);
end;
end.
← →
Korg (2003-01-04 17:48) [10]Был у меня пример для этого дела под НТ-платформы и под 9х вээксдэшник был. Нада?
← →
Alex Konshin (2003-01-04 18:07) [11]Так и это вроде работает. Причем и под 9x работать тоже будет, но не уверен, что можно будет открыть физичский диск (PhysicalDrive вроде не работает на 9x), но тома должны открываться.
Только одно исправление: между if и try нужно вставить else.
Под NT можно еще попытаться сделать тоже самое с помощью DeviceIoControl через контроллер. Если это получиться, то бесправный user сможет читать/писать физический диск. Я давно подозреваю, что в этом месте в NT дыра. По крайней мере серийный номер читать таким способом получается (а напрямую это может сделать только админ).
← →
a_k_v (2003-01-05 08:31) [12]CreateFile
...
Windows 95/98/Me: You cannot open a directory, physical disk, or volume using CreateFile.
MSDN мля
← →
Ihor Osov'yak (2003-01-05 12:02) [13]2 a_k_v (05.01.03 08:31)
под Windows 95/98/Me: 16битная dll или vxd с последующим юзанием int13. На тори вообще-то пример с юзанием int13 через vxd где-то лежал. Навернои сейчас лежит. Поищите. Слегка глючен (к примеру, не более 4 сектора за один заход - там в vxd ошибочка - но на первых порах сойдет)
← →
Vcoder (2003-01-05 19:38) [14]
> Alex Konshin (04.01.03 18:07)
> Так и это вроде работает. Причем и под 9x работать тоже
> будет, но не уверен, что можно будет открыть физичский диск
> (PhysicalDrive вроде не работает на 9x), но тома должны
> открываться.
Расскажи пожалуйста про ТОМА поподробнее. Тот примерчик (см. пред. сообщение) я нашел, но там чтение физического диска. А у меня замысел написать прогу посекторного сохранения/восстановления логического диска.
Либо другой путь: читать из MBR таблицу разделов и исходя из нее определять границы логических дисков. Но я не знаю точно формата этой информации. Может кто подскажет, где взять инфу на эту тему?
← →
Alex Konshin (2003-01-05 21:00) [15]Ну хорошо, пoд Win9x работайте с физическим диском через vwin32.vxd как работали раньше под DOS:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/win9x/devio_2b1v.asp
2Vcoder: Чтобы открыть том под NT/2K/XP просто укажи его имя или букву. Тот же самый пример будет работать, только открывай, например, "\\.\C:"
Получить имена томов можно, напрмер, с помощью FindFirstVolume/FindNextVolume/FindVolumeClose, но они работают только в 2K/XP.
Получить информацию про partition можно, например, через DeviceIoControl c кодом IOCTL_DISK_GET_DRIVE_LAYOUT или IOCTL_DISK_GET_PARTITION_INFO, они должны работать в NT/2K/XP:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/ioctl_disk_get_drive_layout.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/ioctl_disk_get_partition_info.asp
Как это все получить на 9x - спрашивайте кого-нибуь другого. Понятно, что можно просто с физ.диска прочитать, но я уже пару лет 9x даже и не видел, так что не берусь это описывать.
← →
Vcoder (2003-01-05 21:27) [16]
> Alex Konshin (05.01.03 21:00)
Большое спасибо за подробные и развернутые ответы. Буду переваривать информацию.
ЗЫ. Но все же охота, чтобы моя программа работала и в 9x...
← →
Ihor Osov'yak (2003-01-06 20:27) [17]2 Alex Konshin (05.01.03 21:00)
на Ваше http://msdn.microsoft.com/library/default.asp?url=/library/en-us/win9x/devio_2b1v.asp
смею заменить, что INT13 через vwin32.vxd успешно работает только для флопи, для HDD нет (проверялось на практике). Эту фичу даже признавала MS, в редакции MSDN 2000 года была такая статья под номером ID: Q137176 и заголовком PRB: DeviceIoControl Int 13h Does Not Support Hard Disks... В редакции от 2002 это исчезло.
Собственно мой постинг от (05.01.03 12:02) в части под Windows 95/98/Me и 16 битной dll - идея оттуда..
← →
xn0bys (2003-01-09 08:38) [18]Люди, помогите и мне что-ли, PLZZZZZZ!!!!
у меня провайдером закрыт доступ на microsoft.com
дайте пожалуйста ссылочку куда-нить еще ( или на мыло),
мне надо какраз для FDD (т.е. INT13).
← →
xn0bys (2003-01-09 13:24) [19]Уже не надо, спасибо.
← →
Repear (2003-01-14 11:21) [20]Народ все это замечательно
а вот если возникла проблема с тем что винт вроде как определяется но масдай его не видит (даже ХР) или открыть том не может... имеет ли смысл рассматривать и разбирать эту проблему в данном направлении или ничего из этого не выйдет...
ЗЫ Я конечно буду пытаться но не хотелось бы падать в бесконечную дыру....
← →
Alex Konshin (2003-01-14 19:14) [21]Если винчестер сломался, то чтобы вытащить информацию попробуй Tiramisu (теперь ее купил OnTrack, и она как-то по-другому называется, уверен, что кто-нибудь меня поправит).
← →
bak (2003-01-16 09:36) [22]Easy Recovery 5.12 или 6.0 :)
зы это не реклама!
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2003.03.13;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.008 c