Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   CD 2 ISO (https://forum.antichat.xyz/showthread.php?t=122163)

slesh 25.05.2009 00:47

CD 2 ISO
 
Вот както раз понадобилось сделать 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_GEOMETRY,0,0,&diskgeo,sizeof(diskgeo),&retbyte,0))
  {
  // создадим ISO файл
  iso=CreateFile("c:\\1.iso",GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
  if (iso!=INVALID_HANDLE_VALUE)
  {
    DiskSize.QuadPart=diskgeo.Cylinders.QuadPart*diskgeo.TracksPerCylinder*diskgeo.SectorsPerTrack*diskgeo.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 адресацию)...


Время: 06:25