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

Вниз

Как в Делфи вызвать прерывание ? Например, прочесть сектор.   Найти похожие ветки 

 
Winni   (2003-02-22 15:22) [0]

Всем большой привет ! С праздником !
Вероятно, я сильно отстал. В Турбо Паскале были прерывания для
решения специфических вопросов. А теперь как это делается?
Например, прочесть сектор или отформатировать по хитрому или еще
чего-нибудь ?


 
Mike_Goblin   (2003-02-22 15:47) [1]

Никак. Это связано не с Delphi, а с архитектурой Windows. В Windows (в отличии от DOS) пользовательские программы не могут работать напрямую с прерываниями


 
Ihor Osov'yak   (2003-02-22 16:28) [2]

поищи в msdn по ключевым словам VWIN32 VxD:
Windows 95/98 does not support opening disk drives or partitions with the CreateFile() function as Windows NT does. Windows 9x does not support the DeviceIoControl() IOCTL APIs as Windows NT does. Instead, low-level disk access in Windows 9x is supported through DeviceIoControl() calls to the VWIN32 VxD, which supports a set of control codes that applications can use to issue low-level disk I/O functions. These functions include interrup 13h, interrupt 25h, interrupt 26h, interrupt 21h function 44xx and function 730x.

И то про INT13 не все правда. Правда только в части FDD. А для HDD этот путь с Win32 закрыт...




 
Winni   (2003-02-22 18:00) [3]

Спасибо, это уже что-то...Правда, нет у меня и этого MSDN, наверное, придется купить. Пользуюсь справкой Делфи и еще какой-то, возможно, из SDK - для функций WinAPI. Наверное там еще Win16.


 
Ihor Osov'yak   (2003-02-22 18:09) [4]

msdn.microsoft.com


 
.::D.e.M.o.N.i.X::.   (2003-02-22 18:26) [5]

У мя есть пример для чтения секторов БЕЗ VxD - ДРАЙВЕРА!!!


 
Ihor Osov'yak   (2003-02-22 19:17) [6]

> .::D.e.M.o.N.i.X::. © (22.02.03 18:26)

Под NT/W2K/XP - без никаких проблем.
Для W9X - через VWIN32 VxD имуляция INT13 - только для флопи,
имуляция Int24/25 не проверял - ибо доступ только к логическим томам, а не ко всему дисковому пространству, то есть метод отброшен ввиду "непригодности".

Для полноценного доступа ко всему дисковому пространству через Int13 под W9X - дергание последнего из vxd либо из 16-битной dll, есть еще такой извратный способ.
Других способов нет. Ну не будем же рассматривать способ через регистры контролера :-).


 
.::D.e.M.o.N.i.X::.   (2003-02-22 19:31) [7]

Ловите!!!

{$A-}
unit D_IOCTL;

{ Этот модуль содержит IOCTL MS-DOS функции, вызываемые из Windows 95/98/ME Win32 API приложения. Для WinNT используется другой метод вызова!!! }

interface

uses Windows, SysUtils;

type
PDiskIO = ^TDiskIO;
TDiskIO = packed record
diStartSector: Longint; //sector number to start
diSectors: Word; //number of sectors
diBuffer: Longint; //address of buffer
end;

const
{ Main constants declarations }
VWIN32_DIOC_DOS_IOCTL = 1; { MS-DOS Int 21h 44xxh functions call }
VWIN32_DIOC_DOS_INT25 = 2; { MS-DOS Int 25h function call }
VWIN32_DIOC_DOS_INT26 = 3; { MS-DOS Int 26h function call }
VWIN32_DIOC_DOS_INT13 = 4; { MS-DOS Int 13h functions call }
VWIN32_DIOC_DOS_DRIVEINFO = 6; {MS-DOS Int 21h function 730X}
type
{ Definition for 32-bit processor registers.
Note: for Win32 all data segment registers are assumed to the single
segment and does not require to be changed! }
P32Regs = ^T32Regs;
T32Regs = record
EBX: Longint;
EDX: Longint;
ECX: Longint;
EAX: Longint;
EDI: Longint;
ESI: Longint;
Flags: Longint;
end;

