⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ddpdb.c

📁 著名的 helix realplayer 基于手机 symbian 系统的 播放器全套源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
    /* we want to look through the ENUM\BIOS, ENUM\ISAPNP, and ENUM\PCI
     * trees for devices of the DISPLAY class.  For each display device
     * we find we will ask the Device manager if it is active. */
    for (i = 0; i < ENUM_MAX; i++)
    {
        HKEY hBusKey;
        /* construct a string for the current key: */
        strcpy(szCurrentKey, REGSTR_KEY_ENUM);
        strcat(szCurrentKey, "\\");
        strcat(szCurrentKey, szEnum_Name[i]);

        Trace("\nopenining LOCAL_MACHINE key:");
        Trace(szCurrentKey);

        /* start reading the devices */
        if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szCurrentKey, 0, KEY_READ, &hBusKey) == ERROR_SUCCESS)
        {
            ULONG32 dwDevNodeEnumIndex = 0;

            Trace("opened;");

            /* Enumerate all of the devices on the bus */
            while (1)
            {
                HKEY hDeviceNodeKey;

                memset(szCurrentDeviceNode, 0, sizeof(szCurrentDeviceNode));
                cbData = sizeof(szCurrentDeviceNode) - 1;
                if (RegEnumKeyEx(hBusKey, dwDevNodeEnumIndex, szCurrentDeviceNode, &cbData, NULL, NULL, NULL, NULL) != ERROR_SUCCESS)
                    break;

                /* construct a string for current device node: */
                strcpy(szCurrentKey,REGSTR_KEY_ENUM);
                strcat(szCurrentKey, "\\");
                strcat(szCurrentKey, szEnum_Name[i]);
                strcat(szCurrentKey, "\\");
                strcat(szCurrentKey, szCurrentDeviceNode);

                Trace("opening device node:");
                Trace(szCurrentKey);

                /* get the registry key for the current device node */
                if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szCurrentKey, 0, KEY_READ, &hDeviceNodeKey) == ERROR_SUCCESS)
                {
                    ULONG32 dwHWDeviceEnumIndex = 0;

                    Trace("opened;");

                    /* enumerate all of the hardware devices in this Device Node */
                    while (1)
                    {
                        HKEY hHWDeviceKey;
                        int nBaseKeyLength;

                        memset(szCurrentDevice, 0, sizeof(szCurrentDevice));
                        cbData = sizeof(szCurrentDevice) - 1;
                        if (RegEnumKeyEx(hDeviceNodeKey, dwHWDeviceEnumIndex, szCurrentDevice, &cbData, NULL, NULL, NULL, NULL) != ERROR_SUCCESS)
                            break;

                        /* get the registry key for the current hardware device */
                        nBaseKeyLength = strlen(szCurrentKey);

                        /* append currect device name: */
                        strcat(szCurrentKey, "\\");
                        strcat(szCurrentKey, szCurrentDevice);

                        Trace("opening device named:");
                        Trace(szCurrentKey);

                        if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szCurrentKey, 0, KEY_READ, &hHWDeviceKey) == ERROR_SUCCESS)
                        {
                            Trace("opened;");

                            /* ask if this device is a "DISPLAY" device by checking it's class */
                            cbData = sizeof(szClass);
                            szClass[0] = 0;

                            Trace("quering class of this device: ");

                            if (RegQueryValueEx(hHWDeviceKey, "Class", 0, &ulType, (LPBYTE) szClass, &cbData) == ERROR_SUCCESS)
                            {
                                Trace("obtained:");
                                Trace(szClass);

                                /* is it Display??? */
                                if (!stricmp(szClass, "DISPLAY"))
                                {
                                    Trace("looks like a display adapter!!");

                                    /* if it is a display device then we want to find out if it is
                                     * the active device for this class. */
                                    memset(szSoftwareKey, 0, sizeof(szSoftwareKey));
                                    cbData = sizeof(szSoftwareKey) - 1;

                                    /* create a string for Device ID: */
                                    strcpy(szDeviceID, szEnum_Name[i]);
                                    strcat(szDeviceID, "\\");
                                    strcat(szDeviceID, szCurrentDeviceNode);
                                    strcat(szDeviceID, "\\");
                                    strcat(szDeviceID, szCurrentDevice);

                                    Trace("quering device ID:");
                                    Trace(szDeviceID);

                                    /* get the registry key name for the software key for the device,
                                     * if it is not null and this is the active device then we are done. */
                                    if (RegQueryValueEx(hHWDeviceKey, "Driver", 0, &ulType, (LPBYTE) szSoftwareKey, &cbData) == ERROR_SUCCESS &&
                                        szSoftwareKey[0] != '0' &&
                                        DevNodeIsActive(szDeviceID))    /* Call Config Manager in 16-bit code */
                                    {
                                        Trace("device found!!!:");

                                        /* close all open keys and continue processing... */
                                        RegCloseKey(hHWDeviceKey);
                                        RegCloseKey(hDeviceNodeKey);
                                        RegCloseKey(hBusKey);
                                        goto cont;
                                    }
                                }
                            }
                            /* close hardware device key: */
                            RegCloseKey(hHWDeviceKey);
                        }
                        /* reset the key to the base for the next time through the loop: */
                        memset (szCurrentKey + nBaseKeyLength, 0, sizeof(szCurrentKey) - nBaseKeyLength);

                        /* move to next device key */
                        dwHWDeviceEnumIndex ++;
                    }
                    /* close device node key: */
                    RegCloseKey(hDeviceNodeKey);
                }
                /* move to the next device node */
                dwDevNodeEnumIndex ++;
            }
            /* close bus key: */
            RegCloseKey(hBusKey);
        }
    }
    Trace("exiting GetWin9xDeviceID (device not found):");
    /* not found: */
    return FALSE;


cont:
    /* get Vendor ID: */
    if ((p = strstr(szDeviceID, "VEN_")) != 0)
        lpddID->dwVendorId = hex2uint (p + strlen("VEN_"), 4);

    /* get DeviceID: */
    if ((p = strstr(szDeviceID, "DEV_")) != 0)
        lpddID->dwDeviceId = hex2uint (p + strlen("DEV_"), 4);

    /* get Revision #: */
    if ((p = strstr(szDeviceID, "REV_")) != 0)
        lpddID->dwRevision = hex2uint (p + strlen("REV_"), 4);

    /* if we found the software key, we want to go get the Driver description
     * and the driver file name: */

    /* create a software key string: */
    strcpy(szCurrentKey, REGSTR_PATH_CLASS);
    strcat(szCurrentKey, "\\");
    strcat(szCurrentKey, szSoftwareKey);

    Trace("opening software key:");
    Trace(szCurrentKey);

    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szCurrentKey, 0, KEY_READ, &hSoftwareKey) == ERROR_SUCCESS)
    {
        /* use external buffer: */
        char* szAdapterString = lpddID->szDescription;
        cbData = MAX_DDDEVICEID_STRING;

        Trace("opened;");

        /* query device description: */
        RegQueryValueEx(hSoftwareKey, "DriverDesc", 0, &ulType, (LPBYTE)szAdapterString, &cbData);

        /* close software key; */
        RegCloseKey(hSoftwareKey);
    }

    /* now look in the Default key for the driver file name */
    strcat(szCurrentKey, "\\DEFAULT");
    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szCurrentKey, 0, KEY_READ, &hSoftwareKey) == ERROR_SUCCESS)
    {
        char* szDisplayDriverName = lpddID->szDriver;
        cbData = MAX_DDDEVICEID_STRING;

        /* query driver name: */
        RegQueryValueEx(hSoftwareKey, "drv", 0, &ulType, (LPBYTE)szDisplayDriverName, &cbData);

        /* close software key: */
        RegCloseKey(hSoftwareKey);

        /* get the file version: */
        if (GetSystemDirectory(pDLLPath, _MAX_PATH) != 0)
        {
            strcat(pDLLPath, "\\");
            strcat(pDLLPath, szDisplayDriverName);

            Trace("trying to get a file version:");

            /* query file version: */
            GetFileVersion(pDLLPath, lpddID);
        }
    }

    Trace("exiting GetWin9xDeviceID:");
    return TRUE;
}


/***********************************
 * Utilities:
 **************************************/

#ifdef DUMP
/* a simple database creation program: */
int main (int argc, char *argv[])
{
    FILE *fp;
    int s;

    /* check arguments: */
    if (argc < 2) {
        fprintf (stderr, "Use:\n\tDDPDB <file name>\n");
        exit (EXIT_FAILURE);
    }

    /* create a file: */
    if ((fp = fopen (argv[1], "wb+")) == NULL) {
        fprintf (stderr, "Cannot open database file.\n");
        exit (EXIT_FAILURE);
    }

    /* calculate the size of file: */
    s = 16 + DDPDB.dwNumProfiles * sizeof(DDDEVICEPROFILE);

    /* dump raw data: */
    if (fwrite((void*)&DDPDB, 1, s, fp) != s) {
        fprintf (stderr, "Write error (out of disk space?).\n");
        exit (EXIT_FAILURE);
    }

    /* close file: */
    fclose(fp);
    exit (EXIT_SUCCESS);
}
#endif /* DUMP */


#ifdef IMPORT
/* a profile generation program: */
int main ()
{
    OSVERSIONINFO osVersion;
    LPDIRECTDRAW lpDD;
    LPDIRECTDRAW4 lpDD4;
    DDDEVICEIDENTIFIER ddID;                    /* DirectDraw & Win95 info      */
    char szChipType[MAXCHIPTYPE];               /* NT info      */

    /* try to load DirectDraw library: */
    if (DirectDrawCreate (NULL, &lpDD, NULL) != DD_OK) {
        printf ("Cannot create DirectDraw object!");
        exit(EXIT_FAILURE);
    }

    /* check if we are runnning NT: */
    memset(&osVersion,0, sizeof(OSVERSIONINFO));
    osVersion.dwOSVersionInfoSize  = sizeof(OSVERSIONINFO);
    if (GetVersionEx(&osVersion) && osVersion.dwPlatformId == VER_PLATFORM_WIN32_NT)
    {
        /* try to get WinNT device information: */
        if (!GetWinNTDeviceID (&ddID, szChipType)) {
            fprintf (stderr, "Cannot get NT driver info\n");
            exit (EXIT_FAILURE);
        }
        /* print header: */
        printf ("\tVER_PLATFORM_WIN32_NT,\n");

    }
    else
    { /* Win9x: */
#ifndef IMPORT        
        /* try to get DirectDraw device identifier: */
        memset (&ddID, 0, sizeof (DDDEVICEIDENTIFIER));
        if (
            (IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw4, (void**)&lpDD4) != DD_OK ||
            IDirectDraw4_GetDeviceIdentifier(lpDD4, &ddID, DDGDI_GETHOSTIDENTIFIER) != DD_OK) &&
            /* try to gather Win9x device information manually: */
            !GetWin9xDeviceID (&ddID)) {
                fprintf (stderr, "Cannot get Win9x driver info\n");
                exit (EXIT_FAILURE);
            }

        /* print header: */
        printf( "\tVER_PLATFORM_WIN32_WINDOWS,\n");
#else
        printf( "Need more work to run this tool on win95 machines.....\n" );
#endif        
    }

    /* dump description: */
    ddID.szDescription[MAXDESCRIPT-1] = '\0';
    printf ("\t{\"%s\",\n", ddID.szDescription);

    /* dump driver: */
    ddID.szDriver[MAXDRIVER-1] = '\0';
    printf ("\t \"%s\",\n", ddID.szDriver);

    /* driver version: */
    printf ("\t 0x%x,0x%x,\n", ddID.liDriverVersion.LowPart, ddID.liDriverVersion.HighPart);

    if (osVersion.dwPlatformId == VER_PLATFORM_WIN32_NT) {
        /* dump: WinNT vars:*/
        printf ("\t 0x%x, 0x%x, 0x%x, 0x%x, \n",
            *(DWORD*)(szChipType), *(DWORD*)(szChipType+4), *(DWORD*)(szChipType+8), *(DWORD*)(szChipType+12));

        printf ("\t {0x%x,0x%x,0x%x,{0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x}}\n",
            *(DWORD*)(szChipType+16), *(WORD*)(szChipType+20), *(WORD*)(szChipType+22),
            szChipType[24], szChipType[25], szChipType[26], szChipType[27],
            szChipType[28], szChipType[29], szChipType[30], szChipType[31]);

    } else {
        /* dump: Win9x vars:*/
        printf ("\t 0x%x, 0x%x, 0x%x, 0x%x, \n",
            ddID.dwVendorId, ddID.dwDeviceId, ddID.dwSubSysId, ddID.dwRevision);
        printf ("\t {0x%x,0x%x,0x%x,{0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x}}\n",
            ddID.guidDeviceIdentifier.Data1,
            ddID.guidDeviceIdentifier.Data2,    ddID.guidDeviceIdentifier.Data3,
            ddID.guidDeviceIdentifier.Data4[0], ddID.guidDeviceIdentifier.Data4[1],
            ddID.guidDeviceIdentifier.Data4[2], ddID.guidDeviceIdentifier.Data4[3],
            ddID.guidDeviceIdentifier.Data4[4], ddID.guidDeviceIdentifier.Data4[5],
            ddID.guidDeviceIdentifier.Data4[6], ddID.guidDeviceIdentifier.Data4[7]);
    }

    exit (EXIT_SUCCESS);
}
#endif /* IMPORT */

/* ddpdb.c -- end of file */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -