На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
  
> Ввод/вывод с диском по секторам
    Пытаюсь организовать ввод/вывод с диском по секторам (в Win98[tt][/tt]).
    Пока выдаётся ошибка, но дискета в дисководе уже дёргается :). Действо происходит с помощью VxD-шки vwin32. Т.е. открываю \\.\vwin32 через CreateFile, а затем DeviceIoControl'ом за-lock-иваю девайс, пытаюсь читать (через ax=440Dh,cx=4861h/0861h), а затем раз-lock-иваю. Ладно, допустим, я с этим разберусь... Ну это ж всё равно маразм! Хотя бы потому, что там параметры передаются в формате CHS (цилиндр-головка-сектор). А если я захочу прочитать диск > 8Gb, тогда как? Облом? К тому же, в NT вместо этой феньки есть другая: открывается (CreateFile'ом), например, '\\.\C:' или '\\.\PhysicalDrive0'. А что дальше? Читать как обычный файл? Или у DeviceIoControl'а есть какие-то коды для чтения/записи? Должен же быть какой-то сервис (и в 95 и в NT)!
    Кто-нибудь занимался чтением дисков по секторам под винду? (ring0+порты не предлагать!)
    Сообщение отредактировано: 7in -
      Ага, в NT вроде так и есть (открывать '\\.\C:' и читать как файл).
      А в 95/98/ME как? :-/
        C: итд
          Это весь ответ?
          Спасибо, ты мне очень помог, дружище!!!
          Сообщение отредактировано: 7in -
            Может, кто знающий появился?!
              Я давно вот этим пользовался...работало вроде как :)


              хедер:   "mivwin32.h"
              ExpandedWrap disabled
                <br>#ifndef __MY_VWIN32_INTERFACE_CLASS_H__<br>#define __MY_VWIN32_INTERFACE_CLASS_H__<br>/*##########################################################################*/<br>#define VWIN32_DIOC_DOS_IOCTL     1 // Performs the specified MS-DOS device I/O control function (Interrupt 21h Function 4400h through 4411h)<br>#define VWIN32_DIOC_DOS_INT25     2 // Performs the Absolute Disk Read command (Interrupt 25h)<br>#define VWIN32_DIOC_DOS_INT26     3 // Performs the Absolute Disk Write command (Interrupt 26h)<br>#define VWIN32_DIOC_DOS_INT13     4 // Performs Interrupt 13h commands<br>#define VWIN32_DIOC_DOS_DRIVEINFO 6 // Performs Interrupt 21h Function 730X commands<br>/*==========================================================================*/<br>#pragma pack(1) <br>typedef struct _MID {<br>    WORD  m_wInfoLevel;<br>    DWORD m_dwSerialNum;<br>    BYTE  m_cbVolLabel[11];<br>    BYTE  m_cbFileSysType[8];<br>} MID, *PMID;<br>/*--------------------------------------------------------------------------*/<br>typedef struct _BPB<br>{<br>    WORD m_wBytesPerSector;<br>    BYTE m_cbSectorsPerCluster;<br>    WORD m_wReservedSectors;<br>    BYTE m_cbNumberOfFATs;<br>    WORD m_wRootEntries;<br>    WORD m_wTotalSectors;<br>    BYTE m_cbMediaDescriptor;<br>    WORD m_wSectorsPerFAT;<br>    WORD m_wSectorsPerTrack;<br>    WORD m_wHeads;<br>    WORD m_wHiddenSectors;<br>    WORD m_wHiddenSectorsHigh;<br>    WORD m_wBigTotalSectors;<br>    WORD m_wBigTotalSectorsHigh;<br>    WORD m_wBigSectorsPerFat;<br>    WORD m_wBigSectorsPerFatHi;<br>    WORD m_wExtFlags;<br>    WORD m_wFS_Version;<br>    WORD m_wRootDirStrtClus;<br>    WORD m_wRootDirStrtClusHi;<br>    WORD m_wFSInfoSec;<br>    WORD m_wBkUpBootSec;<br>    WORD m_wReserved[6];<br>} BPB, *PBPB;<br>/*--------------------------------------------------------------------------*/<br>typedef struct _DEVICEPARAMETERS<br>{<br>    BYTE           m_cbSpecialFunctions;<br>    BYTE           m_cbDeviceType;<br>    WORD           m_wDeviceAttributes;<br>    WORD           m_wCylinders;<br>    BYTE           m_cbMediaType;<br>    BPB            m_BPB;<br>    BYTE           m_cbRESERVED1[32];<br>    WORD           m_wTrackTableEntries;<br>    BYTE           m_cbSectorTable[1]; // ?? ????? ??????????? ????????? MAX_SECTORS_IN_TRACK ? ????????? A_SECTORTABLE<br>    //EDP_SECTORTABLE          DB MAX_SECTORS_IN_TRACK * SIZE A_SECTORTABLE DUP (?)<br>} DEVICEPARAMETERS, *PDEVICEPARAMETERS;<br>/*--------------------------------------------------------------------------*/<br>typedef struct _ExtGetDiskFreeSpaceStruct<br>{<br>    WORD           m_wSize;<br>    WORD           m_wLevel;<br>    DWORD          m_dwSectorsPerCluster;<br>    DWORD          m_dwBytesPerSector;<br>    DWORD          m_dwAvailableClusters;<br>    DWORD          m_dwTotalClusters;<br>    DWORD          m_dwAvailablePhysSectors;<br>    DWORD          m_dwTotalPhysSectors;<br>    DWORD          m_dwAvailableAllocationUnits;<br>    DWORD          m_dwTotalAllocationUnits;<br>    DWORD          m_dwReserved[2];<br>} ExtGetDiskFreeSpaceStruct, *PExtGetDiskFreeSpaceStruct;<br>#pragma pack()<br>/*##########################################################################*/<br>class MIVWIN32<br>{<br>public:<br><br>#pragma pack(1)<br>    typedef struct _DIOC_REGISTERS<br>      {<br>        DWORD reg_EBX;<br>        DWORD reg_EDX;<br>        DWORD reg_ECX;<br>        DWORD reg_EAX;<br>        DWORD reg_EDI;<br>        DWORD reg_ESI;<br>        DWORD reg_Flags;<br>    } DIOC_REGISTERS, *PDIOC_REGISTERS;<br><br>      typedef struct _DISKIO<br>      {<br>            DWORD m_dwStartSector;   //sector number to start<br>            WORD  m_dwSectors;       //number of sectors<br>            void* m_lpBuffer;        //address of buffer<br>            /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/<br>            _DISKIO(DWORD ss, WORD sc, void *pb)<br>                  : m_dwStartSector(ss), m_dwSectors(sc), m_lpBuffer(pb) {}<br>            void Set(DWORD ss, WORD sc, void *pb)<br>            {<br>                  m_dwStartSector = ss; m_dwSectors = sc; m_lpBuffer = pb;<br>            }<br>      } DISKIO, *PDISKIO;<br>#pragma pack()<br><br>    MIVWIN32();<br>    ~MIVWIN32();<br><br>    bool operator!() { return m_hDevice == INVALID_HANDLE_VALUE; }<br>    bool OK()        { return m_hDevice != INVALID_HANDLE_VALUE; }<br><br>    bool GetMediaInfo(int drive, PMID mid);<br>    bool GetDriveInfo(int drive, PDEVICEPARAMETERS devpars);<br>    bool ExtGetDiskFreeSpace(<br>        const char *drive, PExtGetDiskFreeSpaceStruct dfs);<br>      int DiskAbsRead(<br>            int drive, DWORD dwStartSector, WORD wSectors, void *lpBuffer)<br>      { return DiskAbsIO( drive, dwStartSector, wSectors, lpBuffer, true); }<br><br>      int DiskAbsWrite(<br>            int drive, DWORD dwStartSector, WORD wSectors, void *lpBuffer)<br>      { return DiskAbsIO( drive, dwStartSector, wSectors, lpBuffer, false); }<br><br>private:<br>      int      DiskAbsIO( <br>            int drive, DWORD dwStartSector, WORD wSectors, void *lpBuffer, bool bRead);<br><br>private:<br>    HANDLE m_hDevice;<br><br>    MIVWIN32(MIVWIN32&) {}<br>    MIVWIN32& operator = (MIVWIN32&) { return *this; }<br>};<br>/*##########################################################################*/<br>#endif<br>


              реализация:  "mivwin32.cpp"
              ExpandedWrap disabled
                <br>/*##########################################################################*/<br>#include <windows.h><br>#include <tchar.h><br>#include <string.h><br>#pragma hdrstop<br>#include "mivwin32.h"<br>/*##########################################################################*/<br>MIVWIN32::MIVWIN32()<br>    : m_hDevice(INVALID_HANDLE_VALUE)<br>{<br>    m_hDevice = CreateFile("\\\\.\\vwin32",<br>        0, 0, NULL, 0, FILE_FLAG_DELETE_ON_CLOSE, NULL);<br>}<br>/*--------------------------------------------------------------------------*/<br>MIVWIN32::~MIVWIN32()<br>{<br>    CloseHandle(m_hDevice);<br>}<br>/*--------------------------------------------------------------------------*/<br>bool MIVWIN32::GetMediaInfo(int drive, PMID mid)<br>{<br>    if(!*this) return false;<br><br>    BOOL            fResult;<br>    DIOC_REGISTERS  reg;<br>    DWORD           cb;<br><br>    reg.reg_EAX   = 0x440D;            // IOCTL for block devices<br>    reg.reg_EBX   = drive;             // zero-based drive identifier<br>    reg.reg_ECX   = 0x4866;            // Get Media ID command<br>    reg.reg_EDX   = (DWORD) mid;       // receives media identifier information<br>    reg.reg_Flags = 0x0001;            // assume error (carry flag is set)<br><br>    fResult = DeviceIoControl(m_hDevice, VWIN32_DIOC_DOS_IOCTL,<br>        &reg, sizeof(reg), &reg, sizeof(reg), &cb, 0);<br><br>    return fResult && !(reg.reg_Flags & 0x0001);<br>}<br>/*--------------------------------------------------------------------------*/<br>bool MIVWIN32::GetDriveInfo(int drive, PDEVICEPARAMETERS devpars)<br>{<br>    if(!*this) return false;<br>    <br>    BOOL            fResult;<br>    DIOC_REGISTERS  reg;<br>    DWORD           cb;<br><br>    reg.reg_EAX   = 0x440D;            // IOCTL for block devices<br>    reg.reg_EBX   = drive;             // zero-based drive identifier<br>    reg.reg_ECX   = 0x4860;            // Get Device Parameters command<br>    reg.reg_EDX   = (DWORD) devpars;   // receives device information<br>    reg.reg_Flags = 0x0001;            // assume error (carry flag is set)<br><br>    fResult = DeviceIoControl(m_hDevice, VWIN32_DIOC_DOS_IOCTL,<br>        &reg, sizeof(reg), &reg, sizeof(reg), &cb, 0);<br><br>    return fResult && !(reg.reg_Flags & 0x0001);<br>}<br>/*--------------------------------------------------------------------------*/<br>bool MIVWIN32::ExtGetDiskFreeSpace(<br>    const char *drive, PExtGetDiskFreeSpaceStruct dfs)<br>{<br>    if(!*this) return false;<br>    <br>    BOOL            fResult;<br>    DIOC_REGISTERS  reg;<br>    DWORD           cb;<br><br>    reg.reg_EAX   = 0x7303;            // IOCTL for block devices<br>    reg.reg_ECX   = sizeof(ExtGetDiskFreeSpaceStruct); // size of struct<br>    reg.reg_EDX   = (DWORD) drive;     // string drive's name<br>    reg.reg_EDI   = (DWORD) dfs;       // receives extended disk usage information<br>    reg.reg_Flags = 0x0001;            // assume error (carry flag is set)<br><br>    fResult = DeviceIoControl(m_hDevice, VWIN32_DIOC_DOS_DRIVEINFO,<br>        &reg, sizeof(reg), &reg, sizeof(reg), &cb, 0);<br><br>    return fResult && !(reg.reg_Flags & 0x0001);<br>}<br>/*--------------------------------------------------------------------------*/<br>int      MIVWIN32::DiskAbsIO( <br>      int drive, DWORD dwStartSector, WORD wSectors, void *lpBuffer, bool bRead)<br>{<br>      DISKIO          dio(dwStartSector, wSectors, lpBuffer);<br>      BOOL            fResult;<br>    DIOC_REGISTERS  reg;<br>    DWORD           cb;<br><br>      reg.reg_EAX   = 0x7305;            // IOCTL for block devices: Ext_ABSDiskReadWrite<br>      reg.reg_EBX   = reinterpret_cast<DWORD>( &dio );<br>    reg.reg_ECX   = (DWORD) -1;        // cx must be -1<br>    reg.reg_EDX   = (DWORD) drive;     // string drive's name<br>      reg.reg_ESI   = bRead ? 0 : 1;     // SI=0 for write / SI=1 for write<br>    reg.reg_Flags = 0x0001;            // assume error (carry flag is set)<br><br>      fResult = DeviceIoControl(m_hDevice, VWIN32_DIOC_DOS_DRIVEINFO,<br>        &reg, sizeof(reg), &reg, sizeof(reg), &cb, 0);<br><br>      return (fResult && !(reg.reg_Flags & 0x0001)) ? 0 : reg.reg_EAX & 0xFFFF;<br>}<br>/*##########################################################################*/<br>
              Сообщение отредактировано: AlexSm -
              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0326 ]   [ 15 queries used ]   [ Generated: 17.05.24, 13:12 GMT ]