TWin95 = (Win95, OSR2, NoWin95);

TLockType = (lPhysical, lLogical);

PBPB = ^TBPB;
TBPB = packed record
bpbSectorSize: Word;
bpbSectorsPerCluster: Byte;
bpbReservedSectors: Word;
bpbFATCount: Byte;
bpbRootDirEntries: Word;
bpbTotalSectors: Word;
bpbMediaDescriptor: Byte;
bpbSectorsPerFAT: Word;
bpbSectorsPerTrack: Word;
bpbHeads: Word;
bpbHiddenSectors: Longint;
bpbBigTotalSectors: Longint;
end;
-->>


 
.::D.e.M.o.N.i.X::.   (2003-02-22 19:32) [8]

>>--
PExt_BPB = ^TExt_BPB;
TExt_BPB = packed record
bpbSectorSize: Word;
bpbSectorsPerCluster: Byte;
bpbReservedSectors: Word;
bpbFATCount: Byte;
bpbRootDirEntries: Word;
bpbTotalSectors: Word;
bpbMediaDescriptor: Byte;
bpbSectorsPerFAT: Word;
bpbSectorsPerTrack: Word;
bpbHeads: Word;
bpbHiddenSectors: Longint;
bpbBigTotalSectors: Longint;
bpbBigSectorsPerFAT: Longint;
bpbExtFlags: Word;
bpbFSVersion: Word;
bpbRootDirStartCluster: Longint;
bpbFSInfoSec: Word;
bpbBkUpBootSec: Word;
bpbReserved: array[1..6] of Byte;
end;

PDeviceParams = ^TDeviceParams;
TDeviceParams = packed record
dpSpecialFunctions: Byte;
dpDeviceType: Byte;
dpDeviceAttributes: Word;
dpNumberOfCylinders: Word;
dpMediaType: Byte;
dpBPB: TBPB;
dpSectorsPerTrack: Word;
dpHeads: Word;
dpHiddenSectors: Word;
dpReserved1: Longint;
dpReserved2: Longint;
dpReserved3: Word;
dpDeviceBPBSize: Byte; {31}
dpSectorsCount: Word;
dpSectorNoSectorSize: array[0..$FFFF] of Longint;
end;

PExt_DeviceParams = ^TExt_DeviceParams;
TExt_DeviceParams = packed record
dpSpecialFunctions: Byte;
dpDeviceType: Byte;
dpDeviceAttributes: Word;
dpNumberOfCylinders: Word;
dpMediaType: Byte;
dpBPB: TExt_BPB;
dpReserved_: array[0..31] of Byte;
dpSectorsCount: Word;
dpSectorNoSectorSize: array[0..$FFFF] of Longint;
end;

PDriveMapInfo = ^TDriveMapInfo;
TDriveMapInfo = packed record
dmiAllocationLength: Byte;
dmiInfoLength: Byte;
dmiFlags: Byte;
dmiInt13Unit: Byte;
dmiAssociatedDriveMap: Longint;
dmiPartitionStartRBA: Longint;
dmiPartitionStartRBAHi: Longint;
end;

PBOOTSECT = ^TBOOTSECT;
TBOOTSECT = record
bsJump: array [1..3] of Byte; // jmp instruction
bsOemName: array [1..8]of Char; // OEM name and version
// This portion is the BPB (BIOS Parameter Block)
bsBytesPerSec: Word; // bytes per sector
bsSecPerClust: Byte; // sectors per cluster
bsResSectors: Word; // number of reserved sectors
bsFATs: Byte; // number of file allocation tables
bsRootDirEnts: Word; // number of root-directory entries
bsSectors: Word; // total number of sectors
bsMedia: Byte; // media descriptor
bsFATsecs: Word; // number of sectors per FAT
bsSecPerTrack: Word; // number of sectors per track
bsHeads: Word; // number of read/write heads
bsHiddenSectors: Longint; // number of hidden sectors
bsHugeSectors: Longint; // number of sectors if bsSectors==0
// End of BPB

bsDriveNumber: Byte; // 80h if first hard drive
bsReserved: Byte;
bsBootSignature: Byte; // 29h if extended boot-signature record
bsVolumeID: Longint; // volume ID number
bsVolumeLabel: array [1..11] of Char; // volume label
bsFileSysType: array [1..8] of Char; // file-system type (FAT12 or FAT16)
end;

PDIRENTRY = ^TDIRENTRY;
TDIRENTRY = record
deName: array [1..8] of Char; // base name
deExtension: array [1..3] of Char; // extension
deAttributes: Byte; // file or directory attributes
deReserved: array [1..6] of Byte;
deLastAccessDate: Word; // *New Win95* - last access date
deEAhandle: Word; // *New FAT32* - high word of starting cluster
deCreateTime: Word; // creation or last modification time
deCreateDate: Word; // creation or last modification date
deStartCluster: Word; // starting cluster of the file or directory
deFileSize: Longint; // size of the file in bytes
end;

PLONGDIRENTRY = ^TLONGDIRENTRY;
TLONGDIRENTRY = record
leSequence: Byte; // sequence byte:1,2,3,..., last entry is or"ed with 40h
leName: array [1..5] of WChar; // Unicode characters of name
leAttributes: Byte; // Attributes: 0fh
leType: Byte; // Long Entry Type: 0
leChksum: Byte; // Checksum for matching short name alias
leName2: array [1..6] of WChar; // More Unicode characters of name
leZero: Word; // reserved
leName3: array [1..2] of WChar; // More Unicode characters of name
end;
-->>


 
.::D.e.M.o.N.i.X::.   (2003-02-22 19:33) [9]

>>--
////////////////// FAT32 Structures ///////////////////

// BPB for a Fat32 partition
PA_BF_BPB = ^TA_BF_BPB;
TA_BF_BPB = record
A_BF_BPB_BytesPerSector: Word;
A_BF_BPB_SectorsPerCluster: Byte;
A_BF_BPB_ReservedSectors: Word;
A_BF_BPB_NumberOfFATs: Byte;
A_BF_BPB_RootEntries: Word;
A_BF_BPB_TotalSectors: Word;
A_BF_BPB_MediaDescriptor: Byte;
A_BF_BPB_SectorsPerFAT: Word;
A_BF_BPB_SectorsPerTrack: Word;
A_BF_BPB_Heads: Word;
A_BF_BPB_HiddenSectors: Word;
A_BF_BPB_HiddenSectorsHigh: Word;
A_BF_BPB_BigTotalSectors: Word;
A_BF_BPB_BigTotalSectorsHigh: Word;
A_BF_BPB_BigSectorsPerFat: Word;
A_BF_BPB_BigSectorsPerFatHi: Word;
A_BF_BPB_ExtFlags: Word;
A_BF_BPB_FS_Version: Word;
A_BF_BPB_RootDirStrtClus: Word;
A_BF_BPB_RootDirStrtClusHi: Word;
A_BF_BPB_FSInfoSec: Word;
A_BF_BPB_BkUpBootSec: Word;
A_BF_BPB_Reserved: array [1..6] of Word;
end;

PBOOTSECT32 = ^TBOOTSECT32;
TBOOTSECT32 = record
bsJump: array [1..3] of Byte; // jmp instruction
bsOemName: array [1..8] of Char; // OEM name and version

// This portion is the FAT32 BPB
bpb: TA_BF_BPB;

bsDriveNumber: Byte; // 80h if first hard drive
bsReserved: Byte;
bsBootSignature: Byte; // 29h if extended boot-signature record
bsVolumeID: Longint; // volume ID number
bsVolumeLabel: array [1..11] of Char; // volume label
bsFileSysType: array [1..8] of Char; // file-system type (FAT32)
end;

PMID = ^TMID;
TMID = record
midInfoLevel: Word; // information level, must be 0
midSerialNum: Longint; // serial number for the medium
midVolLabel: array [1..11] of Char; // volume label for the medium
midFileSysType: array [1..8] of Char; // type of file system as 8-byte ASCII
end;

