Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как записать/читать физический сектор на диске под Win98/NT/2000 [D5, Win95/98, WinME, NT4, Win2k, WinXP]


kvit ©   (2003-12-12 23:51:00) 

Как записать/читать физический сектор на диске под Win98/NT/2000?
Я знаю, что это делается с помощью функций WriteFile, ReadFile,
но хотелось бы получить рабочий код программы


kvit   (2003-12-14 01:15:00) [1]

да заменил "\\\\.\\vwin32", а "\\.\VWIN32" ==> под Win98 заработало (я совсем выбросил из головы, что "\\" в Си - это "\"в делфи, давно на си не писал, но Борландовскую функцию BIOS_DISK помню )


Ihor Osov'yak   (2003-12-13 12:32:00) [2]

2 [4] kvit © (13.12.03 12:21)

Во первых, уточнение к [2] - ничего не сделает для HDD, для флопи, кажется, работает.. Я не обратил внимания на то, что ті ведешь речь о дисках вообще...

Отросительно [3].
С первого взгляда - не \\\\.\\ а \\.\ - немного более аккуратно из си перереводите.. А более детально - лень сейчас смотреть.. Сделайте замену

"\\\\.\\" -> "\\.\", то есть не "\\\\.\\vwin32", а "\\.\VWIN32" и так далее, а потом посмотрим еще..


kvit   (2003-12-13 12:21:00) [3]

моя функция выдает ошибки по hDevice = INVALID_HANDLE_VALUE
из под win98/2000pro.
GetLastError() возвращает ошибку
53L: ERROR_BAD_NETPATH


kvit   (2003-12-13 12:14:00) [4]

Вот моя нерабочая функция! Может кто рассмотрит ее работу и укажет на ошибки!?
----------
const
VWIN32_DIOC_DOS_IOCTL = 1;
VWIN32_DIOC_DOS_INT13 = 4; // Performs Interrupt 13h commands.
SectorSize : integer =512;

type
pDIOCRegs = ^TDIOCRegs;
TDIOCRegs = packed record
rEBX,rEDX,rECX,rEAX,rEDI,rESI,rFlags : DWORD;
end;

----------
function ReadSector(Head, Track, Sector: Integer; buffer: pointer; Floppy: char):Boolean;
var hDevice: THandle;
Regs : TDIOCRegs;
DevName: string;
nb : integer;
begin
if WIN32PLATFORM <> VER_PLATFORM_WIN32_NT then
begin {win95/98}
hDevice := CreateFile("\\\\.\\vwin32", GENERIC_READ, FILE_SHARE_READ,
nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hDevice = INVALID_HANDLE_VALUE) then
begin
Result := FALSE;
exit;
end;
regs.rEDX := Head * $100 + Ord(Floppy in ["b", "B"]);
regs.rEAX := $201; // код операции read sector
regs.rEBX := DWORD(buffer); // buffer
regs.rECX := Track * $100 + Sector;
regs.rFlags := $0;
Result := DeviceIoControl(hDevice,VWIN32_DIOC_DOS_INT13, @regs, sizeof(regs), @regs, sizeof(regs), DWORD(nb), nil)
and ( (regs. rFlags and $1)=0);
CloseHandle(hDevice);
end
else // Windows NT
begin
DevName :="\\\\.\\A:";
if Floppy in ["b", "B"] then DevName[5] := Floppy;
hDevice:= CreateFile(pChar(Devname), GENERIC_READ,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) ;
if (hDevice = INVALID_HANDLE_VALUE) then
begin
Result := FALSE;
Exit;
end;
SetFilePointer(hDevice, (Sector-1)*SectorSize, nil, FILE_BEGIN);//нумерация с 1
Result := ReadFile(hDevice, buffer, SectorSize, DWORD(nb), nil) and (nb=SectorSize);
CloseHandle(hDevice) ;
end;
end;


Ihor Osov'yak   (2003-12-13 02:47:00) [5]

Для w9x - старый добрый int13, который, впрочем, при вызове с win32 посредством "DIOC device" (\\.\VWIN32) ничего не сделает.. В большинстве источников на єтом внимания не акцентируется. И только в одной маленькой статье в msdn есть упоминание об этом факте, с рекомендацией вызывать int13 из 16-битной dll или vxd.


Ihor Osov'yak   (2003-12-13 02:42:00) [6]

в мсдн на эту тему очень подробно. Даже в делфийском хелпе к CreateFile. Если внимательно почитать. Да, нужны права администратора.
Для w9x такое решение не пойдет.


Наверх

Титульная страница Поиск, карта сайта Написать письмо