С Новым Годом!
Семейство WinNT:
APIшка CreateFile умеет открывать физические устройства и тома, ищите на сайте MSDN.com в разделе Library. Потом с возвращенным хендлом можно работать при помощи ф-ции DeviceIOControl.
Естественно, для этого нужны высокие привилегии (про все написано на MSDN).
Семейство Win95:
Та же CreateFile умеет "открывать" DOS-драйвера устройств, с возвращенными хендлами также можно работать по DeviceIOControl, но тут механизм другой: либо надо подключиться прямо к нужному драйверу и выдавать ему запросы (но проблема в том, что имя драйвера нужного блочного устройства узнать непросто), либо подключаться к драйверу-эмулятору Int21h ("vwin32") и у него уже вызывать функцию IOCTL (регистр EAX=440D) с нужными параметрами, такими, как номер диска, к которому надо выполнить операцию прямого доступа.
Вот код из MSDN для Win95, а для WinNT и самому разобраться сравнительно несложно.
#define VWIN32_DIOC_DOS_IOCTL 1
typedef struct _DEVIOCTL_REGISTERS
{
DWORD reg_EBX;
DWORD reg_EDX;
DWORD reg_ECX;
DWORD reg_EAX;
DWORD reg_EDI;
DWORD reg_ESI;
DWORD reg_Flags;
} DEVIOCTL_REGISTERS, *PDEVIOCTL_REGISTERS;
typedef struct _MID
{
WORD midInfoLevel;
DWORD midSerialNum;
BYTE midVolLabel[11];
BYTE midFileSysType[8];
} MID, *PMID;
BOOL GetMediaID(PMID pmid, UINT nDrive)
{
DEVIOCTL_REGISTERS reg;
reg.reg_EAX = 0x440D; // IOCTL for block devices
reg.reg_EBX = nDrive; // zero-based drive ID
reg.reg_ECX = 0x0866; // Get Media ID command
reg.reg_EDX = (DWORD) pmid; // receives media ID info
if (!DoIOCTL(®))
return FALSE;
if (reg.reg_Flags & 0x8000) // error if carry flag set
return FALSE;
return TRUE;
}
BOOL DoIOCTL(PDEVIOCTL_REGISTERS preg)
{
HANDLE hDevice;
BOOL fResult;
DWORD cb;
preg->reg_Flags = 0x8000; // assume error (carry flag set)
hDevice = CreateFile("\\\\.\\vwin32",
GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
(LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL);
if (hDevice == (HANDLE) INVALID_HANDLE_VALUE)
return FALSE;
else
{
fResult = DeviceIoControl(hDevice, VWIN32_DIOC_DOS_IOCTL,
preg, sizeof(*preg), preg, sizeof(*preg), &cb, 0);
}
CloseHandle(hDevice);
return fResult;
}
Slicer
The stars so gaily glistened... (Tue, 30 Dec 2003 20:54:45 GMT @913)
...while the fading voice of whispered through the darkness:
> и может кто что присоветует.
Небось использовать BIOS int13h под Windows NT :D
--
If i had ears, i'd heard none: WinAMP de-instaled.
http://Arioch.nm.ru/FL/Fidolook_SL.png Mail: the_Arioch<at>nm<dot>ru
Posted via RSDN NNTP Server 1.8 beta
Раз уж меня так невзлюбил модератор мастеров делфи, буду выражаться здесь.
Как силами D7 можно иметь прямой доступ к любому диску (от флоппи до нжмд)? Мне очень надо.
The stars so gaily glistened... (Wed, 31 Dec 2003 07:04:24 GMT @336)
...while the fading voice of Slicer whispered through the darkness:
SM> высокие привилегии (про все написано на MSDN).
для этого нужно диск заблокировать в первую очередь — и вот тут трудности.
Так чт оя бы пробовал Defrag API — хотя не помню, онатолько двигать данные
разрешает или читать тоже.
www.sysinternals.com
--
If i had ears, i'd heard none: WinAMP de-instaled.
http://Arioch.nm.ru/FL/Fidolook_SL.png Mail: the_Arioch<at>nm<dot>ru
Posted via RSDN NNTP Server 1.8 beta
Что-то вы всё в дебри. Вот в HexWorkshop 3.1 есть опция "Load Drive". Хотелось бы примерно так же.