스토리지 드라이버 데이터 세트 관리 수행

Windows 7부터 드라이버는 디바이스의 데이터 집합에서 관리 작업을 수행할 수 있습니다. 스토리지 디바이스에서 수행할 수 있는 DSM(데이터 집합 관리) 작업 목록은 Microsoft에서 정의합니다.

IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES 사용

DEVICE_DSM_ACTION 상수는 작업을 지정합니다. 이 상수는 IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES 요청의 시스템 버퍼에 포함된 DEVICE_DSM_INPUT 구조체의 Action 멤버에 전달됩니다. 작업에 추가 매개 변수가 필요한 경우 매개 변수 블록은 즉시 DEVICE_DSM_INPUT 구조체를 따르며 ParameterBlockOffset은 매개 변수 블록이 시작되는 DEVICE_DSM_INPUT 구조의 시작부터 오프셋을 지정합니다. 데이터 집합 범위(있는 경우)는 매개 변수 블록을 바로 따르며 DataSetRangesOffset 은 범위가 시작되는 DEVICE_DSM_INPUT 구조의 시작부터 오프셋을 지정합니다. 시스템 버퍼 구조는 다음 다이어그램에 나와 있습니다.

DSM IOCTL 입력 버퍼.

관리 작업이 출력을 반환하면 DEVICE_DSM_OUTPUT 구조에 대한 포인터가 IOCTL의 OutputBuffer에 전달됩니다. 작업이 추가 작업별 출력을 반환하는 경우 출력 블록은 DEVICE_DSM_OUTPUT 구조체 바로 뒤에 옵니다. OutputBlockOffset 은 매개 변수 블록이 시작되는 DEVICE_DSM_OUTPUT 구조의 시작부터 오프셋을 지정합니다. 출력 버퍼 구조는 다음 다이어그램에 나와 있습니다.

DSM IOCTL 출력 버퍼.

DSM 작업의 프로세스 흐름

DSM 작업의 프로세스 흐름은 아래에 설명되어 있습니다. 여기서 Sender 는 작업 요청자이고 처리기는 요청된 작업을 처리합니다. 스택에 둘 이상의 처리기가 있을 수 있습니다.

DSM 작업 흐름.

  1. 발신자는 DSM을 초기화하고 다음을 수행하여 스택의 첫 번째 처리기로 보냅니다.

    • 작업과 연결된 정의를 사용하여 DEVICE_DSM_DEFINITION 구조를 할당하고 초기화합니다.
    • DeviceDsmGetInputLength를 호출하여 작업의 입력 버퍼에 필요한 크기를 확인한 다음, 이 버퍼에 대한 메모리를 할당합니다.
    • DeviceDsmInitializeInput을 호출하여 DSM_DEVICE_INPUT 구조를 초기화하고, 작업에 매개 변수가 있는 경우 매개 변수 블록을 초기화합니다. 매개 변수 블록 형식은 작업에 따라 달라집니다. 자세한 내용은 DEVICE_DSM_ACTION 설명을 참조하세요.
    • 작업에 범위가 있는 경우 각 범위에 대해 DeviceDsmAddDataSetRange 를 호출하여 입력 버퍼에 DEVICE_DSM_RANGE 구조를 추가합니다.
    • DSM에 출력이 있는 경우 DeviceDsmGetOutputLength 를 호출하여 작업의 출력 버퍼에 필요한 크기를 확인한 다음 이 버퍼에 대한 메모리를 할당합니다.
    • 할당된 출력 버퍼(있는 경우)와 함께 IOCTL의 시스템 버퍼에 초기화된 입력 데이터를 전달하는 IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES 요청을 보냅니다.
  2. 처리기는 다음 세 가지 방법 중 하나로 DSM IOCTL 요청을 처리합니다.

    1. 요청을 처리하고 출력을 사용하여 반환합니다(있는 경우).
    2. 요청을 처리하고 스택의 다음 하위 드라이버로 전달합니다.
    3. DSM을 처리하지 않고 스택의 다음 하위 드라이버로 요청을 전달합니다.

    참고

    드라이버가 DSM을 처리하는지 여부에 관계없이 DEVICE_DSM_ACTION 가장 중요한 비트(DeviceDsmActionFlag_NonDestructive)가 설정된 경우에만 요청을 안전하게 전달할 수 있습니다. DeviceDsmActionFlag_NonDestructive 설정되지 않은 경우 드라이버가 오류와 함께 를 반환해야 합니다.

    처리기가 DSM을 처리하는 경우 다음 단계를 수행합니다.

    • DeviceDsmValidateInput을 호출하여 입력의 유효성을 검사합니다.
    • 입력이 유효한 경우 처리기는 입력을 추출하여 작업을 가져옵니다. 작업에 매개 변수 블록이 있는 경우 처리기는DeviceDsmParameterBlock 을 호출하여 매개 변수 블록을 가져옵니다. 작업에 범위 데이터가 있는 경우 처리기는DeviceDsmDataSetRanges 를 호출하여 데이터 집합 범위 블록에 대한 포인터를 가져옵니다. 그런 다음 블록에서 정상적인 처리를 수행합니다. 이 블록은 DataSetRangesOffset 에 있으며 DEVICE_DSM_RANGE 구조로 형식이 지정된 하나 이상의 연속 항목으로 구성됩니다. 데이터 집합 범위의 길이(바이트)는 DEVICE_DSM_INPUTDataSetRangesLength 멤버에 설정됩니다.
    • 작업에 출력이 필요한 경우 처리기는DeviceDsmValidateOutputLength 를 호출하여 보낸 사람 제공 출력 버퍼의 유효성을 검사합니다. 유효한 경우 처리기는 DeviceDsmInitializeOutput을 호출하여 출력 버퍼의 DEVICE_DSM_OUTPUT 부분을 초기화하고 출력 블록을 작업별 출력(있는 경우)으로 채웁니다. 그런 다음 처리기는 IOCTL을 완료하고 IOCTL을 반환하거나 스택의 다음 드라이버로 전달합니다.
  3. DSM이 처리되고 보낸 사람에게 반환되면 발신자DeviceDsmValidateOutput을 호출하여 출력의 유효성을 검사합니다(있는 경우). 출력이 유효한 경우 SenderDeviceDsmOutputBlock을 호출하여 출력 블록(있는 경우)을 추출합니다.

각 특정 DSM 작업에 대한 자세한 내용은 디바이스 DSM 작업 설명을 참조하세요.