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

Вниз

Чтение MBR   Найти похожие ветки 

 
Мое имя (клоны все равно суксь)   (2003-07-06 03:23) [0]

Проблема с чтением _физического_ диска под вынь9х
никак не могу найти решение
везде приводятся способы чтения _логического_ диска
это там типа 25, 21 прерывания
а доступ к физическому - 13-е, которое работает тока для флопиков
MSDN по этому поводу дает такой пинок:
Resolution
To work around this problem, Win32 applications must thunk to a Win16 DLL and have that DLL call the DOS Protected Mode Interface (DPMI) Simulate Real Mode Interrupt function to call Int 13h BIOS disk functions on hard disks. When you use DPMI to call Int 13h BIOS disk functions, you bypass BIOSXLAT.VXD and call the real-mode BIOS. Note that you cannot call DPMI from 32-bit code.

я ваще мало чо понял из того что тут написано ((
понял тока что я попал))
какие-то сложности блин...
может кто знает другой способ прочитать MBR, кроме как извращения типа написания Win16 DLL или хлопания ушами ;)
может есть какие-то недокументированные возможности?


 
Е-Моё имя   (2003-07-06 03:31) [1]

Удалено модератором
Примечание: Oftopic; в порепаться


 
Игорь Шевченко   (2003-07-07 10:17) [2]

DeviceIoControl не поможет ?


 
Е-Моё имя   (2003-07-07 11:59) [3]

