모니터 정보보기2 - EDID

http://www.tech-archive.net/Archive/Development/microsoft.public.development.device.drivers/2004-08/0294.html

#include "windows.h"
#include "setupapi.h"
#include "initguid.h"
#include "stdio.h"

#define NAME_SIZE 128
#define PRINT(_x_) printf _x_

DEFINE_GUID (GUID_CLASS_MONITOR,
        0x4d36e96e, 0xe325, 0x11ce, 0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1,
0x03, 0x18);

static void
PlayWithDeviceInfo(
 IN HDEVINFO devInfo,
 IN PSP_DEVINFO_DATA devInfoData
 )
{
    HKEY hDevRegKey;
    DWORD uniID[123];

    if (SetupDiGetDeviceRegistryProperty(
            devInfo,
            devInfoData,
            SPDRP_DEVICEDESC,//SPDRP_UI_NUMBER,
            NULL,
            (PBYTE)(&uniID),
            sizeof(uniID),
            NULL))
    {
        printf("UID: %s\n",uniID);
    }
    else {
        printf("ERROR: %d\n",GetLastError());
    }

    hDevRegKey = SetupDiOpenDevRegKey(
        devInfo,
        devInfoData,
        DICS_FLAG_GLOBAL,
        0,
        DIREG_DEV,
        KEY_ALL_ACCESS);

    if (hDevRegKey) {
        LONG retValue,i;
        DWORD dwType, AcutalValueNameLength= NAME_SIZE;

        CHAR valueName[NAME_SIZE];

        for (i = 0, retValue = ERROR_SUCCESS; retValue !=
ERROR_NO_MORE_ITEMS; i++)
        {
            unsigned char EDIDdata[1024];
            DWORD j,edidsize=sizeof(EDIDdata);

            retValue = RegEnumValue (
                            hDevRegKey,
                            i,
                            &valueName[0],
                            &AcutalValueNameLength,
                            NULL,//reserved
                            &dwType,
                            EDIDdata, // buffer
                            &edidsize); // buffer size

            if (retValue == ERROR_SUCCESS )
            {
                if (!strcmp(valueName,"EDID")) {
                    printf("Found value EDID\n");
                    {

                        for (j=0;j<edidsize;j++) {
                            if (j %16 == 0) printf("\n");
                            printf("%02x ",EDIDdata[j]);
                        }
                        printf("\n");
                    }

                    break;
                }
            }
        }

        RegCloseKey(hDevRegKey);
    }
    else {
        printf("ERROR:%d\n",GetLastError());
    }

}
int EnumDevices()
{
 HDEVINFO devInfo = NULL;
 SP_DEVINFO_DATA devInfoData;
 SP_DEVINFO_LIST_DETAIL_DATA devInfoSetDetailData;
 ULONG i;

 do
 {

  devInfo = SetupDiGetClassDevsEx(
      &GUID_CLASS_MONITOR, //class GUID
      NULL, //enumerator
      NULL, //HWND
      DIGCF_PRESENT, // Flags //DIGCF_ALLCLASSES|
      NULL, // device info, create a new one.
      NULL, // machine name, local machine
      NULL);// reserved

  if (NULL == devInfo)
  {
   //PrintWin32Error("SetupDiGetClassDevsEx");
   break;
  }

  for (i=0;ERROR_NO_MORE_ITEMS != GetLastError();i++)
  {

   memset(&devInfoData,0,sizeof(devInfoData));
   devInfoData.cbSize = sizeof(devInfoData);

   if (SetupDiEnumDeviceInfo(devInfo,i,&devInfoData))
   {
    PlayWithDeviceInfo(devInfo,&devInfoData);
   }
  }

 } while (FALSE);

 return i;
}

int __cdecl main()
{
    EnumDevices();
    return 0;
}

-
Calvin Guan Software Engineer
ATI Technologies Inc. www.ati.com