CD 2 ISO

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by slesh, 25 May 2009.

  1. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Вот както раз понадобилось сделать ISO'шник одного диска, но под рукой никаких спец прог небыло. Зато был VS 6. Небольшими усилиями накатал прожку для создания ISO образов.
    Code:
    #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;
    }
    
    
    Читает хорошо нормальные диски, на убитых дисках возможны глюки? но теоретически должен забить нулями поврежденные сектора.
     
    2 people like this.
  2. Sn@k3

    Sn@k3 Elder - Старейшина

    Joined:
    13 Apr 2006
    Messages:
    1,000
    Likes Received:
    437
    Reputations:
    90
    неплоха. емм на написание программы понадобилось наверное около 30 минут? ))) хочу тебя огорчить, вбив в поисковик "создание образа iso" по первой же ссылке найдёшь)))) весёлый малый) не ищешь легких путей, прям как я 8)
     
  3. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    в том то всё и дело что инета небыло под рукой. голая винда и флешка с компилятором и докой. + куча времяни)
     
    1 person likes this.
  4. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Молодец! для новичков будет познавательно, да и вообще может быть когда то пригодится))
     
  5. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    А я щас пишу разбиралку MBR записи харда... SetFilePointer и LARGE_INTEGER - смерть >___< (а может я просто не в тыкаю в LBA/CHR адресацию)...
     
    _________________________