Текущий архив: 2004.02.17;
Скачать: CL | DM;
Вниз
Как записать/читать физический сектор на диске под Win98/NT/2000 Найти похожие ветки
← →
kvit © (2003-12-12 23:51) [0]Как записать/читать физический сектор на диске под Win98/NT/2000?
Я знаю, что это делается с помощью функций WriteFile, ReadFile,
но хотелось бы получить рабочий код программы
← →
Ihor Osov'yak © (2003-12-13 02:42) [1]в мсдн на эту тему очень подробно. Даже в делфийском хелпе к CreateFile. Если внимательно почитать. Да, нужны права администратора.
Для w9x такое решение не пойдет.
← →
Ihor Osov'yak © (2003-12-13 02:47) [2]Для w9x - старый добрый int13, который, впрочем, при вызове с win32 посредством "DIOC device" (\\.\VWIN32) ничего не сделает.. В большинстве источников на єтом внимания не акцентируется. И только в одной маленькой статье в msdn есть упоминание об этом факте, с рекомендацией вызывать int13 из 16-битной dll или vxd.
← →
kvit © (2003-12-13 12:14) [3]Вот моя нерабочая функция! Может кто рассмотрит ее работу и укажет на ошибки!?
----------
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;
← →
kvit © (2003-12-13 12:21) [4]моя функция выдает ошибки по hDevice = INVALID_HANDLE_VALUE
из под win98/2000pro.
GetLastError() возвращает ошибку
53L: ERROR_BAD_NETPATH
← →
Ihor Osov'yak © (2003-12-13 12:32) [5]2 [4] kvit © (13.12.03 12:21)
Во первых, уточнение к [2] - ничего не сделает для HDD, для флопи, кажется, работает.. Я не обратил внимания на то, что ті ведешь речь о дисках вообще...
Отросительно [3].
С первого взгляда - не \\\\.\\ а \\.\ - немного более аккуратно из си перереводите.. А более детально - лень сейчас смотреть.. Сделайте замену
"\\\\.\\" -> "\\.\", то есть не "\\\\.\\vwin32", а "\\.\VWIN32" и так далее, а потом посмотрим еще..
← →
kvit © (2003-12-14 01:15) [6]да заменил "\\\\.\\vwin32", а "\\.\VWIN32" ==> под Win98 заработало (я совсем выбросил из головы, что "\\" в Си - это "\"в делфи, давно на си не писал, но Борландовскую функцию BIOS_DISK помню )
Страницы: 1 вся ветка
Текущий архив: 2004.02.17;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.022 c