TPASMID = record
midInfoLevel: Word; // information level, must be 0
midSerialNum: Longint; // serial number for the medium
midVolLabel: String[255]; // volume label for the medium
midFileSysType: String[255]; // type of file system as 8-byte ASCII
end;
-->>


 
.::D.e.M.o.N.i.X::.   (2003-02-22 19:34) [10]

>>--
{ Main procedures }

{Check Windows 95 version}
function CheckWindows95: TWin95;

procedure TMID2TPASMID(MID: TMID; var AMID: TPASMID);

implementation

procedure TMID2TPASMID(MID: TMID; var AMID: TPASMID);
var I: Longint;
begin
AMID.midInfoLevel := MID.midInfoLevel;
AMID.midSerialNum := MID.midSerialNum;
AMID.midVolLabel[0] := #11;
for I := 1 to 11 do AMID.midVolLabel[I] := MID.midVolLabel[I];
while (AMID.midVolLabel[0] <> #0) and (AMID.midVolLabel[Byte(AMID.midVolLabel[0])]=" ") do
Dec(Byte(AMID.midVolLabel[0]));
AMID.midFileSysType[0] := #8;
for I := 1 to 8 do AMID.midFileSysType[I] := MID.midFileSysType[I];
while (AMID.midFileSysType[0] <> #0) and (AMID.midFileSysType[Byte(AMID.midFileSysType[0])]=" ") do
Dec(Byte(AMID.midFileSysType[0]));
AMID.midVolLabel := UpperCase(AMID.midVolLabel);
AMID.midFileSysType := UpperCase(AMID.midFileSysType);
end;

function CheckWindows95: TWin95;
var V: TOSVersionInfo;
begin
V.dwOSVersionInfoSize := SizeOf(V);
Result := NoWin95;
if not GetVersionEx(V) then Exit;
if V.dwPlatformId <> 1 then Exit;
if V.dwBuildNumber > 1080 then Result := OSR2
else Result := Win95;
end;

end.

Теперь усё понятно?
P.S.Тестилось на Win 95/98/98SE/ME


 
Ihor Osov'yak   (2003-02-22 19:40) [11]

Уймитесь, молодой человек.
Взгляните сюда: Ihor Osov"yak © (22.02.03 19:17)

И в завершение, прочитайте с помощью кода, приведенного вами, к примеру, нулевой физический сектор первого жесткого диска. Для тех, кто на бронепоезде, подчеркиваю - нулевой жесткого, а не диска с:.


 
Ihor Osov'yak   (2003-02-22 19:50) [12]

Блин, сори, что не дождался конца неудержания от х.а.ц.к.е.р.а,
когда давал пред. постинг свой...

Ув., но не очень, тов. х.а.ц.к.е.р. Вы сами то поняли, что запостили?


 
.::D.e.M.o.N.i.X::.   (2003-02-22 20:23) [13]


> Взгляните сюда: Ihor Osov"yak © (22.02.03 19:17)


ССоРи, не заметил как-то, а насчет
> подчеркиваю - нулевой жесткого, а не диска с:.

то это и ежу понятно, что нужно
> Для полноценного доступа ко всему дисковому пространству
> через Int13 под W9X - дергание последнего из vxd


P.S.
> тов. х.а.ц.к.е.р
кто? Я что ли? Мне до него как до луны:-)



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

Форум: "Основная";
Текущий архив: 2003.03.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.62 MB
Время: 0.059 c
6-17242
Глеб
2003-01-08 03:20
2003.03.06
Вопрос по работе с сетью в Delphi


7-17424
Miwa
2003-01-06 17:33
2003.03.06
Мониторинг спулера печати


3-16905
Rom@n
2003-02-15 07:30
2003.03.06
переносимая база данных


3-16873
Валентина
2003-02-17 21:40
2003.03.06
DBF >> MDB


9-16852
CHiF_
2002-10-07 12:57
2003.03.06
dxg формат





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