Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.222.3.255] |
|
Сообщ.
#1
,
|
|
|
Пытаюсь организовать ввод/вывод с диском по секторам (в 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+порты не предлагать!) |
Сообщ.
#2
,
|
|
|
Ага, в NT вроде так и есть (открывать '\\.\C:' и читать как файл).
А в 95/98/ME как? :-/ |
Сообщ.
#3
,
|
|
|
C: итд
|
Сообщ.
#4
,
|
|
|
Это весь ответ?
Спасибо, ты мне очень помог, дружище!!! |
Сообщ.
#5
,
|
|
|
Может, кто знающий появился?!
|
Сообщ.
#6
,
|
|
|
Я давно вот этим пользовался...работало вроде как
хедер: "mivwin32.h" <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" <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> ®, sizeof(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> ®, sizeof(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> ®, sizeof(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> ®, sizeof(reg), ®, sizeof(reg), &cb, 0);<br><br> return (fResult && !(reg.reg_Flags & 0x0001)) ? 0 : reg.reg_EAX & 0xFFFF;<br>}<br>/*##########################################################################*/<br> |