Re: Как читать с диска???
От: Slicer [Mirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 31.12.03 07:04
Оценка: 5 (1)
С Новым Годом!

Семейство 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(&reg)) 
        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
Специалист — это варвар, невежество которого не всесторонне :)
Re[2]: Как читать с диска???
От: Arioch  
Дата: 30.12.03 21:25
Оценка: :)
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
Как читать с диска???
От: Nomolos  
Дата: 30.12.03 20:15
Оценка:
Раз уж меня так невзлюбил модератор мастеров делфи, буду выражаться здесь.
Как силами D7 можно иметь прямой доступ к любому диску (от флоппи до нжмд)? Мне очень надо.
Re: Как читать с диска???
От: Аноним  
Дата: 30.12.03 20:54
Оценка:
Здравствуйте, Nomolos, Вы писали:

N>Раз уж меня так невзлюбил модератор мастеров делфи, буду выражаться здесь.

N>Как силами D7 можно иметь прямой доступ к любому диску (от флоппи до нжмд)? Мне очень надо.

Еще осталось объяснить, что ты подразумеваешь под прямым доступом к диску
и может кто что присоветует.
Re[2]: Как читать с диска???
От: Arioch  
Дата: 31.12.03 08:56
Оценка:
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
Re: Re: Как читать с диска???
От: Nomolos  
Дата: 31.12.03 21:12
Оценка:
Что-то вы всё в дебри. Вот в HexWorkshop 3.1 есть опция "Load Drive". Хотелось бы примерно так же.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.