Вопрос

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by DooD, 31 Jul 2011.

  1. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    Приветствую уважаемые форумчане.Интересует следующий вопрос:
    1)можно ли с помощью подфункции 07h и прерывания BIOS провести форматирование из под венды.(если можно пример кода,потому что у меня не вышло)(з.ы для доса тоже пойдет)
    2)Есть ли апишка актуальная для хр,висты,7?если можно тоже пример.Спасибо

    upd заюзать на худой конец shellexecute с параметрами не предлагать;)
     
  2. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    то, что ты говоришь - это тока в DOS'е по этому пиши COM или EXE прогу под DOS. в Win32/Win64 запрещено вызывать BIOS прерывания, тем более почти все они недоступны из защищенного режима.

    Под винду, там не апишка, а IOCTL запросы к диску.
    Типа IOCTL_DISK_VERIFY - проверка сектора.
    IOCTL_DISK_FORMAT_TRACKS - форматирования дорожки.

    НО есть и более высокоуровневая апишка - ShFormatDrive
     
    #2 slesh, 31 Jul 2011
    Last edited: 31 Jul 2011
  3. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    Просто я писал проги которые используют прерывания биоса для работы с графикой,и на хр их спокойно запускал(из командной строки естесно).
    Ок гляну.
    а без запуска стандартного окна?
     
  4. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    мдауж. Ситуация прям тупиковая у тебя. )))))))))))
    1) к БИОС прерываниям ты имеешь доступа из Win32/Win64 приложений. А то что твоя прога работала - это потому что это DOS прога которая запусказаль в эмуляторе 16 битного режима, по этому и пахало всё.

    2) + 3) А что религия не позволяет открыть исходники Win 2000 или гуглокод? и поглядеть реализацию этой функции и выдрать код который отвечает за форматирование??

    К примеру win2k\private\shell\shell32\unicode\format.c находится исходник всех функций связанных с форматированием (включая окошко)

    На гуглокоде есть прям готовые реализации работы с IOCTL_DISK_FORMAT_TRACKS

    Советую поглядеть на запрос (в гуглокоде)

    IOCTL_DISK_FORMAT_TRACKS function:LowLevelFormat
     
    #4 slesh, 31 Jul 2011
    Last edited: 31 Jul 2011
  5. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    не знал что сорцы w2k открыты.
    я в С не силен,походу эта функция?:
    Code:
     
    BOOL
    LowLevelFormat(
                  HANDLE hDisk,
                  PDISK_GEOMETRY lpGeometry
                  )
    {
       FORMAT_PARAMETERS FormatParameters;
       PBAD_TRACK_NUMBER lpBadTrack;
       UINT i;
       BOOL b;
       DWORD ReturnedByteCount;
    
       FormatParameters.MediaType = lpGeometry->MediaType;
       FormatParameters.StartHeadNumber = 0;
       FormatParameters.EndHeadNumber = lpGeometry->TracksPerCylinder - 1;
       lpBadTrack = (PBAD_TRACK_NUMBER) LocalAlloc(LMEM_ZEROINIT,lpGeometry->TracksPerCylinder*sizeof(*lpBadTrack));
    
       for (i = 0; i < lpGeometry->Cylinders.LowPart; i++)
       {
    
          FormatParameters.StartCylinderNumber = i;
          FormatParameters.EndCylinderNumber = i;
    
          b = DeviceIoControl(
                             hDisk,
                             IOCTL_DISK_FORMAT_TRACKS,
                             &FormatParameters,
                             sizeof(FormatParameters),
                             lpBadTrack,
                             lpGeometry->TracksPerCylinder*sizeof(*lpBadTrack),
                             &ReturnedByteCount,
                             NULL
                             );
    
          if (!b )
          {
             LocalFree(lpBadTrack);
             return b;
          }
       }
    
       LocalFree(lpBadTrack);
    
       return TRUE;
    }