첫눈 님이 쓰신 글 :
: 첨부파일은 GPU-Z이라는 프로그램입니다.
:
: 이 프로그램을 실행하면 장착되어 있는 내장그래픽카드는 물론이고 추가로 장착된 그래픽카드의 모든 정보를 확인할 수 있습니다.
:
: 제가 이 기능을 구현해야 하는데요.
:
: 구글링을 해 보니 NVidia그래픽카드는 nvcpl.dll을 이용해야 하고, AMD제품은 AMD에서 제공하는 API 를 이용해야 한다고 하더군요.
:
: 하지만 Intel과 같은 내장그래픽카드에 대한 정보는 전혀 없습니다.
:
: 그밖에 다른 제조사의 그래픽카드에 대한 정보도 전혀 없구요.
:
: 하지만 GPU-Z에서 보면 어떤 제품이든 관계 없이 모든 정보를 다 보여주는 것을 보면 제조사에서 제공하는 API를 이용하지 않고
: 공통으로 사용할 수 있는 어떤 방법이 있을듯 한데 혹시 도움을 주시면 감사하겠습니다.
답변:
칩 마다 하드웨어 구조가 다 다르므로 GPU 로우레벨을 공통적으로 사용할 수 있는 방법이 있지는 않아요.
유저모드에서 사용할 수 있는 API를 제조사에서 제공해주면 그걸 이용할 수 있고
그렇지 않으면 디바이스 드라이버를 만들어서 커널모드에서 칩을 직접 액세스 할 수 밖에 없습니다.
GPU-Z라는 프로그램을 잠깐 리버스 엔지니어링으로 분석해 보니까...
GPU-Z.exe 라는 프로그램이 인스톨 된 상태에서 실행파일 크기가 4메가 정도이지만
사실 이 놈은 실행파일 크기를 줄이기 위해서 Pack 되어 있고, 이걸 끄집어 내보면
실제 실행파일의 크기는 14 MB에 이릅니다.
리버스 엔지니어링으로 분석해 본 결과, GPU-Z 프로그램은...
실행파일 안에 GPU-Z.sys라는 커널모드 디바이스 드라이버를 갖고있다가
사용자계정의 AppData/Local/Temp 디렉토리에 풀어놓고 로드하는 구조를 갖고 있습니다.
C:\\Users\\사용자계정\\AppData\\Local\\Temp\\\\GPU-Z.sys"
<Visual Studio 2017을 이용해서 GPU-Z.exe를 인젝션>
디바이스 드라이버 뿐만 아니라, 실행파일 안에 몇개의 별개의 프로그램도 같이 Embedded 되어 있는 상태인데
아마도 Intel Platform Analysis Library를 이용해서 만든 별개의 프로그램으로 보이는데, 이 놈도 같이 Temp 디렉토리에서
실행시킵니다. (캡쳐한 그림에선 가려져서 잘 안보이지만, Query_External_xxxxxxxx.exe 라는 네임 데코레이션으로)
nvidia GPU일 경우에는 일전에 답변했던 대로.. 제조사에서 제공하는 dll을 로드해서
nvapi_QueryInterface 주소를 GetProcAddress로 얻어서 유저모드 dll API를 호출해서 사용하는 구조로
GPU-Z.exe도 마찬가지로 nvidia에서 제공하는 dll을 이용하도록 만들어져 있습니다.
결국, 칩 데이타 시트를 참고해서 디바이스 드라이버를 만들어야 하는 경우도 있다는 걸 인식하고 있어야 하죠.
전체를 다 분석해 본 건 아니지만... 30분 정도 리버스엔지니어링으로 살펴본 결론은 그러네요.