Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Прочитать/записать сектор hdd  (Прочитано 5139 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Alexey
Гость
« : 19-03-2005 05:27 » 

Как можно прочитать/записать сектор hdd под Win9x (в том числе MBR)? С учетом того, что винт может быть не разбит.
Записан
xelos
Гость
« Ответ #1 : 21-03-2005 09:09 » 

когда-то давно делал проект, где с датчика писались данные на CompactFlash - реализовывать FAT16/32 не было времени, пришлось свою файловую систему придумывать для карточки. Прога потом считывала "файлы" с карточки следующим способом:
Код:
char * CDiskViewDoc::ReadSector(int drive, DWORD startinglogicalsector, int numberofsectors)
{
 // All msdos data structures must be packed on a 1 byte boundary
 #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 ;

 // Creating handle to vwin32.vxd (win 9x)
 hDevice = CreateFile ( "\\\\.\\vwin32",
 0,
 0,
 NULL,
 0,
 FILE_FLAG_DELETE_ON_CLOSE,
 NULL );

 if ( hDevice == INVALID_HANDLE_VALUE )
 {

// win 2k code
HANDLE hDevice;
DWORD bytesread;
   
// Creating a handle to drive a: using CreateFile () function ..
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;

// Setting the pointer to point to the start of the sector we want to read ..
SetFilePointer (hDevice, (startinglogicalsector*512), NULL, FILE_BEGIN);

if (!ReadFile (hDevice, buffer, 512*numberofsectors, &bytesread, NULL) )
 return NULL;
 }
 else
 {
 // code for win 95/98
 ControlBlock.StartingSector = (DWORD)startinglogicalsector;
 ControlBlock.NumberOfSectors = (DWORD)numberofsectors ;
 ControlBlock.pBuffer =  (DWORD)buffer ;

//-----------------------------------------------------------
// SI contains read/write mode flags
// SI=0h for read and SI=1h for write
// CX must be equal to ffffh for
// int 21h's 7305h extention
// DS:BX -> base addr of the
// control block structure
// DL must contain the drive number
// (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;
}
как видно из кода под ВинNT все очень просто - доступ к диску как к файлу организован, под 98 приходится пользовать vwin32.vxd
« Последнее редактирование: 19-12-2007 21:25 от Алексей1153++ » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines