Udostępnij przez


Zarządzanie zbiorami danych sterowników pamięci masowej

Począwszy od systemu Windows 7, sterowniki mogą wykonywać akcje zarządzania na zestawie danych urządzenia. Lista akcji zarządzania zestawami danych (DSM ), które można wykonać na urządzeniu magazynowym, są definiowane przez firmę Microsoft.

Korzystanie z IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES

Stała DEVICE_DSM_ACTION określa akcję. Ta stała jest przekazywana w składowej Action struktury DEVICE_DSM_INPUT zawartej w buforze systemowym żądania IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES. Jeśli akcja wymaga dodatkowych parametrów, blok parametrów będzie natychmiast podążał za strukturą DEVICE_DSM_INPUT, a parametr ParameterBlockOffset określi przesunięcie od początku struktury DEVICE_DSM_INPUT, w której rozpoczyna się blok parametrów. Zakresy zestawów danych, jeśli istnieją, będą znajdować się bezpośrednio po bloku parametrów, a DataSetRangesOffset określa przesunięcie od początku struktury DEVICE_DSM_INPUT, w którym rozpoczyna się zakres. Struktura buforu systemu jest pokazana na poniższym diagramie.

Bufor wejściowy IOCTL DSM.

Jeśli akcja zarządzania zwróci dane wynikowe, wskaźnik do struktury DEVICE_DSM_OUTPUT zostanie przekazany w OutputBuffer IOCTL. Jeśli akcja zwróci dodatkowe dane wyjściowe specyficzne dla akcji, blok danych wyjściowych będzie natychmiast podążał za strukturą DEVICE_DSM_OUTPUT, a element OutputBlockOffset określi przesunięcie od początku struktury DEVICE_DSM_OUTPUT, w której rozpoczyna się blok parametrów. Struktura buforu wyjściowego jest pokazana na poniższym diagramie.

Bufor wyjściowy IOCTL DSM.

Przepływ procesu działania DSM

Przepływ procesu akcji DSM jest opisany poniżej, gdzie Nadawca jest podmiotem żądający akcji i program obsługi przetwarza żądaną akcję. Należy pamiętać, że w stosie może znajdować się więcej niż jeden handler.

Przepływ działań DSM.

  1. Nadawca inicjuje DSM i wysyła go do pierwszego Handlera w stosie, wykonując następujące czynności:

    • Przydziel i zainicjuj strukturę DEVICE_DSM_DEFINITION za pomocą definicji skojarzonej z akcją.
    • Wywołaj metodę DeviceDsmGetInputLength , aby określić rozmiar wymagany dla buforu wejściowego akcji, a następnie przydziel pamięć dla tego buforu.
    • Wywołaj metodę DeviceDsmInitializeInput , aby zainicjować strukturę DSM_DEVICE_INPUT i, jeśli akcja ma parametry, blok parametrów. Format bloku parametrów zależy od akcji. Aby uzyskać więcej informacji, zobacz DEVICE_DSM_ACTION opisy.
    • Jeśli akcja zawiera zakresy, wywołaj metodę DeviceDsmAddDataSetRange dla każdego zakresu, aby dodać DEVICE_DSM_RANGE struktury do buforu wejściowego.
    • Jeśli DSM ma dane wyjściowe, wywołaj funkcję DeviceDsmGetOutputLength, aby określić rozmiar wymagany dla bufora wyjściowego działania, a następnie przydziel odpowiednią ilość pamięci dla tego bufora.
    • Wyślij żądanie IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES , przekazując zainicjowane dane wejściowe w buforze systemowym IOCTL wraz z przydzielonym buforem wyjściowym, jeśli istnieje.
  2. Handler obsługuje żądanie IOCTL DSM na jeden z trzech sposobów:

    1. Obsługa żądania i zwracanie danych wyjściowych, jeśli istnieją.
    2. Obsłuż żądanie i przekaż go do następnego niższego sterownika w stosie.
    3. Prześlij żądanie do następnego niższego sterownika w stosie bez obsługi maszyny DSM.

    Uwaga

    Niezależnie od tego, czy sterownik obsługuje DSM, może bezpiecznie przekazać żądanie tylko wtedy, gdy najbardziej znaczący bit DEVICE_DSM_ACTION (DeviceDsmActionFlag_NonDestructive) jest ustawiony. Jeśli DeviceDsmActionFlag_NonDestructivenie jest ustawiony, sterownik zamiast tego powinien zwrócić błąd.

    Jeśli program obsługi obsługuje maszynę DSM, wykonuje następujące kroki:

    • Zweryfikuj dane wejściowe, wywołując element DeviceDsmValidateInput.
    • Jeśli dane wejściowe są prawidłowe, program obsługi wyodrębnia dane wejściowe, aby uzyskać akcję. Jeśli akcja ma blok parametrów, Handler wywołuje DeviceDsmParameterBlock, aby pobrać blok parametrów. Jeśli akcja zawiera dane zakresu, Handler wywołuje DeviceDsmDataSetRanges, aby uzyskać wskaźnik do bloku zakresów zestawu danych, a następnie wykonuje normalne przetwarzanie bloku. Ten blok znajduje się w lokalizacji DataSetRangesOffset i składa się z jednego lub więcej ciągłych wpisów sformatowanych jako struktury DEVICE_DSM_RANGE. Długość w bajtach zakresów zestawu danych jest ustawiona w elemencie DataSetRangesLengthDEVICE_DSM_INPUT.
    • Jeśli akcja wymaga danych wyjściowych, program obsługi wywołuje metodę DeviceDsmValidateOutputLength w celu zweryfikowania buforu wyjściowego dostarczonego przez nadawcę. Jeśli jest prawidłowa, program obsługi inicjuje część DEVICE_DSM_OUTPUT buforu wyjściowego, wywołując metodę DeviceDsmInitializeOutput i wypełnia blok danych wyjściowych danymi wyjściowymi specyficznymi dla akcji, jeśli istnieją. Następnie program obsługi kończy IOCTL i zwraca lub przekazuje IOCTL do następnego sterownika w stosie.
  3. Gdy moduł DSM jest obsłużony i zwrócony do nadawcy, nadawca weryfikuje dane wyjściowe, jeśli istnieją, wywołując funkcję DeviceDsmValidateOutput. Jeśli dane wyjściowe są prawidłowe, nadawca wyodrębnia blok danych wyjściowych, jeśli istnieje, wywołując element DeviceDsmOutputBlock.

Aby uzyskać szczegółowe informacje na temat każdej akcji DSM, zobacz Opisy akcji dsm urządzeń.