스토리지 드라이버 데이터 세트 관리 수행
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 구조의 시작부터 오프셋을 지정합니다. 시스템 버퍼 구조는 다음 다이어그램에 나와 있습니다.
관리 작업이 출력을 반환하면 DEVICE_DSM_OUTPUT 구조에 대한 포인터가 IOCTL의 OutputBuffer에 전달됩니다. 작업이 추가 작업별 출력을 반환하는 경우 출력 블록은 DEVICE_DSM_OUTPUT 구조체 바로 뒤에 옵니다. OutputBlockOffset 은 매개 변수 블록이 시작되는 DEVICE_DSM_OUTPUT 구조의 시작부터 오프셋을 지정합니다. 출력 버퍼 구조는 다음 다이어그램에 나와 있습니다.
DSM 작업의 프로세스 흐름
DSM 작업의 프로세스 흐름은 아래에 설명되어 있습니다. 여기서 Sender 는 작업 요청자이고 처리기는 요청된 작업을 처리합니다. 스택에 둘 이상의 처리기가 있을 수 있습니다.
발신자는 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 요청을 보냅니다.
처리기는 다음 세 가지 방법 중 하나로 DSM IOCTL 요청을 처리합니다.
- 요청을 처리하고 출력을 사용하여 반환합니다(있는 경우).
- 요청을 처리하고 스택의 다음 하위 드라이버로 전달합니다.
- 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을 반환하거나 스택의 다음 드라이버로 전달합니다.
DSM이 처리되고 보낸 사람에게 반환되면 발신자 는 DeviceDsmValidateOutput을 호출하여 출력의 유효성을 검사합니다(있는 경우). 출력이 유효한 경우 Sender 는 DeviceDsmOutputBlock을 호출하여 출력 블록(있는 경우)을 추출합니다.
각 특정 DSM 작업에 대한 자세한 내용은 디바이스 DSM 작업 설명을 참조하세요.