format pe console
entry start
;//-------
section '.inc' data readable
include 'win32ax.inc'
include 'equates\dxgi.inc'
;//-------
.data
d3Fname db 'd3d1' ;//<---- Имя библиотеки DirectX,
verIndex db '2.dll',0 ;//<---- ..и его продолжение для цикла.
dxVersion dd 12
devName rb 512
hFactory dd 0
hAdapter dd 0
Index dd 0
listOffset dd buff
fpuResult dq 0
fpuMb dd 1024*1024 ;// Byte to Mbyte
align 16
disp DISPLAY_DEVICEA
oa D3DKMT_OPENADAPTERFROMDEVICENAME
qai D3DKMT_QUERYADAPTERINFO
stat D3DKMT_QUERYSTATISTICS
buff db 0
;//---------
.code
start: invoke SetConsoleTitle,<'*** Graphic adapter info v1.0 ***',0>
;// Получить версию DirectX
@getDxVersion:
invoke LoadLibrary,d3Fname
or eax,eax
jnz @ok
dec byte[verIndex] ;// если ошибка..
dec [dxVersion]
jmp @getDxVersion
@ok: invoke FreeLibrary,eax
cinvoke printf,<10,' DirectX ver...: %d',10,0>,[dxVersion]
invoke EnumDisplayDevicesA,0,0,disp,0
cinvoke printf,<10,' Object name...: %s',\
10,' Adapter.......: %s',0>,\
disp.DeviceName,disp.DeviceString
;//************************************************************
;//***** Работа с СОМ-интерфейсом, и методами DXGI ************
;//************************************************************
invoke CoInitialize,0
invoke CreateDXGIFactory1,IID_IDXGI_Factory1,hFactory
;// Найти и вызвать 'IDXGI_Factory::EnumAdapter'
mov esi,[hFactory]
mov esi,[esi]
mov eax,[esi+IDXGI_Factory.EnumAdapters]
push hAdapter ;// сюда получим указатель
push [Index] ;// индекс адаптера начиная с нуля
push [hFactory] ;// This = в каком интерфейсе искать
call eax ;// EnumAdapter!!!
;// Найти и вызвать 'IDXGI_Adapter::GetDesc'
mov esi,[hAdapter]
mov esi,[esi]
mov eax,[esi+IDXGI_Adapter.GetDesc]
push buff ;// сюда получим структуру "DXGI_ADAPTER_DESC"
push [hAdapter] ;// This = в каком интерфейсе искать
call eax
mov esi,buff
mov eax,[esi+DXGI_ADAPTER_DESC.DedicatedVideoMemory]
mov ebx,[esi+DXGI_ADAPTER_DESC.DedicatedSystemMemory]
mov ecx,[esi+DXGI_ADAPTER_DESC.SharedSystemMemory]
shr eax,20
shr ebx,20 ;//<------ байты в мегабайты
shr ecx,20
cinvoke printf,< 10,' Vid/Pid.......: %04x-%04x rev.%x',\
10,' LUID..........: %08x%08x',\
10,10,' Mem from Video....: %03d Mb',\
10,' Mem from System...: %03d Mb <--- BIOS Aperture Size',\
10,' Shared memory.....: %03d Mb',0>,\
[esi+DXGI_ADAPTER_DESC.VendorId],\
[esi+DXGI_ADAPTER_DESC.DeviceId],\
[esi+DXGI_ADAPTER_DESC.Revision],\
dword[esi+DXGI_ADAPTER_DESC.AdapterLuid+4],\
dword[esi+DXGI_ADAPTER_DESC.AdapterLuid],\
eax,ebx,ecx
mov esi,buff
mov eax,[esi+DXGI_ADAPTER_DESC.DedicatedVideoMemory]
add eax,[esi+DXGI_ADAPTER_DESC.DedicatedSystemMemory]
add eax,[esi+DXGI_ADAPTER_DESC.SharedSystemMemory]
shr eax,20
cinvoke printf,<10,' Total Video RAM...: %d Mb',0>,eax
;//***************************************************************
;//***** Функции класса D3DKMTхх *********************************
;//***************************************************************
invoke CM_Get_Device_Interface_List, GUID_DISPLAY_DEVICE_ARRIVAL,0,buff,512,0
mov edi,[listOffset]
@GetVideoadapter:
invoke MultiByteToWideChar,CP_UTF8,0,edi,-1,devName,512
cinvoke printf,<10,10,' Adapter ID........: %.65ls',0>,devName
mov [oa.pDeviceName],devName
invoke D3DKMTOpenAdapterFromDeviceName,oa
cinvoke printf,< 10,' Adapter handle....: %08x',\
10,' Adapter LUID......: %08x%08x',0>,\
[oa.hAdapter],dword[oa.AdapterLuid+4],dword[oa.AdapterLuid]
;// Различная инфа от D3DKMTQueryAdapterInfo() ----------
;//----- Адрес видео-адаптера на шине PCI ---------------
mov eax,[oa.hAdapter]
mov [qai.hAdapter],eax
mov [qai.Type],KMTQAITYPE_ADAPTERADDRESS
mov [qai.pPrivateDriverData],buff
mov [qai.PrivateDriverDataSize],sizeof.D3DKMT_ADAPTERADDRESS
invoke D3DKMTQueryAdapterInfo,qai
mov esi,buff
cinvoke printf,< 10,' PCI Bus\Dev\Func..: %02x:%02x:%02x',0>,\
[esi+D3DKMT_ADAPTERADDRESS.BusNumber],\
[esi+D3DKMT_ADAPTERADDRESS.DeviceNumber],\
[esi+D3DKMT_ADAPTERADDRESS.FunctionNumber]
;//----- Информация из реестра --------------------------
mov eax,[oa.hAdapter]
mov [qai.hAdapter],eax
mov [qai.Type],KMTQAITYPE_ADAPTERREGISTRYINFO
mov [qai.pPrivateDriverData],buff
mov [qai.PrivateDriverDataSize],sizeof.D3DKMT_ADAPTERREGISTRYINFO
invoke D3DKMTQueryAdapterInfo,qai
mov esi,buff
mov eax,esi
add eax,D3DKMT_ADAPTERREGISTRYINFO.AdapterString
mov ebx,esi
add ebx,D3DKMT_ADAPTERREGISTRYINFO.BiosString
mov ecx,esi
add ecx,D3DKMT_ADAPTERREGISTRYINFO.DacType
mov edx,esi
add edx,D3DKMT_ADAPTERREGISTRYINFO.ChipType
cinvoke printf,< 10,' Adapter string....: %ls',\
10,' Bios string.......: %ls',\
10,' Dac type..........: %ls',\
10,' GPU chip name.....: %ls',0>,eax,ebx,ecx,edx
;//----- Размер памяти видео-адаптера более 4 Gb -------
mov eax,[oa.hAdapter]
mov [qai.hAdapter],eax
mov [qai.Type],KMTQAITYPE_GETSEGMENTSIZE
mov [qai.pPrivateDriverData],buff
mov [qai.PrivateDriverDataSize],sizeof.D3DKMT_SEGMENTSIZEINFO
invoke D3DKMTQueryAdapterInfo,qai
mov esi,buff
push esi esi esi
push dword[esi+D3DKMT_SEGMENTSIZEINFO.DedicatedVideoMemorySize+4]
push dword[esi+D3DKMT_SEGMENTSIZEINFO.DedicatedVideoMemorySize]
fild qword[esp]
fidiv [fpuMb]
fstp [fpuResult]
add esp,8
cinvoke printf,< 10,' Mem from Video....: %04.0f Mb',0>,\
dword[fpuResult],dword[fpuResult+4]
pop esi
push dword[esi+D3DKMT_SEGMENTSIZEINFO.DedicatedSystemMemorySize+4]
push dword[esi+D3DKMT_SEGMENTSIZEINFO.DedicatedSystemMemorySize]
fild qword[esp]
fidiv [fpuMb]
fstp [fpuResult]
add esp,8
cinvoke printf,< 10,' Mem from System...: %04.0f Mb',0>,\
dword[fpuResult],dword[fpuResult+4]
pop esi
push dword[esi+D3DKMT_SEGMENTSIZEINFO.SharedSystemMemorySize+4]
push dword[esi+D3DKMT_SEGMENTSIZEINFO.SharedSystemMemorySize]
fild qword[esp]
fidiv [fpuMb]
fstp [fpuResult]
add esp,8
cinvoke printf,< 10,' Shared VGA mem....: %04.0f Mb',0>,\
dword[fpuResult],dword[fpuResult+4]
pop esi
fild [esi+D3DKMT_SEGMENTSIZEINFO.DedicatedVideoMemorySize]
fild [esi+D3DKMT_SEGMENTSIZEINFO.DedicatedSystemMemorySize]
fild [esi+D3DKMT_SEGMENTSIZEINFO.SharedSystemMemorySize]
fadd st0,st1
fadd st0,st2
fidiv [fpuMb]
fstp [fpuResult]
cinvoke printf,< 10,' Total Video RAM...: %04.0f Mb',0>,\
dword[fpuResult],dword[fpuResult+4]
;//***** Цикл обхода всех адаптеров для Win8+ ******************
invoke CM_Get_Device_Interface_List, GUID_DISPLAY_DEVICE_ARRIVAL,0,buff,512,0
mov edi,[listOffset]
xor eax,eax
repne scasb
cmp byte[edi],'\'
jne @f
mov [listOffset],edi
jmp @GetVideoadapter
;//*******************************************************************
;//***** Недокументированная статистика ******************************
;//*******************************************************************
@@: cinvoke printf,<10,10,' ****** D3DKMTQueryStatistics() ******',10,0>
mov [stat.Type],D3DKMT_QUERYSTATISTICS_PROCESS
mov eax,dword[oa.AdapterLuid]
mov ebx,dword[oa.AdapterLuid+4]
mov dword[stat.AdapterLuid],eax
mov dword[stat.AdapterLuid+4],ebx
invoke D3DKMTQueryStatistics,stat
cinvoke printf,< 10,' Stat return code..: %x (0 = OK)',0>,eax
@exit: cinvoke _getch
cinvoke exit,0
;//-------
section '.idata' import data readable
library msvcrt,'msvcrt.dll',kernel32,'kernel32.dll',user32,'user32.dll',\
ole32,'ole32.dll',dxgi,'dxgi.dll',gdi32,'gdi32.dll',setupapi,'setupapi.dll'
import dxgi,CreateDXGIFactory1,'CreateDXGIFactory1'
import ole32,CoInitialize,'CoInitialize'
include 'api\msvcrt.inc'
include 'api\kernel32.inc'
include 'api\user32.inc'
include 'api\gdi32.inc'
include 'api\setupapi.inc'
Комментарии
13