How To Get Information for a Specific Display Device Driver (200876)



The information in this article applies to:

  • Microsoft Win32 Device Driver Kit (DDK) Windows 95
  • Microsoft Win32 Device Driver Kit (DDK) Windows 98

This article was previously published under Q200876

SUMMARY

This article describes a technique that allows an application to obtain information about a specified display device on a Windows 95 or Windows 98 system.

MORE INFORMATION

On Windows 98 systems, multiple display devices can coexist on a system. There is no API available that allows you to obtain information about the display devices directly from the system. This articles describes a technique for parsing the registry database to obtain this information.

The sample code uses the FindDevice() function to search for devices with a specified Class name. After the device is found, the GetDeviceValue() function is used to get the details for the device.
// 
// Function    : GetDeviceValue
// 
// Purpose     : Read a value from the HW or SW of a PnP device.
// 
// Parameters  :
//   szHardwareKey    Hardware key for the device.
//   szKey            Subkey.
//   szValue          The value to be queried.
//   buf              Buffer to receive the value.
//   cbbuf            Size of buffer.
// 
// Returns     : TRUE if value is obtained.
// 

BOOL GetDeviceValue(LPCSTR szHardwareKey, LPSTR szKey, LPSTR Value,
BYTE *buf, DWORD cbbuf)
{
    HKEY    hkeyHW;
    HKEY    hkeySW;
    BOOL    bFlag = FALSE;
    DWORD   nSize;
    char    szSoftwareKey[MAX_PATH];
    *(DWORD*)buf = 0;
    // 
    // Open the HW key.
    // 

   if (RegOpenKey(HKEY_LOCAL_MACHINE, szHardwareKey, &hkeyHW) == 
   ERROR_SUCCESS)

    {
        // 
        // Try to read the value from the HW key.
        // 
        *buf = 0;
        nSize = cbbuf;
        if (RegQueryValueEx(hkeyHW, szValue, NULL, NULL, buf,
      &nSize) == ERROR_SUCCESS)
        {
            bFlag = TRUE;
        }
        else
        {
            // 
            // Now try the SW key.
            // 
            static char szSW[] =  
        "System\\CurrentControlSet\\Services\\Class\\";
            lstrcpy(szSoftwareKey, szSW);
            nSize = sizeof(szSoftwareKey) - sizeof(szSW);
            RegQueryValueEx(hkeyHW, "Driver", NULL, NULL, szSoftwareKey
            + sizeof(szSW) - 1, &nSize);
            if (szKey)
            {
                lstrcat(szSoftwareKey, "\\");
                lstrcat(szSoftwareKey, szKey);
            }
            if (RegOpenKey(HKEY_LOCAL_MACHINE, szSoftwareKey,   
       &hkeySW) == ERROR_SUCCESS)
            {
                *buf = 0;
                nSize = cbbuf;
                if (RegQueryValueEx(hkeySW, szValue, NULL, NULL, buf,  
        &nSize) == ERROR_SUCCESS)
             {
                    bFlag = TRUE;
                }
                RegCloseKey(hkeySW);
            }
        }
        RegCloseKey(hkeyHW);
    }
    return bFlag;
} 


// 
// Function   : FindDevice
// 
// Purpose    : Enumerates the started PnP devices looking for a  
//              device of a particular class.
// 
// Parameters :
//  iDeviceNumber   What device to return (0=first device, 1=second, etc.)
//  szDeviceClass   What class device (for example, "Display"). NULL will 
//                  match all.
//  szDeviceID     Buffer to return the hardware ID (MAX_PATH bytes).                      
// 
//  Return    : TRUE if a device was found.
// 
// Example:
// 
//      for (int i=0; FindDevice(i, "Display", DeviceID); i++)
//      {
//      }
// 

BOOL FindDevice(int iDeviceNumber, LPCSTR szDeviceClass, LPSTR 
      szHardwareKey)
{
    HKEY    hkeyPnP;
    HKEY    hkey;
    DWORD   nCounter;
    DWORD   nSize;
    DWORD   dwReturnValue;
    char    szBuffer[MAX_PATH];
    if (RegOpenKey(HKEY_DYN_DATA, "Config Manager\\Enum", &hkeyPnP)
       !=  ERROR_SUCCESS)
        return FALSE;
    for (nCounter=0; RegEnumKey(hkeyPnP, nCounter, szBuffer,
       sizeof(szBuffer)) == 0; nCounter++)
    {
        static char szHW[] = "Enum\\";
        if (RegOpenKey(hkeyPnP, szBuffer, &hkey) != ERROR_SUCCESS)
            continue;
       lstrcpy(szHardwareKey, szHW);
        nSize = MAX_PATH - sizeof(szHW);
        RegQueryValueEx(hkey, "HardwareKey", NULL, NULL,
       (BYTE*)szHardwareKey + sizeof(szHW) - 1, &nSize);
        dwReturnValue = 0;
        nSize = sizeof(dwReturnValue);
        RegQueryValueEx(hkey, "Problem", NULL, NULL, 
      (BYTE*)&dwReturnValue, &nSize);
        RegCloseKey(hkey);
        if (dwReturnValue != 0)        // If this device has a problem,
          // skip it.
            continue;
        if (szDeviceClass)
        {
            GetDeviceValue(szHardwareKey, NULL, "Class", szBuffer,
       sizeof(szBuffer));
            if (lstrcmpi(szDeviceClass, szBuffer) != 0)
                continue;
        }
        // 
        // You found a device; make sure it is the one the caller wants.
        // 
        if (iDeviceNumber-- == 0)
        {
            RegCloseKey(hkeyPnP);
            return TRUE;
        }
    }
    RegCloseKey(hkeyPnP);
    return FALSE;
}

void main(int argc, char **argv)
{
    int      iDeviceCounter;
    char    szKey[MAX_PATH];
    char    szValue[MAX_PATH];
    #define GETSZ(a, b) \ 
        GetDeviceValue(szKey, a, b, szValue, sizeof(szValue)); \ 
        printf("  %-20s:\t%s\n", b, szValue);

    for (iDeviceCounter=0; FindDevice(iDeviceCounter, "Display", szKey);
       iDeviceCounter++)
    {
        printf("**** Display %d\n", iDeviceCounter+1);
        GETSZ(NULL, "DeviceDesc");
        GETSZ(NULL, "DriverDesc");
        GETSZ(NULL, "DriverDate");
        GETSZ(NULL, "ProviderName");
        GETSZ(NULL, "Mfg");
        GETSZ("DEFAULT", "drv");
        GETSZ("DEFAULT", "minivdd");
    }
}
				

Modification Type:MajorLast Reviewed:8/17/2004
Keywords:kbdisplay kbhowto kbVideoTech KB200876