Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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.007 c
1-39294
АндрейБ
2003-03-02 03:56
2003.03.13
QuickReport.Preview - масштаб


1-39319
Michael Elagin
2003-02-28 22:24
2003.03.13
Свойства TOleContaner


14-39469
kofman
2003-02-27 00:05
2003.03.13
На скольно юридически законно покупать программу по почте?


1-39357
Nemo
2003-02-27 01:05
2003.03.13
Иконка + кнопка = ?


1-39292
GIL
2003-03-04 04:48
2003.03.13
Динамические массивы и sizeof





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский