📄 ddpdb.c
字号:
for (i = 0; i < DDPDB.dwNumProfiles; i++) {
/* check platform ID: */
if (DDPDB.ddProfiles[i].dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {
/* clear match criteria: */
deviceMatch = driverMatch = 0;
/* check non-critical parameters: */
if (!DDPDB.ddProfiles[i].ID.Win9x.szDescription[0] ||
!strncmp (DDPDB.ddProfiles[i].ID.Win9x.szDescription, ddID.szDescription, MAXDESCRIPT-1))
deviceMatch ++;
if (!DDPDB.ddProfiles[i].ID.Win9x.szDriver[0] ||
!strnicmp (DDPDB.ddProfiles[i].ID.Win9x.szDriver, ddID.szDriver, MAXDRIVER-1))
driverMatch ++;
/* check critical data: */
if (!DDPDB.ddProfiles[i].ID.Win9x.dwDriverVersionHighPart)
driverMatch ++;
else if (DDPDB.ddProfiles[i].ID.Win9x.dwDriverVersionHighPart == (DWORD)ddID.liDriverVersion.HighPart)
driverMatch += 2;
else
continue;
if (!DDPDB.ddProfiles[i].ID.Win9x.dwDriverVersionLowPart)
driverMatch ++;
else if (DDPDB.ddProfiles[i].ID.Win9x.dwDriverVersionLowPart == (DWORD)ddID.liDriverVersion.LowPart)
driverMatch += 2;
else
continue;
if (!DDPDB.ddProfiles[i].ID.Win9x.dwVendorId)
deviceMatch ++;
else if (DDPDB.ddProfiles[i].ID.Win9x.dwVendorId == ddID.dwVendorId)
deviceMatch += 2;
else
continue;
if (!DDPDB.ddProfiles[i].ID.Win9x.dwDeviceId)
deviceMatch ++;
else if (DDPDB.ddProfiles[i].ID.Win9x.dwDeviceId == ddID.dwDeviceId)
deviceMatch += 2;
else
continue;
/* check the results: */
if (deviceMatch + driverMatch > deviceBestMatch + driverBestMatch &&
deviceMatch >= deviceBestMatch && driverMatch >= driverBestMatch) {
/* update best match: */
deviceBestMatch = deviceMatch;
driverBestMatch = driverMatch;
bestMatchIdx = i;
}
}
}
/* check overal search results: */
if (deviceBestMatch >= 3 && driverBestMatch >= 3)
return DDPDB.ddProfiles + bestMatchIdx;
}
#endif //DIRECTDRAW_VERSION <= 0x0500
/* return default profile: */
return &ddWin9xDefaultProfile;
}
}
/* packs 2-character string into a normal, single-character one: */
static void PackWideString (char *dest, char *src, int n)
{
register char *d = dest, *s = src;
while (n-- && *s) {
*d = *s;
s += 2;
d += 1;
}
*d = '\0';
}
static BOOL GetFileVersion(LPTSTR pPath, LPDDDEVICEIDENTIFIER lpddID)
{
DWORD dwVerInfoSize;
DWORD dwVerHnd;
BOOL fSuccess = FALSE;
// load version.dll
HINSTANCE hLib = NULL;
VERQUERYVALUE _pVerQueryValue = NULL;
GETFILEVERSIONINFO _pGetFileVersionInfo = NULL;
GETFILEVERSIONINFOSIZE _pGetFileVersionInfoSize = NULL;
hLib = LoadLibrary("version.dll");
if (hLib)
{
_pVerQueryValue = (VERQUERYVALUE)GetProcAddress(hLib, "VerQueryValueA");
_pGetFileVersionInfo = (GETFILEVERSIONINFO)GetProcAddress(hLib, "GetFileVersionInfoA");
_pGetFileVersionInfoSize = (GETFILEVERSIONINFOSIZE)GetProcAddress(hLib, "GetFileVersionInfoSizeA");
}
if (_pVerQueryValue &&
_pGetFileVersionInfo &&
_pGetFileVersionInfoSize)
{
/* set everything to 0: */
lpddID->liDriverVersion.HighPart = 0;
lpddID->liDriverVersion.LowPart = 0;
/* get size of version info: */
if ((dwVerInfoSize = _pGetFileVersionInfoSize(pPath, &dwVerHnd)) != 0) {
HANDLE hMem; /* handle to mem alloc'ed */
LPSTR lpstrVffInfo; /* Pointer to block to hold info */
/* Get a block big enough to hold version info */
hMem = GlobalAlloc(GMEM_MOVEABLE, dwVerInfoSize);
lpstrVffInfo = (char *)GlobalLock(hMem);
/* get file version info: */
if (_pGetFileVersionInfo(pPath, dwVerHnd, dwVerInfoSize, lpstrVffInfo)) {
UINT VersionLen;
LPSTR lpVersion;
/* query version info: */
if (_pVerQueryValue(lpstrVffInfo, "\\",
(void FAR* FAR*)&lpVersion, &VersionLen)) {
/* copy version info: */
VS_FIXEDFILEINFO* pFileInfo = (VS_FIXEDFILEINFO*)lpVersion;
lpddID->liDriverVersion.HighPart = pFileInfo->dwFileVersionMS;
lpddID->liDriverVersion.LowPart = pFileInfo->dwFileVersionLS;
/* indicate success: */
fSuccess = TRUE;
}
}
/* Let go of the memory */
GlobalUnlock(hMem);
GlobalFree(hMem);
}
}
FreeLibrary(hLib);
return fSuccess;
}
#define MAX_BUF 512
#ifdef TRACE
#define Trace(pMsg) printf("-->%s\n", pMsg)
#else
#define Trace(pMsg) ((void)0)
#endif
/*
* This whole thing is based on Jeff's CFullScreenInfo:: code:
*/
BOOL GetWinNTDeviceID (LPDDDEVICEIDENTIFIER lpddID, char *pszChipType)
{
HKEY hKey;
char szBuffer[MAX_BUF];
DWORD bufSize = sizeof(szBuffer) - 1;
char pDLLPath[_MAX_PATH];
const char* pszStrip = "\\registry\\machine\\";
LONG res = ERROR_SUCCESS;
BOOL retVal = FALSE;
/* open Hardware\\DEVICEMAP\\VIDEO key: */
res = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
"Hardware\\DEVICEMAP\\VIDEO",
0,
KEY_READ,
&hKey
);
if( ERROR_SUCCESS == res )
{
/* query a Video0 entry: */
memset(szBuffer, 0, sizeof(szBuffer) );
res = RegQueryValueEx(hKey,
"\\Device\\Video0",
NULL,
NULL,
(LPBYTE) szBuffer,
(LPDWORD)&bufSize);
//Done with first key.
RegCloseKey(hKey);
if( ERROR_SUCCESS == res )
{
//Find \Registry\Machine in the key's values and strip it
//off. Some machines write the key in different cases.
//If we can't find it, something is wrong. It also must
//be at the start of the string.
_strlwr( szBuffer );
if( strstr(szBuffer, pszStrip) == szBuffer )
{
res = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
szBuffer + strlen(pszStrip), //Skip pre-log.
0,
KEY_READ,
&hKey);
if( res == ERROR_SUCCESS )
{
/* get Device Description: */
memset( szBuffer, 0, sizeof(szBuffer) );
bufSize = sizeof( szBuffer)-1;
res = RegQueryValueEx( hKey,
"HardwareInformation.AdapterString",
NULL,
NULL,
(LPBYTE) szBuffer,
(LPDWORD)&bufSize);
if( ERROR_SUCCESS == res )
{
/* move it to dddid: */
PackWideString(lpddID->szDescription, szBuffer, MAXDESCRIPT-1);
/* get ChipType information: */
memset( szBuffer, 0, sizeof(szBuffer) );
bufSize = sizeof( szBuffer)-1;
res = RegQueryValueEx( hKey,
"HardwareInformation.ChipType",
NULL,
NULL,
(LPBYTE) szBuffer,
(LPDWORD)&bufSize);
if( ERROR_SUCCESS == res )
{
/* copy it: */
PackWideString (pszChipType, szBuffer, MAXCHIPTYPE-1);
/* get driver name: */
memset( szBuffer, 0, sizeof(szBuffer) );
bufSize = sizeof( szBuffer)-1;
res = RegQueryValueEx( hKey,
"InstalledDisplayDrivers",
NULL,
NULL,
(LPBYTE) szBuffer,
(LPDWORD)&bufSize);
if( ERROR_SUCCESS == res && bufSize )
{
//copy driver name
strcat(szBuffer, ".dll");
strncpy(lpddID->szDriver, szBuffer, MAXDRIVER-1);
// get full path to the driver:
if(GetSystemDirectory(pDLLPath, _MAX_PATH) != 0)
{
strcat(pDLLPath, "\\");
strcat(pDLLPath, szBuffer);
// query file version:
if( GetFileVersion(pDLLPath, lpddID) )
{
retVal = TRUE;
}
}
}
}
}
RegCloseKey(hKey);
}
}
}
}
return retVal;
}
static BOOL DevNodeIsActive(char *szDeviceID)
{
HINSTANCE hDevNodeInst;
DWORD dwStatus;
DWORD dwProblemNumber;
DWORD cr;
DWORD (WINAPI *pGetDevNodeStatus32Call) (const char *, LPDWORD, LPDWORD);
/*
* 10 is a magic number for the configuration manager api
* that eventually gets called in the 16 bit dll.
*/
dwStatus = dwProblemNumber = cr = 10;
pGetDevNodeStatus32Call = 0;
if ((hDevNodeInst = LoadLibrary(_32BIT_DLLNAME)) != 0)
{
if (((FARPROC)pGetDevNodeStatus32Call = GetProcAddress(hDevNodeInst, "GetDevNodeStatus32Call")) != NULL)
{
cr = (* pGetDevNodeStatus32Call) (szDeviceID, &dwStatus, &dwProblemNumber);
}
FreeLibrary(hDevNodeInst);
}
return cr == 0 && dwProblemNumber == 0;
}
static unsigned int hex2uint (char *p, int n)
{
register unsigned int i = 0;
while (n--)
{
register unsigned int j = *p;
i <<= 4;
if (j <= '9') j -= '0';
else j -= 'A' - 10;
p ++;
i |= j;
}
return i;
}
/*
* Extract Win9x DirectDraw device information:
*/
BOOL GetWin9xDeviceID (LPDDDEVICEIDENTIFIER lpddID)
{
static char *szEnum_Name [ENUM_MAX] = {
REGSTR_KEY_ROOTENUM, REGSTR_KEY_BIOSENUM,
REGSTR_KEY_PCIENUM, REGSTR_KEY_ISAENUM,
REGSTR_KEY_EISAENUM, REGSTR_KEY_PCMCIAENUM
};
/* moved out of stack for safety reasons... */
static char szCurrentKey [MAX_BUF];
static char szCurrentDeviceNode[MAX_BUF];
static char szCurrentDevice [MAX_BUF];
static char szClass [64];
static char szDeviceID [MAX_BUF];
static char szSoftwareKey [MAX_BUF];
static char pDLLPath [_MAX_PATH];
ULONG ulType;
ULONG32 cbData;
HKEY hSoftwareKey;
char *p;
int i;
Trace("entering GetWin9xDeviceID... ");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -