오늘도 많은 사람들이 프로그램을 통해 PCI Express 배속 / 스펙 버전을 확인하고자 인터넷을 헤맬 것이다. 글들을 보면 전혀 도움이 되지 않는 네트워크 어댑터 스펙 확인법을 올리는 사람도 있고(“-NetworkAdapter”를 적용하자 검색 결과가 10%로 줄었다) 드라이버가 필수라는 사람도 있으며, 그냥 리눅스로 확인(?)하라는 사람도 있다. 다음은 각 방법을 통한 해결책에 대해서 이야기하고자 한다.
아래 결과에 대해서는 각각 글을 링크해주고 싶으나 워낙 많은 키워드로 수 개월에 걸쳐서 검색을 했기 때문에 기록은 남아있지 않다. 또한 남은 자료들도 지난번 RAID1 참사때 다 날아가버렸다.
1. WMI
안 된다. 한 게시판에 올라온 답변에 의하면, WMI 전문가가 봤을 때도 불가능하다고 여긴 모양이다.
아마 문제가 있을 것으로 보이지만 꼼수에 가까운 방법 하나는 다음과 같다. 다음 쿼리를 순서대로 실행하면 된다.
우선 디스크의 DeviceID를 얻는다.
ASSOCIATORS OF {Win32_DiskDrive.DeviceID=’\\.\PhysicalDrive(번호)’} WHERE ResultClass=Win32_PnPEntity
다음으로 컨트롤러의 DeviceID를 얻는다.
ASSOCIATORS OF {Win32_PnPEntity.DeviceID='(위에서 얻은 DeviceID)’} WHERE AssocClass=Win32_SCSIControllerDevice
해당 장치가 물려있는 버스 번호(BusNum)를 얻는다.
ASSOCIATORS OF {Win32_PnPEntity.DeviceID=‘(위에서 얻은 DeviceID)’} WHERE AssocClass=Win32_DeviceBus
마지막으로 Win32_SystemSlot에서 해당 버스 번호(BusNumber)를 찾는다.
SELECT * FROM Win32_SystemSlot WHERE BusNumber='(위에서 얻은 BusNum)’
그러면 MaxDataWidth 속성으로 배속만 확인할 수 있다. 이 정보 자체가 SMBIOS 자체에서 가져오는 값이므로 +3하면 원래 SMBIOS 해석하는 방식으로 확인할 수 있다.
그러나 이 방식으론 스펙 버전을 확인할 수 없다. SMBIOS 스펙에는 1.0, 2.0, 3.0 슬롯을 위한 값이 따로 있다. 따라서 SMBIOS RAW값을 읽어오면 확인이 가능할 거라고 생각할 수 있으나, 실제로는 내 B75M이 그렇듯 1.0으로 통일되서 나오는 경우가 많으므로 확인이 불가능하다.
요약하면 문제는 버스와 슬롯 사이의 관계가 찾기 힘들다는 점이다.
2. 드라이버
말 그대로 PCI Express 레지스터를 읽어온다. 이 방법은 나도 안 써봤다. 닭 잡는 데 소 잡는 칼을 꺼내는 격이므로.
3. WMI + SetupAPI
드디어 진짜 해결책이 등장할 차례다.
우선 WMI 부분에서 두 번째 쿼리까지 실행하자. 두 번째 쿼리가 끝났다면 컨트롤러의 DeviceID가 있을 것이다.
이 상태에서 SetupDiGetClassDevs를 사용해 클래스를 열자. 클래스는 장치 관리자 → 해당 장치 → 자세히 → 클래스 GUID로 확인할 수 있다.
다음 SetupDiEnumDeviceInfo로 장치를 순회하면서 CM_Get_Device_IDW를 사용해 DeviceID를 얻어 일치 여부를 확인하면 된다.
마지막으로 SetupDiGetDeviceProperty를 이용해 다음 키들의 값을 얻어오면 된다.
DEVPKEY_PciDevice_CurrentLinkSpeed
DEVPKEY_PciDevice_CurrentLinkWidth
DEVPKEY_PciDevice_MaxLinkSpeed
DEVPKEY_PciDevice_MaxLinkWidth
각각 DEVPROPKEY 생성에 필요한 값은 위부터 9, 10, 11, 12이며, GUID는 {3ab22e31-8264-4b4e-9af5-a8d2d8e33e62}이다.
Max는 장치가 지원하는 최댓값, Current는 메인보드와 협상하여 현재 작동중인 값을 의미한다.
LinkSpeed는 스펙 버전을 나타내며, LinkWidth는 배속을 나타낸다. SMBIOS와 달리 LinkWidth는 배속과 같은 값이 나오니 오해해서는 안 되겠다.