2011-09-23 15 views
5

Mam program, który wykonuje surowego IO na dyskach w systemie Windows.Take dyski online/offline

Wszystko działa dobrze, jeśli docelowy dysk jest w trybie online. Jednak domyślnym zachowaniem w niektórych systemach Windows jest początkowo posiadanie dysków.

Mam trudności ze znalezieniem odpowiedniego interfejsu API, aby to zrobić w systemie Windows. Odpowiednikiem wiersza poleceń byłoby coś takiego:

"select disk 2", "online disk" | diskpart 

Jednak muszę mieć możliwość wykonywania tego w kodzie. Przejrzałem interfejs API DeviceIoControl Win32 (który, jak sądzę, jest prawidłowy), ale nie mogę określić, którego kodu kontrolnego użyć. Fakt, że nie mogę go znaleźć, sprawia, że ​​brakuje mi lepszego interfejsu API.

+0

dlaczego nie po prostu powłoka wykonuje polecenie z C#? –

+1

Z wielu powodów, ale wystarczy powiedzieć, że nie jest to opcja. Jeśli diskmgmt i diskpart mogą to zrobić, jest pewien sposób. Chcę wiedzieć, co to jest. – Joe

+1

@joe - diskmgmt i diskpart są gui do poleceń wbudowanych w Windows mogą używać Win32 API. Biorąc pod uwagę, że były one przez jakiś czas, jest to mało prawdopodobne. Wszystko, co możesz zrobić poprzez te gui, możesz zrobić za pomocą wiersza poleceń. –

Odpowiedz

2

This question ma kilka przydatnych linków do interfejsu API systemu Windows, w tym metodę DeviceIOControl.

Po przejrzeniu wszystkich wyliczeń, nie mogłem znaleźć niczego związanego z wprowadzeniem dysku do trybu online lub wprowadzić żadnych interesujących zmian na dysku poza formatowaniem/partycjami. Jest to prawdopodobnie spowodowane tym, że obsługiwane są tylko dyski twarde wymienialne podczas pracy. Rynek dysków twardych, które wymienia się na gorąco, jest bardzo mały, a znaczna większość tych sytuacji to sterowniki wspierające wszelkie potrzebne operacje. Na koniec pozostała część powinna móc używać narzędzia diskpart w razie potrzeby.

Musisz jeszcze raz spojrzeć na swoje wymagania. Prowadzisz proces, który ma prawa niezbędne do połączenia z Internetem na dysku twardym, ale nie ma dostępu do programu wiersza poleceń? Oto kilka sugestii dla typowych powodów, aby nie korzystać z programu wiersza poleceń:

  • nie może mieć czarny ekran pop up - mnóstwo rozwiązań tego problemu dostępnych internetowych
  • zespół bezpieczeństwa nie pozwoli - już uruchamiasz proces jako administrator, więc ufasz mu, dlaczego nie ufasz wbudowanej funkcji Windows
  • Problemy techniczne uniemożliwiają wywoływanie innych procesów - Byłbym zainteresowany tym, jak to się stało, ponieważ proces działa jak administrator
  • Wskazówki dotyczące kodowania, takie jak "Zawsze korzystaj z interfejsu API" - nie ma takiego z powodu braku potrzeby
+0

Istnieje wiele zastosowań dysków dynamicznych poza hot-swap. Dzięki za link, zobaczyłem to, ale jak zauważyłeś, nie ma tam prawdziwych rozwiązań. – Joe

+0

@Joe: chodzi mi o fizyczną zdolność napędu a nie akcję – Guvante

4

Dla przyszłych pokoleń odpowiedź (na Win 2k3/Vista i nowsze) jest usługą dysków wirtualnych (VDS). Jest trochę pracy, aby to wszystko razem, zwłaszcza, jeśli nie używasz obiektów COM w .NET tak bardzo.

Dysk online/offline jest wykonywany z IVdsDrive::SetStatus. Przynajmniej powinno; Odkryłem, że mogę rozwiązać mój problem, po prostu wyłączając status tylko do odczytu na moim dysku. Byłem w stanie to zrobić z IVdsDisk::SetFlags z odpowiednią wartością flagi.

+0

APi to jedno wielkie piekło, jak z niego korzystać? Dokumentacja jest naprawdę niejasna. – Gizmo

2

Not sure about C#, ale używam tego w C++: Spróbuj zadzwonić pod numer DeviceIoControl() z IOCTL_DISK_SET_DISK_ATTRIBUTES. Uchwyt pliku musi mieć uprawnienia do odczytu i zapisu. Myślę, że wymaga co najmniej Windows 7. Nie działa na Windows 2003 x64. System Windows 8 pomyślnie przenosi dysk w tryb offline, a następnie można go przepisać z kopii zapasowej.

BOOL disk_offline(HANDLE h_file, bool enable){ 
DWORD bytes_returned = 0; 
BOOL b_offline = 0; 
if(get_size_volume_disk(h_file)){ 
    SET_DISK_ATTRIBUTES disk_attr; 
    ZeroMemory(&disk_attr, sizeof(disk_attr)); 
    disk_attr.Version = sizeof(SET_DISK_ATTRIBUTES); 
    disk_attr.Attributes = enable? DISK_ATTRIBUTE_OFFLINE: 0; 
    disk_attr.AttributesMask = DISK_ATTRIBUTE_OFFLINE; 
    b_offline = DeviceIoControl(h_file, IOCTL_DISK_SET_DISK_ATTRIBUTES, &disk_attr, disk_attr.Version, NULL, 0, &bytes_returned, NULL); 
    // Invalidates the cached partition table and re-enumerates the device. 
    if(!enable) BOOL b_update = DeviceIoControl(h_file, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, &bytes_returned, NULL); 
} 
return b_offline; 
} 
0

Korzystanie DeviceIoControl i IOCTL_DISK_IS_WRITABLE kod sterujący, możliwe jest, aby sprawdzić, czy dysk jest zapisywalny. Jeśli dysk jest w trybie offline, zwraca wartość false.Oznacza to, że można ustalić, czy dysk jest w trybie offline i czy działa poprawnie w systemie Windows 2003 i późniejszym. Jednak nie mogłem znaleźć żadnego przydatnego IOCTL do przeniesienia dysku do trybu online w systemie Windows 2003. IOCTL_DISK_SET_DISK_ATTRIBUTES działa tylko w systemie Windows 2008 i późniejszym.

Powiązane problemy