Programing/C/C++2015. 7. 22. 18:39

하드 디스크의 RPM을 구하기 위해선 우선 물리적 하드에 접근해야 합니다

물리적 하드로의 접근은 '\\\\.\\PhysicalDrive[x]'를 경로로 하여 CreateFile을 하면 오픈할 수 있으며


'\\\\.\\PhysicalDrive[x]'에서 [x] 부분은 원하는 하드의 숫자 인덱스를 넣으면 됩니다


그리고 커널에 ATA IDENTIFY DEVICE command를 요청해야 하는데 그때 사용하는 구조체와 define은 다음과 같습니다



우리가 주목할 변수는 

ATAIDENTIFYDEVICEQUERY::header::AtaFlags

ATAIDENTIFYDEVICEQUERY::header::CurrentTaskFile[6]

ATAIDENTIFYDEVICEQUERY::data[217]


이 3개 입니다. 자세한 내용은 위 define 선언과 아래 실제 사용 코드를 보면 어떻게 써야 되는지 이해할 수 있으실 겁니다

DeviceIoControl이 성공했을 때 ATAIDENTIFYDEVICEQUERY::data[217] 위치에 RPM 값이 들어오는데

SSD의 경우 RPM 값이 1로 리턴되게 됩니다

(반드시 1이 리턴되는지는 확인하지 못했으나, 현재까지 테스트해본 SSD는 모두 1을 리턴하였습니다)


해당 데이터가 1인지 아닌지를 확인하여 HDD / SDD 구분을 하면 되며

HDD라면 1이 아닌 WORD형의 RPM값이 리턴되므로, 해당 값을 사용하면 됩니다


이제 구조체에 값을 넣고 DeviceIoConrtol 함수를 호출하면 되는데요, 해당 하는 전체 코드는 다음과 같습니다

임의로 PhysicalDrive의 인덱스는 0으로 하였는데요, 원하는 물리 드라이브에 맞추어 변경하면 됩니다



Posted by ratiel