Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Прямой доступ к диску A:

1.9K
01 ноября 2004 года
Volly
57 / / 18.10.2003
Насколько мне известно, в NT системах можно организовать прямой доступ к диску A: без использования каких-то драйверов и т.д. Как это сделать?
319
03 ноября 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by Volly
Насколько мне известно, в NT системах можно организовать прямой доступ к диску A: без использования каких-то драйверов и т.д. Как это сделать?


непонятно что подразумевается под прямым доступом... если чтение конкретного сектора - получаешь хэндл диска через:

 
Код:
char _devicename[] = "\\\\.\\A:";
//  _devicename[4] += drive;
    hDevice = CreateFile(_devicename,
        GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL, OPEN_EXISTING, 0, NULL);

устанавливаешь указатель на нужный сектор:
 
Код:
SetFilePointer (hDevice, (startinglogicalsector*512), NULL, FILE_BEGIN);

и читаешь сектор:
 
Код:
ReadFile (hDevice, buffer, 512*numberofsectors, &bytesread, NULL);

данный способ работает под 2к/хр, в 98 так не получится
1.9K
04 ноября 2004 года
Volly
57 / / 18.10.2003
непонятно что подразумевается под прямым доступом
Работа с диском не через системные функции, а напрямую. По крайней мере в программке WinHex такое возможно, и работает это и под NT, и под 9x. В данном случае мне надо перезаписать загрузочный сектор (первые 512 байт) из программы.
319
04 ноября 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by Volly
непонятно что подразумевается под прямым доступом
Работа с диском не через системные функции, а напрямую. По крайней мере в программке WinHex такое возможно, и работает это и под NT, и под 9x. В данном случае мне надо перезаписать загрузочный сектор (первые 512 байт) из программы.


я тебе привел код, который поможет прочитать и записать загрузочный сектор (WinHex аналогично работает). напиши свою програмку и посмотри, что она тебе афишировать будет - WinHex то же самое покажет.
Для 9х винды данный код работать не будет, т.к. в 9х диск не являлся файлом, необходимо было пользовать обращение к диску через DeviceIOControl.

В инете где-то была подробная статья про это дело.

держи полный код процедуры:

Код:
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;
}
1.9K
07 ноября 2004 года
Volly
57 / / 18.10.2003
А пройдет ли такая же махинация, но для жестких дисков?
319
07 ноября 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by Volly
А пройдет ли такая же махинация, но для жестких дисков?


под хр пройдет - т.к. она не различает тип накопителя, под 9х не тестировал.

1.9K
07 ноября 2004 года
Volly
57 / / 18.10.2003
Если я правильно понимаю, то таким образом можно создавать image файлы дисков и записывать их обратно, не перезагружаясь в другую ОС (MS-DOS, например)?
319
07 ноября 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by Volly
Если я правильно понимаю, то таким образом можно создавать image файлы дисков и записывать их обратно, не перезагружаясь в другую ОС (MS-DOS, например)?


можно

1.9K
07 ноября 2004 года
Volly
57 / / 18.10.2003
В общем-то, это все, что я хотел узнать. Спасибо.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог