Я тут программу написал (скачать можно тут:
http://www.gamedev.ru/files/?id=62606), которая выдаёт информацию о дискете. Вот код на языке C++:
Код:
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <iostream>
#include <string>
#include <sstream>
#include <WinIoCtl.h>
HANDLE file=0;
void Release(void);
int main(const int _paramsCount,const char** _param)
{
DISK_GEOMETRY diskGeometry;
unsigned long int bytesReturn=0;
std::string string;
std::stringstream stream(std::ios::out | std::ios::in);
memset(&diskGeometry,0,sizeof(DISK_GEOMETRY));
std::cout<<std::endl<<"Welcome DInfo!"<<std::endl<<std::endl;
std::cout<<"Connect in device A..."<<std::endl;
file=CreateFile("\\\\.\\A:",GENERIC_READ,0,0,OPEN_EXISTING,0,0);
if(file==INVALID_HANDLE_VALUE)
{
if(GetLastError()==ERROR_FILE_NOT_FOUND)
std::cout<<"Device A not find!"<<std::endl;
else
std::cout<<"Unknown error device A!"<<std::endl;
Release();
return -1;
}
std::cout<<"Successfully connect in device A."<<std::endl<<std::endl;
std::cout<<"Getting info diskette..."<<std::endl;
if(!DeviceIoControl(
file,
IOCTL_DISK_GET_DRIVE_GEOMETRY,
0,
0,
&diskGeometry,
sizeof(DISK_GEOMETRY),
&bytesReturn,
0))
{
std::cout<<"Error getting info diskette!"<<std::endl;
Release();
return -1;
}
std::cout<<"Successfully getting info diskette."<<std::endl<<std::endl;
string.clear();
stream.clear();
stream<<diskGeometry.Cylinders.QuadPart;
stream>>string;
std::cout<<"Cylinders: "<<string<<std::endl;
string.clear();
stream.clear();
stream<<diskGeometry.TracksPerCylinder;
stream>>string;
std::cout<<"Tracks in cylinder: "<<string<<std::endl;
string.clear();
stream.clear();
stream<<diskGeometry.SectorsPerTrack;
stream>>string;
std::cout<<"Sectors in track: "<<string<<std::endl;
string.clear();
stream.clear();
stream<<diskGeometry.BytesPerSector;
stream>>string;
std::cout<<"Bytes in sector: "<<string<<std::endl;
string.clear();
stream.clear();
stream<<(diskGeometry.Cylinders.QuadPart*diskGeometry.TracksPerCylinder*diskGeometry.SectorsPerTrack);
stream>>string;
std::cout<<std::endl<<"All sectors: "<<string<<std::endl;
string.clear();
stream.clear();
stream<<(diskGeometry.Cylinders.QuadPart*diskGeometry.TracksPerCylinder*diskGeometry.SectorsPerTrack*diskGeometry.BytesPerSector);
stream>>string;
std::cout<<"All size: "<<string<<std::endl;
Release();
return 0;
}
void Release(void)
{
if(file)
{
CloseHandle(file);
file=0;
}
std::cout<<std::endl<<"Goodby!"<<std::endl<<std::endl;
}
Как видно, тут нет понятия головки. А вот в BIOS функции используется понятие головка. Значит ли это, что дорожку можно обозвать головкой?
В общем подскажите, как мне из абсолютного адреса сектора (в моём случае пускай адрес первого сектора начинается с нуля) получить параметры для функции BIOS: головка, цилиндр и сектор.
И ещё, стоит ли в загрузочном секторе хранить полученную информацию о количестве цилиндров, дорожек на цилиндре, количестве секторов на дорожке и размер сектора в байтах?
Удивительно, раньше я думал что есть головки, на которых находятся цилиндры. На цилиндрах находятся дорожки, но на дискете 3.5' HD на каждом цилиндре всего одна дорожка, поэтому их опускают. А на каждом цилиндре находится сектора. А тут картина складывается такая, что нет головок, есть цилиндры. Каждый цилиндр состоит из двух дорожек (как-бы двух головок) и каждая дорожка состоит из 18 секторов. Раньше думал что главным считается головка, затем цилиндр и сектор. А теперь оказывается цилиндр-дорожка-сектор.