GetAdapterIdentifier

Rob Crittenden <[email protected]> Fri, 21 Jan 2005 10:41:45 -0500
Newsgroups gmane.comp.emulators.winex.devel
Message-ID <[email protected]>
I've brought this up before but the video card Vendor and Device id's
are swapped. I've attached a patch that fixes this, updates the device
to a GeForce 4400 Ti and properly sets the driver version to
4.14.10.5304 (I more or less picked this version at random, it just
happens to be the version on my Windows box at the moment).

I've also included the Windows program I tested this with and the source
to that, based on the DX9 D3D sample Tut01_CreateDevice.

rob
CreateDevice.cpp (text/plain, 7 KB)
//-----------------------------------------------------------------------------
// File: CreateDevice.cpp
//
// Desc: This is the first tutorial for using Direct3D. In this tutorial, all
//       we are doing is creating a Direct3D device and using it to clear the
//       window.
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
#include <d3d9.h>
#include "stdio.h"
#include "tchar.h"


//-----------------------------------------------------------------------------
// Global variables
//-----------------------------------------------------------------------------
LPDIRECT3D9             g_pD3D       = NULL; // Used to create the D3DDevice
LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // Our rendering device


char *print_guid(GUID id) {
	char * str = (char *)malloc(40);
	sprintf( str, "{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
                 id.Data1, id.Data2, id.Data3,
                 id.Data4[0], id.Data4[1], id.Data4[2], id.Data4[3],
                 id.Data4[4], id.Data4[5], id.Data4[6], id.Data4[7] );
	return str;

}

//-----------------------------------------------------------------------------
// Name: InitD3D()
// Desc: Initializes Direct3D
//-----------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{
    TCHAR strBuf[256] = {0};
	char str[40];
	GUID *id;

    // Create the D3D object, which is needed to create the D3DDevice.
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return E_FAIL;

    // Set up the structure used to create the D3DDevice. Most parameters are
    // zeroed out. We set Windowed to TRUE, since we want to do D3D in a
    // window, and then set the SwapEffect to "discard", which is the most
    // efficient method of presenting the back buffer to the display.  And 
    // we request a back buffer format that matches the current desktop display 
    // format.

    D3DPRESENT_PARAMETERS d3dpp; 
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

    // Create the Direct3D device. Here we are using the default adapter (most
    // systems only have one, unless they have multiple graphics hardware cards
    // installed) and requesting the HAL (which is saying we want the hardware
    // device rather than a software one). Software vertex processing is 
    // specified since we know it will work on all cards. On cards that support 
    // hardware vertex processing, though, we would see a big performance gain 
    // by specifying hardware vertex processing.
    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp, &g_pd3dDevice ) ) )
    {
        return E_FAIL;
    }

    // Device state would normally be set here
	D3DCAPS9	caps; // structure that stores device caps...
	D3DADAPTER_IDENTIFIER9 adapterID;  // Used to store device info

	// Check the capabilities...store into "caps"...
	if( g_pD3D->GetDeviceCaps( 0, D3DDEVTYPE_HAL, &caps ) != D3D_OK )
	{
 		return E_FAIL; // exit if reading caps fails...
	}

	// Gather the primary adapter's information...
	if( g_pD3D->GetAdapterIdentifier( 0, 0, &adapterID ) != D3D_OK )
	{
		return E_FAIL;
	}
	_stprintf(strBuf, _T("Driver %s Description %s Device Name %s Vendor id %4x Device id %4x Product %x Version %x SubVersion %x  Build %x %d.%d.%d.%d SubSysId %x Revision %x GUID %s"), 
		adapterID.Driver, adapterID.Description, adapterID.DeviceName, adapterID.VendorId, adapterID.DeviceId,
		HIWORD(adapterID.DriverVersion.HighPart), LOWORD(adapterID.DriverVersion.HighPart), HIWORD(adapterID.DriverVersion.LowPart), LOWORD(adapterID.DriverVersion.LowPart),
	    HIWORD(adapterID.DriverVersion.HighPart), LOWORD(adapterID.DriverVersion.HighPart), HIWORD(adapterID.DriverVersion.LowPart), LOWORD(adapterID.DriverVersion.LowPart),
		adapterID.SubSysId, adapterID.Revision, print_guid(adapterID.DeviceIdentifier)
		);
    MessageBox(NULL, strBuf, "Identity", MB_OK);

    return S_OK;
}




//-----------------------------------------------------------------------------
// Name: Cleanup()
// Desc: Releases all previously initialized objects
//-----------------------------------------------------------------------------
VOID Cleanup()
{
    if( g_pd3dDevice != NULL) 
        g_pd3dDevice->Release();

    if( g_pD3D != NULL)
        g_pD3D->Release();
}




//-----------------------------------------------------------------------------
// Name: Render()
// Desc: Draws the scene
//-----------------------------------------------------------------------------
VOID Render()
{
    if( NULL == g_pd3dDevice )
        return;

    // Clear the backbuffer to a blue color
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
    
    // Begin the scene
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
        // Rendering of scene objects can happen here
    
        // End the scene
        g_pd3dDevice->EndScene();
    }

    // Present the backbuffer contents to the display
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}




//-----------------------------------------------------------------------------
// Name: MsgProc()
// Desc: The window's message handler
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
        case WM_DESTROY:
            Cleanup();
            PostQuitMessage( 0 );
            return 0;

        case WM_PAINT:
            Render();
            ValidateRect( hWnd, NULL );
            return 0;
    }

    return DefWindowProc( hWnd, msg, wParam, lParam );
}




//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: The application's entry point
//-----------------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
    // Register the window class
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, 
                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                      "D3D Tutorial", NULL };
    RegisterClassEx( &wc );

    // Create the application's window
    HWND hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 01: CreateDevice", 
                              WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
                              GetDesktopWindow(), NULL, wc.hInstance, NULL );

    // Initialize Direct3D
    if( SUCCEEDED( InitD3D( hWnd ) ) )
    { 
        // Show the window
/*
        ShowWindow( hWnd, SW_SHOWDEFAULT );
        UpdateWindow( hWnd );

        // Enter the message loop
        MSG msg; 
        while( GetMessage( &msg, NULL, 0, 0 ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
		*/
    }

    UnregisterClass( "D3D Tutorial", wc.hInstance );
    return 0;
}
identifier.diff (text/plain, 2.8 KB)
Index: d3d8/d3d8_main.c
===================================================================
RCS file: /cvsroot/winex/dlls/d3d8/d3d8_main.c,v
retrieving revision 1.120
diff -u -r1.120 d3d8_main.c
--- d3d8/d3d8_main.c	27 Apr 2004 14:46:31 -0000	1.120
+++ d3d8/d3d8_main.c	21 Jan 2005 15:30:39 -0000
@@ -27,7 +27,7 @@
 
 static D3DCAPS8 *d3d8caps;
 
-static GUID hal_guid = {0x40c1b248,0x9d7d,0x4a29,{0xd7,0xb7,0x4c,0xd8,0x10,0x9f,0x3d,0x5d}};
+static GUID hal_guid = {0xd7b71e3e,0x4111,0x11cf,{0x26,0x67,0x11,0xa7,0x02,0xc2,0xc9,0x35}};
 
 static INT orig_width, orig_height;
 static D3DFORMAT std_format;
@@ -1182,10 +1182,11 @@
 
   strcpy(pIdentifier->Driver, "display");
   strcpy(pIdentifier->Description, "Direct3D HAL");
-  pIdentifier->DriverVersion.s.HighPart = MAKEWORD( 0xa, 0 );   /* Claim to be nvidia 44.96 drivers*/
-  pIdentifier->DriverVersion.s.LowPart = MAKEWORD( 96, 44 );
-  pIdentifier->VendorId = 0x600e; /* Fudge NVidia I think */
-  pIdentifier->DeviceId = 0x10de;  /* GeForce 3 I think */
+  /* Claim to be NVidia 4.14.10.5304 drivers */
+  pIdentifier->DriverVersion.s.HighPart = 0x4000e; /* 4.14 */
+  pIdentifier->DriverVersion.s.LowPart = 0xa14b8;  /* 10.5304 */
+  pIdentifier->VendorId = 0x10de; /* NVidia */
+  pIdentifier->DeviceId = 0x0251; /* GeForce 4 Ti4400 */
   pIdentifier->SubSysId = 0;
   pIdentifier->Revision = 0;
   memcpy(&pIdentifier->DeviceIdentifier, &hal_guid, sizeof(GUID));
Index: d3d9/d3d9_main.c
===================================================================
RCS file: /cvsroot/winex/dlls/d3d9/d3d9_main.c,v
retrieving revision 1.28
diff -u -r1.28 d3d9_main.c
--- d3d9/d3d9_main.c	27 Apr 2004 14:46:31 -0000	1.28
+++ d3d9/d3d9_main.c	21 Jan 2005 15:30:43 -0000
@@ -28,7 +28,7 @@
 
 static D3DCAPS9 *d3d9caps;
 
-static GUID hal_guid = {0x40c1b248,0x9d7d,0x4a29,{0xd7,0xb7,0x4c,0xd8,0x10,0x9f,0x3d,0x5d}};
+static GUID hal_guid = {0xd7b71e3e,0x4111,0x11cf,{0x26,0x67,0x11,0xa7,0x02,0xc2,0xc9,0x35}};
 
 static INT orig_width, orig_height;
 static D3DFORMAT std_format;
@@ -1302,10 +1302,11 @@
   strcpy(pIdentifier->Driver, "display");
   strcpy(pIdentifier->Description, "Direct3D HAL");
   strcpy(pIdentifier->DeviceName, "\\\\.\\DISPLAY");
-  pIdentifier->DriverVersion.s.HighPart = MAKEWORD( 0xa, 0 );   /* Claim to be nvidia 44.96 drivers*/
-  pIdentifier->DriverVersion.s.LowPart = MAKEWORD( 96, 44 );
-  pIdentifier->VendorId = 0x600e; /* Fudge NVidia I think */
-  pIdentifier->DeviceId = 0x10de;  /* GeForce 3 I think */
+  /* Claim to be NVidia 4.14.10.5304 drivers */
+  pIdentifier->DriverVersion.s.HighPart = 0x4000e; /* 4.14 */
+  pIdentifier->DriverVersion.s.LowPart = 0xa14b8;  /* 10.5304 */
+  pIdentifier->VendorId = 0x10de; /* NVidia */
+  pIdentifier->DeviceId = 0x0251; /* GeForce 4 Ti4400 */
   pIdentifier->SubSysId = 0;
   pIdentifier->Revision = 0;
   memcpy(&pIdentifier->DeviceIdentifier, &hal_guid, sizeof(GUID));
CreateDevice.exe.gz (application/x-gzip, 37.5 KB) - not displayed