Форум: "Система";
Текущий архив: 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.008 c