PDA

Просмотр полной версии : CD 2 ISO


slesh
25.05.2009, 00:47
Вот както раз понадобилось сделать ISO'шник одного диска, но под рукой никаких спец прог небыло. Зато был VS 6. Небольшими усилиями накатал прожку для создания ISO образов.

#include <stdio.h>
#include <windows.h>
#include <winioctl.h>

int main(int argc, char* argv[])
{
HANDLE cdrom;
HANDLE iso;
DISK_GEOMETRY diskgeo;
ULONG retbyte;
ULONG readsize;
ULONG oldps;
LARGE_INTEGER DiskSize;
LARGE_INTEGER reads;
char * bufer;
// откроем первый привод
cdrom=CreateFile("\\\\.\\Cdrom0", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0);
if (cdrom!=INVALID_HANDLE_VALUE)
{
// запросим инфу о диске
if (DeviceIoControl(cdrom,IOCTL_DISK_GET_DRIVE_GEOMET RY,0,0,&diskgeo,sizeof(diskgeo),&retbyte,0))
{
// создадим ISO файл
iso=CreateFile("c:\\1.iso",GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NO RMAL,0);
if (iso!=INVALID_HANDLE_VALUE)
{
DiskSize.QuadPart=diskgeo.Cylinders.QuadPart*diskg eo.TracksPerCylinder*diskgeo.SectorsPerTrack*diskg eo.BytesPerSector;
readsize=diskgeo.BytesPerSector<<2; // по 4 сектора будет читать
bufer=(char*)malloc(readsize); // выделим место под буфер
reads.QuadPart=0;
printf("SIZE: %u\n",DiskSize.QuadPart);
oldps=0;
do
{
ReadFile(cdrom,bufer,readsize,&retbyte,0);
if (!retbyte) // если несмогли прочесть сектора
{
FillMemory(bufer,readsize,0); // забьем буфер нулями
retbyte=readsize; // типа всюже прочитали
SetFilePointer(cdrom,retbyte,0,FILE_CURRENT);// передвиним указатель
}
reads.QuadPart+=retbyte;
if (oldps+1<reads.QuadPart*100/DiskSize.QuadPart)
{
printf("READ: %u%%\r",reads.QuadPart*100/DiskSize.QuadPart); // покажем проценты
oldps++;
}
WriteFile(iso,bufer,retbyte,&retbyte,0); // запишем в файл
} while (reads.QuadPart<DiskSize.QuadPart);//читаем пока несчитали всё
free(bufer);
printf("\nCreate ISO OK!");
CloseHandle(iso);
} else printf("ERROR: Create ISO File error");
} else printf("ERROR: Get Disk Info error");
CloseHandle(cdrom);
} else printf("ERROR: Open CD-ROM error");
return 0;
}


Читает хорошо нормальные диски, на убитых дисках возможны глюки? но теоретически должен забить нулями поврежденные сектора.

Sn@k3
25.05.2009, 00:57
неплоха. емм на написание программы понадобилось наверное около 30 минут? ))) хочу тебя огорчить, вбив в поисковик "создание образа iso" по первой же ссылке найдёшь)))) весёлый малый) не ищешь легких путей, прям как я 8)

slesh
25.05.2009, 01:18
в том то всё и дело что инета небыло под рукой. голая винда и флешка с компилятором и докой. + куча времяни)

razb
25.05.2009, 13:30
Молодец! для новичков будет познавательно, да и вообще может быть когда то пригодится))

Gar|k
25.05.2009, 20:50
А я щас пишу разбиралку MBR записи харда... SetFilePointer и LARGE_INTEGER - смерть >___< (а может я просто не в тыкаю в LBA/CHR адресацию)...