direct acces to drive ?
1. Каким образам можно получить прямой доступ к соответсвующему
винчестеру IDE, SCSI можно ли это сделать в среде WINDOWS ? Ну уж
точно не с WriteFile(…), OpenFile(…).
2. Известно, что сектор одназначно определяеется адресом, имеющий
следующий вид (h, c, s) где
h - это головка,
c – цилиндр,
s – сектор.
а) Вообще сколько головок имеют винчестеры? Может это 2 в n-ой степени?
б) Как узнать сколько секторов в соответствующем цилиндре? Ведь чем дальше
цилиндр находится от центра, тем больше в нём секторов.
· Сколько секторов имеет нулевой цилиндр?
· Какая связь имеется в количестве секторов в цилиндрах номер n и (n-1)?
Есть ли какие то стандарты? и что они из себя представляют?
Здраствуйте.
1. Каким образам можно получить прямой доступ к соответсвующему
винчестеру IDE, SCSI можно ли это сделать в среде WINDOWS ? Ну уж
точно не с WriteFile(…), OpenFile(…).
Ну почему же. Именно с помощью CreateFile, ReadFile, WriteFile.
2. Известно, что сектор одназначно определяеется адресом, имеющий
следующий вид (h, c, s) где
h - это головка,
c – цилиндр,
s – сектор.
а) Вообще сколько головок имеют винчестеры? Может это 2 в n-ой степени?
б) Как узнать сколько секторов в соответствующем цилиндре? Ведь чем дальше
цилиндр находится от центра, тем больше в нём секторов.
· Сколько секторов имеет нулевой цилиндр?
· Какая связь имеется в количестве секторов в цилиндрах номер n и (n-1)?
Есть ли какие то стандарты? и что они из себя представляют?
На всех цилиндрах количество секторов одинаковое.
Количество секторов, головок, цилиндров для каждого HDD специфично.
Вообще-то сейчас все определяется в LBA секторах, т.е. сектор однозначно определяется линейным номером начиная с нулевого.
Ну почему же. Именно с помощью CreateFile, ReadFile, WriteFile.
Я очень сомневаюсь что WINDOWS мне даст прямой доступ.
Есть int 13h
прерывание BIOS
оно даёт прямой доступ к винчу но
WINDOWS точно переопределил это прерывание.
Во всяком случае боюсь експерементировать с единственным винчом. Куплю новый потом.
На всех цилиндрах количество секторов одинаковое.
Я в этом сильно соомневаюсь.
Думаю такое невозможно по той причине что
это привело бы к потерии огромного пространства.
Количество секторов, головок, цилиндров для каждого HDD специфично.
Естественно.
Вообще-то сейчас все определяется в LBA секторах, т.е. сектор однозначно определяется линейным номером начиная с нулевого.
Я об этом слышал но как это использовать?
int 13h - это в реальном режиме и если программа запущена в виндовсе, в режме эмуляции тогда это прерывание доступно. Экперементировать не бойся - все в норме диск не запортиться, вот только это прерывание ни дает возможность работы с большими дисками и годиться максимум для работы с дискетами , а вот.
На самом деле все верно - на цилиндре разное число секторов, называеться эта фишка - зонная запись, но это не важно - Ты скажи что ты делаешь и зачем тебе это - писать под виндовс с прямым достыпом вчем замысел???
Я очень сомневаюсь что WINDOWS мне даст прямой доступ.
Есть int 13h
прерывание BIOS
оно даёт прямой доступ к винчу но
WINDOWS точно переопределил это прерывание.
Во всяком случае боюсь експерементировать с единственным винчом. Куплю новый потом.
Я так понял из твоих вопросов о секторах, что тебе надо читать/писать сектора, а не управлять контроллером.
Для чтения/записи информации посекторно вполне достаточно ReadFile/WriteFile.
Я в этом сильно соомневаюсь.
Думаю такое невозможно по той причине что
это привело бы к потерии огромного пространства.
Я говорил о логической структуре диска.
Я был неправ. В WINDOWS это делается именно с CreateFile(...).
Прочитав полное описание вызова CreateFile(...), получил
то что надо. (смотрите ниже)
С WINDOWS всё ясно а вот вне ОС не так уш.
Есть int 13h прерывание BIOS.
Которое даёт прямой досуп к винчу или к floppy.
Входные параметры
AH = 02h
DL = drive number (00h,01h,80h,81h)
DH = head id
CH = cylinder id
CL = sector id
AL = number of sectors to read
ES = Segment address of the buffer
BX = offset address of the buffer
Обратите внимание на CH,CL это 8 битные регистры которые
адресуют цилиндр и сектор соответсвенно.
Тоесть можно адресовать всего 256 цилиндров, секторов.
Этого слишком мало для современных винчов.
Кроме того ES,BX начало и конец сегмента с максимальным
размером 64кб. Ну очевидно что этот старый код от старого
8086х никак не годится.
Вот как можно получить досуд к SCSI,IDE контроллерам ?
Tommy.
Дипломная работа.
1. Должен создать сообственную файловую систему и соответствующую
систему управления файлами для WINDOWS.
после
2. Должен создать сообственную операционную систему которая работала с
моей файловой системой.
#pragma comment(linker,"/OPT:NOWIN98")
#include <windows.h>
unsigned long __stdcall CopyMBR(char []);
int __stdcall WinMain(HINSTANCE AppInstance,HINSTANCE hPrev,LPSTR lpCmdLine,int nCmdShow)
{
unsigned long dWord;
char buffer[5];
AllocConsole();
SetConsoleTitle("My Console");
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
WriteConsole(hStdOut,"Hello World!\nLife is Wonderful:)\n\n",34,&dWord,0);
itoa(CopyMBR("D:\\sector.txt"),buffer,10);
WriteConsole(hStdOut,buffer,3,&dWord,0);
Sleep(5000);
FreeConsole();
ExitProcess(0);
}
unsigned long __stdcall CopyMBR(char dest[])
{
__int8 sector[512];
unsigned long nBytesRead;
unsigned long nBytesWrite;
HANDLE hFile = CreateFile(
"\\\\.\\PHYSICALDRIVE0",
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
HANDLE hNewFile = CreateFile(
// "D:\\sector.txt",
dest,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if(hFile == INVALID_HANDLE_VALUE || hNewFile == INVALID_HANDLE_VALUE)
{
MessageBox(0,"CreateFile(...) fail\n You Must have Administrative priviliges","chkpav",0);
ExitProcess(0);
}
SetFilePointer(hFile,NULL,NULL,FILE_BEGIN);
ReadFile(hFile,§or,512,&nBytesRead,0);
WriteFile(hNewFile,§or,512,&nBytesWrite,0);
CloseHandle(hFile);
CloseHandle(hNewFile);
return nBytesRead;
}
Под 9x надо использовать девайс vwin32.vxd
Подробнее на codeguru.com:
http://www.codeguru.com/Cpp/W-P/system/misc/article.php/c5765/
http://www.codeguru.com/Cpp/W-P/system/misc/article.php/c5723/