2014-02-18 13 views
2

Windows c/C++ API (예 : PnP Configuration Manager API)를 사용하여 장치의 PCI 좌표 (버스/슬롯/기능 번호)를 얻을 수있는 방법이 있습니까? 커널 모드에서이 작업을 수행하는 방법을 이미 알고 있습니다. 사용자 모드 솔루션이 필요합니다. 내 대상 시스템은 Windows XP-32 비트입니다.Windows API (사용자 모드)로 PCI 좌표 가져 오기

+0

필자는 직접 사용하지 않았기 때문에 (주석과 대답이 아닌) [Function Discovery] (http://msdn.microsoft.com/en-us/library/aa814070)를 살펴볼 수 있습니다. .aspx) API. 그것은 당신이 PnP 장치를 발견하는 것을 허락합니다. 잠시 기다려주십시오. WinXP를 찾고 있다고 읽으십시오. 기능 발견은 Vista +입니다. – icabod

+0

수정. 또한 Vista는 SetupAPI 기능 세트를 확장합니다. 실제로 커널의 데이터베이스에서 직접 등록 정보를 검색하는 "SetupDiGetDeviceRegistryProperty"의 비 레지스트리 기반 버전이 있습니다. 그러나 다행히 XP의 레지스트리 기반 버전으로 충분합니다. –

답변

3

저는 결국 간단한 솔루션을 발견했습니다. MSDN을 파헤 치는 문제였습니다.

DWORD bus, addr, slot, func; 
HDEVINFO h; // Obtained by SetupDiGetClassDevs 
SP_DEVINFO_DATA d; // Filled by SetupDiGetDeviceInterfaceDetail 

SetupDiGetDeviceRegistryProperty(h,&d,SPDRP_BUSNUMBER,NULL,&bus,sizeof(bus),NULL); 
SetupDiGetDeviceRegistryProperty(h,&d,SPDRP_ADDRESS,NULL,&addr,sizeof(addr),NULL); 
slot = (addr >> 16) & 0xFFFF; 
func = addr & 0xFFFF; 

주 :

이 최소 코드 발견 장치의 PCI 버스/슬롯/기능의 관점에서 좌표 실제 생산을위한 상기 출력 버퍼의 크기가 순서대로 API 함수의 이전 호출하여 취득해야 동적으로 할당하고 오류 검사를 추가해야합니다.