W dzisiejszym artykule, tak jak mówi jego tytuł, zajmiemy się zaawansowaną obsługą dysków i plików. Będziemy mogli odczytać takie rzeczy jak np. budowa dysku twardego lub informacje o systemie plików. Aha, zaznaczam, że wszystko co napisałem może nie działać na Win95/98/Me. Tak więc przejdźmy do rzeczy. Najważniejszą funkcją, jakiej będziemy używać, będzie funkcja DeviceIoControl, a wygląda ona tak: 

Omówmy po kolei wszystkie parametry:
hDevice – uchwyt do urządzenia, na którym będziemy wykonywać operację
dwIoControlCode – kod przeprowadzanej operacji
lpInBuffer – wskaźnik do bufora wejścia, który zawiera informacje potrzebne do przeprowadzenia operacji, zależy od dwIoControlCode
nInBufferSize – rozmiar lpInBuffer
lpOutBuffer – wskaźnik do bufora wyjściowego, zawiera informacje zwrócone podczas operacji, zależy od dwIoControlCode
nOutBufferSize – rozmiar lpOutBufferSize
lpBytesReturned – wskaźnik na liczbę type DWORD, zawiera liczbę bajtów zwróconych do lpOutBuffer
lpOverlapped – wskaźnik na strukturę typu OVERLAPPED
Pierwszy parametr uzyskujemy używając funkcji CreateFile z odpowiednimi parametrami. Aby otworzyć urządzenie używamy CreateFile z parametrem lpFileName: \\\\.\\NazwaUrządzenia (np. \\\\.\\d:)
Funkcja (DeviceIoControl) zwraca wartość 0 jeżeli się nie powiodła, lub inną wartość w przypadku powodzenia.

Poznamy teraz przykładowe kody operacji do użycia w funkcji DeviceIoControl:
FSCTL_GET_COMPRESSION – zwraca stan kompresji pliku lub katalogu
IOCTL_DISK_GET_LENGTH_INFO – zwraca długość dysku lub partycji
IOCTL_DISK_IS_WRITABLE – informuje, czy podane urządzenie jest zapisywalne
IOCTL_DISK_GET_DRIVE_GEOMETRY_EX – zwraca rozszerzone informacji o fizycznym dysku
IOCTL_DISK_GET_PARTITION_INFO_EX – zwraca rozszerzone informacje o partycji

Oczywiście nie może objeść się przez przykładu zastosowania:

I jeszcze jeden przykład, z innym kodem operacji:

Teraz mała dygresja. Chociaż ten art nie traktuje o budowie dysku, warto się z nią zapoznać, żeby dobrze rozumieć powyższy kod.
Podstawowe pojęcia to:
sektor – najmniejszy ciągły obszar adresowany za pomocą pojedynczych operacji, wycinek ścieżki, zwykle o rozmiarze 512 bajtów
ścieżka – zbiór sektorów dyskowych dostępny dla głowicy czytająco piszącej w jednym z jej położeń, wiele ścieżek tworzy współśrodkowe pierścienie
cylinder – zbiór ścieżek o tym samym numerze umieszczonych na wszystkich powierzchniach roboczych dysku, ścieżki cylindra są dostępne dla zespołu głowic czytająco-piszących bez zmiany położenia głowic

Jest jeszcze mnóstwo innych zastosowań funkcji DeviceIoControl. Jak pokazałem dwa, lecz nic nie stoi na przeszkodzie, abyście poznali resztę. Więc informacji oczywiście na stronie Microsoftu i w Platform SDK. Mogę dodać, że dzięki tej funkcji możecie stworzyć nową partycję, lub powiększyć istniejącą a także formatować i defragmentować dyski. A więc na co czekacie, do dzieła! 🙂

Autor: krajew4

Załączniki

  • zip dyski
    Rozmiar pliku: 1 KB