ну да, это через DeviceIoControl делается
используется параметр например
VWIN32_DIOC_DOS_INT25 = 2; { MS-DOS Int 25h function call }
так вот, с этой бедой доступ к физ.диску через 13-е не дается, только к дискете ((


 
NightAngel   (2003-07-08 01:32) [4]

Код для чтения/записи секторов диска. Я думаю, что разберётесь, ничего сложного там нет. У меня работает под все платформы.

Для чтения/записи абсолютных (в том числе и MBR) секторов в Win9x используется int 21h"s 7305h extention(VWIN32_DIOC_DOS_DRIVEINFO - Extended Absolute Disk Read/Write). Для более детальной информации см. Ralf Brown"s interrupt list.

Функция читает [numberofsectors] секторов диска из [drive {0=A,1=B, 2=C, ...}] начиная от [startinglogicalsector].

char * ReadSectors(int drive, DWORD startinglogicalsector, int numberofsectors)
{
#pragma pack (1)
struct
{
DWORD StartingSector;
WORD NumberOfSectors;
DWORD pBuffer;
}ControlBlock;
#pragma pack ()
#pragma pack (1)
typedef struct _DIOC_REGISTERS
{
DWORD reg_EBX;
DWORD reg_EDX;
DWORD reg_ECX;
DWORD reg_EAX;
DWORD reg_EDI;
DWORD reg_ESI;
DWORD reg_Flags;
} DIOC_REGISTERS;
#pragma pack ()
char* buffer = (char*)malloc (512*numberofsectors);
HANDLE hDevice;
DIOC_REGISTERS reg;
BOOL fResult;
DWORD cb;
hDevice = CreateFile ( "\\\\.\\vwin32",
0,
0,
NULL,
0,
FILE_FLAG_DELETE_ON_CLOSE,
NULL );
if ( hDevice == INVALID_HANDLE_VALUE )
{
// Для WinNT/2K/XP
HANDLE hDevice;
DWORD bytesread;
char _devicename[] = "\\\\.\\A:";
_devicename[4] += drive;
hDevice = CreateFile(_devicename,
GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);
if (hDevice == INVALID_HANDLE_VALUE)
return NULL;
SetFilePointer (hDevice, (startinglogicalsector*512), NULL,FILE_BEGIN);
if (!ReadFile (hDevice, buffer, 512*numberofsectors,&bytesread, NULL) )
return NULL;
}
else
{
// Для Win9x
ControlBlock.StartingSector = (DWORD)startinglogicalsector;
ControlBlock.NumberOfSectors = (DWORD)numberofsectors;
ControlBlock.pBuffer = (DWORD)buffer;
//-----------------------------------------------------------
// SI - должен содержать флаг режима read/write
// SI==0h - для чтения SI==1h - для записи
// CX - должен содержать 0FFFFh для int 21h"s 7305h extention
// DS:BX - базовый адресс структуры ControlBlock
// DL - номер диска (01h=A:, 02h=B: etc)
//-----------------------------------------------------------
reg.reg_ESI = 0x00;
reg.reg_ECX = -1;
reg.reg_EBX = (DWORD)(&ControlBlock);
reg.reg_EDX = drive+1;
reg.reg_EAX = 0x7305;
// 6 == VWIN32_DIOC_DOS_DRIVEINFO
fResult = DeviceIoControl ( hDevice,
6,
&(reg),
sizeof (reg),
&(reg),
sizeof (reg),
&cb,
0);
( !fResult || (reg.reg_Flags & 0x0001)
Код для чтения/записи секторов диска. Я думаю, что разберётесь, ничего сложного там нет. У меня работает под все платформы.

Для чтения/записи абсолютных (в том числе и MBR) секторов в Win9x используется int 21h"s 7305h extention(VWIN32_DIOC_DOS_DRIVEINFO - Extended Absolute Disk Read/Write). Для более детальной информации см. Ralf Brown"s interrupt list.

Функция читает [numberofsectors] секторов диска из [drive {0=A,1=B, 2=C, ...}] начиная от [startinglogicalsector].

char * ReadSectors(int drive, DWORD startinglogicalsector, int numberofsectors)
{
#pragma pack (1)
struct
{
DWORD StartingSector;
WORD NumberOfSectors;
DWORD pBuffer;
}ControlBlock;
#pragma pack ()
#pragma pack (1)
typedef struct _DIOC_REGISTERS
{
DWORD reg_EBX;
DWORD reg_EDX;
DWORD reg_ECX;
DWORD reg_EAX;
DWORD reg_EDI;
DWORD reg_ESI;
DWORD reg_Flags;
} DIOC_REGISTERS;
#pragma pack ()
char* buffer = (char*)malloc (512*numberofsectors);
HANDLE hDevice;
DIOC_REGISTERS reg;
BOOL fResult;
DWORD cb;
hDevice = CreateFile ( "\\\\.\\vwin32",
0,
0,
NULL,
0,
FILE_FLAG_DELETE_ON_CLOSE,
NULL );
if ( hDevice == INVALID_HANDLE_VALUE )
{
// Для WinNT/2K/XP
HANDLE hDevice;
DWORD bytesread;
char _devicename[] = "\\\\.\\A:";
_devicename[4] += drive;
hDevice = CreateFile(_devicename,
GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);
if (hDevice == INVALID_HANDLE_VALUE)
return NULL;
SetFilePointer (hDevice, (startinglogicalsector*512), NULL,FILE_BEGIN);
if (!ReadFile (hDevice, buffer, 512*numberofsectors,&bytesread, NULL) )
return NULL;
}
else
{
// Для Win9x
ControlBlock.StartingSector = (DWORD)startinglogicalsector;
ControlBlock.NumberOfSectors = (DWORD)numberofsectors;
ControlBlock.pBuffer = (DWORD)buffer;
//-----------------------------------------------------------
// SI - должен содержать флаг режима read/write
// SI==0h - для чтения SI==1h - для записи
// CX - должен содержать 0FFFFh для int 21h"s 7305h extention
// DS:BX - базовый адресс структуры ControlBlock
// DL - номер диска (01h=A:, 02h=B: etc)
//-----------------------------------------------------------
reg.reg_ESI = 0x00;
reg.reg_ECX = -1;
reg.reg_EBX = (DWORD)(&ControlBlock);
reg.reg_EDX = drive+1;
reg.reg_EAX = 0x7305;
// 6 == VWIN32_DIOC_DOS_DRIVEINFO
fResult = DeviceIoControl ( hDevice,
6,
&(reg),
sizeof (reg),
&(reg),
sizeof (reg),
&cb,
0);
if (!fResult || (reg.reg_Flags & 0x0001)) return NULL;
}
CloseHandle(hDevice);
return buffer;
}

Извините, что на плюсах. На паскаль переводить, нет ни времени ни желания.


 
Е-Моё имя   (2003-07-08 01:45) [5]

позволю себе еще раз уточнить - нужно читать _физический_ диск
7305 21-го читает _логический_, MBR там нет
только с 63-го сектора


 
Игорь Шевченко   (2003-07-08 09:01) [6]

Я не имею Win9x под рукой, но могу предположить, что может помочь вызов функции CreateFile("\\.\PhysicalDrive0", ...), по меньшей мере в MSDN явно не написано, что в Win9x этот вызов не работает...


 
Е-Моё имя   (2003-07-08 09:27) [7]


> Игорь Шевченко © (08.07.03 09:01)

ну да, вроде не написано ;)))
надо будет попробовать...



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

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

Наверх




Память: 0.48 MB
Время: 0.009 c
8-58791
Ricks
2003-05-12 22:22
2003.09.18
JPEG


14-58838
Knight
2003-08-28 21:54
2003.09.18
Взрослеем.... взрослеем...


14-58913
Е-Моё имя
2003-08-28 16:00
2003.09.18
злобные вирьмакеры


1-58725
titnn
2003-09-07 09:00
2003.09.18
а как бы это по красивее сделать ...


7-58952
Cidorov
2003-07-03 22:47
2003.09.18
Как добраться из Delphi 6 к портам PC





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