/*++ Copyright (c) 1997 Microsoft Corporation Module Name: enum.cpp Abstract: Enumerates WIA device registry. Author: Keisuke Tsuchida (KeisukeT) 01-Jun-2000 History: --*/ // // Include Headers // #define INIT_GUID #include "cplusinc.h" #include "sticomm.h" #include #include #include #include #include #include #include "enum.h" VOID DebugOutputDeviceName( HDEVINFO hDevInfo, PSP_DEVINFO_DATA pspDevInfoData, LPCTSTR szKeyName ); VOID DebugOutputInterfaceName( HDEVINFO hDevInfo, PSP_DEVICE_INTERFACE_DATA pspDevInterfaceData, LPCTSTR szKeyName ); BOOL IsStiRegKey( HKEY hkDevRegKey ); // // Define // // from sti_ci.h #define WIA_DEVKEYLIST_INITIAL_SIZE 1024 #define STILL_IMAGE TEXT("StillImage") #define SUBCLASS TEXT("SubClass") // // Functions // extern "C"{ PWIA_DEVKEYLIST WiaCreateDeviceRegistryList( BOOL bEnumActiveOnly ) { PWIA_DEVKEYLIST pReturn; PWIA_DEVKEYLIST pTempBuffer; HKEY hkDevRegKey; DWORD dwError; DWORD dwCurrentSize; DWORD dwRequiredSize; DWORD dwNumberOfDevices; DWORD dwFlags; DWORD dwValueSize; DWORD dwDetailDataSize; BOOL bIsPlugged; HANDLE hDevInfo; CONFIGRET ConfigRet; ULONG ulStatus; ULONG ulProblemNumber; DWORD Idx; GUID Guid; SP_DEVINFO_DATA spDevInfoData; SP_DEVICE_INTERFACE_DATA spDevInterfaceData; PSP_DEVICE_INTERFACE_DETAIL_DATA pspDevInterfaceDetailData; // DPRINTF(DM_ERROR,TEXT("WiaCreateDeviceRegistryList: Enter... bEnumActiveOnly=%d"), bEnumActiveOnly); // // Initialize local. // pReturn = NULL; pTempBuffer = NULL; hkDevRegKey = (HKEY)INVALID_HANDLE_VALUE; dwError = ERROR_SUCCESS; dwCurrentSize = WIA_DEVKEYLIST_INITIAL_SIZE; dwRequiredSize = sizeof(DWORD); dwNumberOfDevices = 0; dwFlags = (bEnumActiveOnly ? DIGCF_PRESENT : 0) | DIGCF_PROFILE; hDevInfo = INVALID_HANDLE_VALUE; Idx = 0; Guid = GUID_DEVCLASS_IMAGE; ConfigRet = CR_SUCCESS; ulStatus = 0; ulProblemNumber = 0; bIsPlugged = FALSE; pspDevInterfaceDetailData = NULL; memset(&spDevInfoData, 0, sizeof(spDevInfoData)); memset(&spDevInterfaceData, 0, sizeof(spDevInterfaceData)); // // Allocate buffer. // pTempBuffer = (PWIA_DEVKEYLIST)new BYTE[dwCurrentSize]; if(NULL == pTempBuffer){ DPRINTF(DM_ERROR,TEXT("WiaCreateDeviceRegistryList: ERROR!! Insufficient system resources. Err=0x%x\n"), GetLastError()); pReturn = NULL; goto WiaCreateDeviceRegistryList_return; } // if(NULL == pTempBuffer) memset(pTempBuffer, 0, dwCurrentSize); // // Enumerate "devnode" devices. // hDevInfo = SetupDiGetClassDevs (&Guid, NULL, NULL, dwFlags); if (hDevInfo == INVALID_HANDLE_VALUE) { DPRINTF(DM_ERROR,TEXT("WiaCreateDeviceRegistryList: ERROR!! SetupDiGetClassDevs (devnodes) fails. Err=0x%x\n"), GetLastError()); pReturn = NULL; goto WiaCreateDeviceRegistryList_return; } spDevInfoData.cbSize = sizeof (SP_DEVINFO_DATA); for (Idx = 0; SetupDiEnumDeviceInfo (hDevInfo, Idx, &spDevInfoData); Idx++) { // DebugOutputDeviceName(hDevInfo, &spDevInfoData, TEXT("DriverDesc")); // // Get device regkey. // hkDevRegKey = SetupDiOpenDevRegKey(hDevInfo, &spDevInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DRV, KEY_READ | KEY_WRITE); if(INVALID_HANDLE_VALUE == hkDevRegKey){ // // Attempt to open the key as READ ONLY instead... // hkDevRegKey = SetupDiOpenDevRegKey(hDevInfo, &spDevInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DRV, KEY_READ); if(INVALID_HANDLE_VALUE == hkDevRegKey){ DPRINTF(DM_ERROR,TEXT("WiaCreateDeviceRegistryList: ERROR!! SetupDiOpenDevRegKey (devnodes) fails. Err=0x%x\n"), GetLastError()); continue; } // if(INVALID_HANDLE_VALUE == hkDevRegKey) } // if(INVALID_HANDLE_VALUE == hkDevRegKey) // // See if it has "StillImage" in SubClass key. // if(!IsStiRegKey(hkDevRegKey)){ RegCloseKey(hkDevRegKey); hkDevRegKey = (HKEY)INVALID_HANDLE_VALUE; continue; } // if(!IsStiRegKey(hkDevRegKey)) // // See if this node is active. // bIsPlugged = TRUE; ulStatus = 0; ulProblemNumber = 0; ConfigRet = CM_Get_DevNode_Status(&ulStatus, &ulProblemNumber, spDevInfoData.DevInst, 0); if(CR_SUCCESS != ConfigRet){ // DPRINTF(DM_ERROR,TEXT("WiaCreateDeviceRegistryList: Unable to get devnode status. CR=0x%x.\n"), ConfigRet); if(bEnumActiveOnly){ RegCloseKey(hkDevRegKey); hkDevRegKey = (HKEY)INVALID_HANDLE_VALUE; continue; } else { bIsPlugged = FALSE; } } // if(CR_SUCCESS != ConfigRet) // DPRINTF(DM_ERROR,TEXT("WiaCreateDeviceRegistryList: Devnode status=0x%x, Problem=0x%x.\n"), ulStatus, ulProblemNumber); // // Skip a node with problem if enumerating only active devices. // if(bEnumActiveOnly){ if(!(ulStatus & DN_STARTED)){ RegCloseKey(hkDevRegKey); hkDevRegKey = (HKEY)INVALID_HANDLE_VALUE; continue; } // if(!(ulStatus & DN_STARTED)) } // if(bEnumActiveOnly) // // Add acquired regkey handle. If running out of buffer, enlarge. // dwRequiredSize += sizeof(WIA_DEVPROP); if(dwCurrentSize < dwRequiredSize){ PWIA_DEVKEYLIST pTempNew; DWORD dwNewSize; dwNewSize = dwCurrentSize + WIA_DEVKEYLIST_INITIAL_SIZE; pTempNew = (PWIA_DEVKEYLIST)new BYTE[dwNewSize]; if(NULL == pTempNew){ pReturn = NULL; goto WiaCreateDeviceRegistryList_return; } // if(NULL == pTempNew) memset(pTempNew, 0, dwNewSize); memcpy(pTempNew, pTempBuffer, dwCurrentSize); delete pTempBuffer; pTempBuffer = pTempNew; dwCurrentSize = dwNewSize; } // if(dwCurrentSize < dwRequiredSize) // // Fill in the structure. // pTempBuffer->Dev[dwNumberOfDevices].bIsPlugged = bIsPlugged; pTempBuffer->Dev[dwNumberOfDevices].ulProblem = ulProblemNumber; pTempBuffer->Dev[dwNumberOfDevices].ulStatus = ulStatus; pTempBuffer->Dev[dwNumberOfDevices].hkDeviceRegistry = hkDevRegKey; dwNumberOfDevices++; } // for (Idx = 0; SetupDiEnumDeviceInfo (hDevInfo, Idx, &spDevInfoData); Idx++) // // Free device info set. // SetupDiDestroyDeviceInfoList(hDevInfo); hDevInfo = INVALID_HANDLE_VALUE; // // Enumerate "interface" devices. // hDevInfo = SetupDiGetClassDevs (&Guid, NULL, NULL, DIGCF_PROFILE | DIGCF_DEVICEINTERFACE); if (hDevInfo == INVALID_HANDLE_VALUE) { pReturn = NULL; goto WiaCreateDeviceRegistryList_return; } spDevInterfaceData.cbSize = sizeof (spDevInterfaceData); for (Idx = 0; SetupDiEnumDeviceInterfaces (hDevInfo, NULL, &Guid, Idx, &spDevInterfaceData); Idx++) { // DebugOutputInterfaceName(hDevInfo, &spDevInterfaceData, TEXT("FriendlyName")); hkDevRegKey = SetupDiOpenDeviceInterfaceRegKey(hDevInfo, &spDevInterfaceData, 0, KEY_READ | KEY_WRITE); if(INVALID_HANDLE_VALUE == hkDevRegKey){ // // Attempt to open the key as READ ONLY instead... // hkDevRegKey = SetupDiOpenDeviceInterfaceRegKey(hDevInfo, &spDevInterfaceData, 0, KEY_READ); if(INVALID_HANDLE_VALUE == hkDevRegKey){ continue; } // if(INVALID_HANDLE_VALUE == hkDevRegKey) } // if(INVALID_HANDLE_VALUE == hkDevRegKey) // // See if it has "StillImage" in SubClass key. // if(!IsStiRegKey(hkDevRegKey)){ RegCloseKey(hkDevRegKey); hkDevRegKey = (HKEY)INVALID_HANDLE_VALUE; continue; } // if(!IsStiRegKey(hkDevRegKey)) bIsPlugged = TRUE; ulStatus = 0; ulProblemNumber = 0; // // Get devnode which this interface is created on. // SetupDiGetDeviceInterfaceDetail(hDevInfo, &spDevInterfaceData, NULL, 0, &dwDetailDataSize, NULL); if(0 == dwDetailDataSize){ DPRINTF(DM_ERROR, TEXT("IsInterfaceActive: SetupDiGetDeviceInterfaceDetail() failed. Err=0x%x. ReqSize=0x%x"), GetLastError(), dwDetailDataSize); if(bEnumActiveOnly){ RegCloseKey(hkDevRegKey); hkDevRegKey = (HKEY)INVALID_HANDLE_VALUE; continue; } else { bIsPlugged = FALSE; } } // if(0 == dwDetailDataSize) // // Allocate memory for data. // pspDevInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)new char[dwDetailDataSize]; if(NULL == pspDevInterfaceDetailData){ DPRINTF(DM_ERROR, TEXT("IsInterfaceActive: Insufficient buffer.")); RegCloseKey(hkDevRegKey); hkDevRegKey = (HKEY)INVALID_HANDLE_VALUE; continue; } // if(NULL == pspDevInterfaceDetailData) // // Get the actual data. // spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA); pspDevInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); if(!SetupDiGetDeviceInterfaceDetail(hDevInfo, &spDevInterfaceData, pspDevInterfaceDetailData, dwDetailDataSize, &dwDetailDataSize, &spDevInfoData)){ DPRINTF(DM_ERROR, TEXT("IsInterfaceActive: SetupDiGetDeviceInterfaceDetail() failed. Err=0x%x. ReqSize=0x%x"), GetLastError(), dwRequiredSize); delete pspDevInterfaceDetailData; pspDevInterfaceDetailData = NULL; if(bEnumActiveOnly){ RegCloseKey(hkDevRegKey); hkDevRegKey = (HKEY)INVALID_HANDLE_VALUE; continue; } else { bIsPlugged = FALSE; } }// if(!SetupDiGetDeviceInterfaceDetail() if(NULL != pspDevInterfaceDetailData){ delete pspDevInterfaceDetailData; pspDevInterfaceDetailData = NULL; } // if(NULL != pspDevInterfaceDetailData) // // See its devnode is active. // ConfigRet = CM_Get_DevNode_Status(&ulStatus, &ulProblemNumber, spDevInfoData.DevInst, 0); if(CR_SUCCESS != ConfigRet){ DPRINTF(DM_ERROR,TEXT("WiaCreateDeviceRegistryList: Unable to get devnode status. CR=0x%x.\n"), ConfigRet); if(bEnumActiveOnly){ RegCloseKey(hkDevRegKey); hkDevRegKey = (HKEY)INVALID_HANDLE_VALUE; continue; } else { bIsPlugged = FALSE; } } // if(CR_SUCCESS != ConfigRet) if(bEnumActiveOnly){ if(!(ulStatus & DN_STARTED)){ RegCloseKey(hkDevRegKey); hkDevRegKey = (HKEY)INVALID_HANDLE_VALUE; continue; } // if(!(ulStatus & DN_STARTED)) } // if(bEnumActiveOnly) // // Add acquired regkey handle. If running out of buffer, enlarge. // dwRequiredSize += sizeof(WIA_DEVPROP); if(dwCurrentSize < dwRequiredSize){ PWIA_DEVKEYLIST pTempNew; DWORD dwNewSize; dwNewSize = dwCurrentSize + WIA_DEVKEYLIST_INITIAL_SIZE; pTempNew = (PWIA_DEVKEYLIST)new BYTE[dwNewSize]; if(NULL == pTempNew){ pReturn = NULL; goto WiaCreateDeviceRegistryList_return; } // if(NULL == pTempNew) memset(pTempNew, 0, dwNewSize); memcpy(pTempNew, pTempBuffer, dwCurrentSize); delete pTempBuffer; pTempBuffer = pTempNew; dwCurrentSize = dwNewSize; } // if(dwCurrentSize < dwRequiredSize) // // Fill in the structure. // pTempBuffer->Dev[dwNumberOfDevices].bIsPlugged = bIsPlugged; pTempBuffer->Dev[dwNumberOfDevices].ulProblem = ulProblemNumber; pTempBuffer->Dev[dwNumberOfDevices].ulStatus = ulStatus; pTempBuffer->Dev[dwNumberOfDevices].hkDeviceRegistry = hkDevRegKey; dwNumberOfDevices++; } // for (Idx = 0; SetupDiEnumDeviceInterfaces (hDevInfo, NULL, &Guid, Idx, &spDevInterfaceData); Idx++) // // Operation succeeded. // if(0 != dwNumberOfDevices){ pTempBuffer->dwNumberOfDevices = dwNumberOfDevices; pReturn = pTempBuffer; pTempBuffer = NULL; } // if(0 != dwNumberOfDevices) WiaCreateDeviceRegistryList_return: // // Clean up. // if(INVALID_HANDLE_VALUE != hDevInfo){ SetupDiDestroyDeviceInfoList(hDevInfo); } // if(INVALID_HANDLE_VALUE != hDevInfo) if(NULL != pTempBuffer){ pTempBuffer->dwNumberOfDevices = dwNumberOfDevices; WiaDestroyDeviceRegistryList(pTempBuffer); } // if(NULL != pTempBuffer) // DPRINTF(DM_ERROR, TEXT("WiaCreateDeviceRegistryList: Leave... %d devices. Ret=0x%p."), dwNumberOfDevices, pReturn); return pReturn; } // WiaCreateDeviceRegistryList() VOID WiaDestroyDeviceRegistryList( PWIA_DEVKEYLIST pWiaDevKeyList ) { DWORD Idx; // // Check argument. // if(NULL == pWiaDevKeyList){ goto WiaFreeDeviceRegistryList_return; } for(Idx = 0; Idx < pWiaDevKeyList->dwNumberOfDevices; Idx++){ if(INVALID_HANDLE_VALUE != pWiaDevKeyList->Dev[Idx].hkDeviceRegistry){ RegCloseKey(pWiaDevKeyList->Dev[Idx].hkDeviceRegistry); } // if(INVALID_HANDLE_VALUE != pWiaDevKeyList->Dev[Idx].hkDeviceRegistry) } // for(Idx = 0; Idx < pWiaDevKeyList->dwNumberOfDevices; Idx++) delete pWiaDevKeyList; WiaFreeDeviceRegistryList_return: return; } VOID EnumLpt( VOID ) { CONFIGRET ConfigRet; HDEVINFO hLptDevInfo; SP_DEVINFO_DATA spDevInfoData; DWORD Idx; GUID Guid; DWORD dwCurrentTickCount; static DWORD s_dwLastTickCount = 0; // // Initialize local. // ConfigRet = CR_SUCCESS; hLptDevInfo = (HDEVINFO) INVALID_HANDLE_VALUE; Idx = 0; Guid = GUID_PARALLEL_DEVICE; dwCurrentTickCount = 0; memset(&spDevInfoData, 0, sizeof(spDevInfoData)); // // Get current system tick. // dwCurrentTickCount = GetTickCount(); // // Bail out if the function is called within ENUMLPT_HOLDTIME millisec. // if( (dwCurrentTickCount - s_dwLastTickCount) < ENUMLPT_HOLDTIME){ goto EnumLpt_return; } // // Save current tick // s_dwLastTickCount = dwCurrentTickCount; // // Enum LPT port as needed. // if(IsPnpLptExisting()){ // // Get LPT devnodes. // Guid = GUID_PARALLEL_DEVICE; hLptDevInfo = SetupDiGetClassDevs(&Guid, NULL, NULL, DIGCF_INTERFACEDEVICE); if(INVALID_HANDLE_VALUE == hLptDevInfo){ goto EnumLpt_return; } // // Re-enumerate LPT port. // spDevInfoData.cbSize = sizeof(spDevInfoData); for(Idx = 0; SetupDiEnumDeviceInfo(hLptDevInfo, Idx, &spDevInfoData); Idx++){ ConfigRet = CM_Reenumerate_DevNode(spDevInfoData.DevInst, CM_REENUMERATE_NORMAL); if(CR_SUCCESS != ConfigRet){ DPRINTF(DM_ERROR,TEXT("EnumLpt: ERROR!! CM_Reenumerate_DevNode() fails. Idx=0x%x, ConfigRet=0x%x\n"), Idx, ConfigRet); } // if(CR_SUCCESS != ConfigRet) } // for(Idx = 0; SetupDiEnumDeviceInfo(hLptDevInfo, Idx, &spDevInfoData); Idx++) } // if(IsPnpLptExisting()) EnumLpt_return: // // Clean up. // if(INVALID_HANDLE_VALUE != hLptDevInfo){ SetupDiDestroyDeviceInfoList(hLptDevInfo); } // if(INVALID_HANDLE_HALUE != hLptDevInfo) return; } // EnumLpt() BOOL IsPnpLptExisting( VOID ) { HDEVINFO hDevInfo; CONFIGRET ConfigRet; DWORD Idx; GUID Guid; SP_DEVINFO_DATA spDevInfoData; HKEY hkDevRegKey; DWORD dwHardwareConfig; LONG lResult; ULONG ulStatus; ULONG ulProblemNumber; BOOL bRet; // // Initialize local. // hDevInfo = INVALID_HANDLE_VALUE; ConfigRet = CR_SUCCESS; Idx = 0; Guid = GUID_DEVCLASS_IMAGE; hkDevRegKey = (HKEY)INVALID_HANDLE_VALUE; ulStatus = 0; ulProblemNumber = 0; bRet = FALSE; memset(&spDevInfoData, 0, sizeof(spDevInfoData)); // // Enum Imaging class devnode. // hDevInfo = SetupDiGetClassDevs (&Guid, NULL, NULL, DIGCF_PROFILE); if(hDevInfo == INVALID_HANDLE_VALUE){ goto IsPnpLptExisting_return; } // if(hDevInfo == INVALID_HANDLE_VALUE)} spDevInfoData.cbSize = sizeof (SP_DEVINFO_DATA); for (Idx = 0; SetupDiEnumDeviceInfo (hDevInfo, Idx, &spDevInfoData); Idx++) { hkDevRegKey = SetupDiOpenDevRegKey(hDevInfo, &spDevInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DRV, KEY_READ); if(INVALID_HANDLE_VALUE == hkDevRegKey){ DPRINTF(DM_ERROR,TEXT("WiaCreateDeviceRegistryList: ERROR!! SetupDiOpenDevRegKey (devnodes) fails. Err=0x%x\n"), GetLastError()); continue; } // if(INVALID_HANDLE_VALUE == hkDevRegKey) // // Make sure it's STI/WIA device. // if(!IsStiRegKey(hkDevRegKey)){ RegCloseKey(hkDevRegKey); hkDevRegKey = (HKEY)INVALID_HANDLE_VALUE; continue; } // if(!IsStiRegKey(hkDevRegKey)) // // Get "Hardware config" key. // dwHardwareConfig = ReadRegistryDwordW(hkDevRegKey, REGSTR_VAL_HARDWARE_W, 0); RegCloseKey(hkDevRegKey); hkDevRegKey = (HKEY)INVALID_HANDLE_VALUE; if(!(dwHardwareConfig & STI_HW_CONFIG_PARALLEL)){ // // This is not a parallel device. // continue; } // if(!IsStiRegKey(hkDevRegKey)) // // See if device is detected by system. // ulStatus = 0; ulProblemNumber = 0; ConfigRet = CM_Get_DevNode_Status(&ulStatus, &ulProblemNumber, spDevInfoData.DevInst, 0); if(CR_SUCCESS != ConfigRet){ // // There is a Pnp LPT device installed but not been detected on boot. Let enum LPT. // bRet = TRUE; break; } // if(CR_SUCCESS != ConfigRet) } // for (Idx = 0; SetupDiEnumDeviceInfo (hDevInfo, Idx, &spDevInfoData); Idx++) IsPnpLptExisting_return: // // Clean up. // if(INVALID_HANDLE_VALUE != hDevInfo){ SetupDiDestroyDeviceInfoList(hDevInfo); } // if(INVALID_HANDLE_VALUE != hDevInfo) return bRet; } // IsPnpLptExisting() } // extern "C" VOID DebugOutputDeviceName( HDEVINFO hDevInfo, PSP_DEVINFO_DATA pspDevInfoData, LPCTSTR szKeyName ) { HKEY hkDev = NULL; TCHAR szBuffer[1024]; DWORD dwSize; LONG lResult; DWORD dwType; hkDev = SetupDiOpenDevRegKey(hDevInfo, pspDevInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DRV, KEY_READ); if(INVALID_HANDLE_VALUE == hkDev){ DPRINTF(DM_ERROR, TEXT("DebugOutputDeviceName: SetupDiOpenDevRegKey() failed. Err=0x%x"), GetLastError()); goto DebugOutputDeviceName_return; } // if(INVALID_HANDLE_VALUE == hkDev) dwSize = sizeof(szBuffer); lResult = RegQueryValueEx(hkDev, szKeyName, NULL, &dwType, (LPBYTE)szBuffer, &dwSize); if(ERROR_SUCCESS != lResult){ DPRINTF(DM_ERROR, TEXT("DebugOutputDeviceName: RegQueryValueEx() failed. Err=0x%x"), lResult); goto DebugOutputDeviceName_return; } switch(dwType){ case REG_DWORD: DPRINTF(DM_ERROR, TEXT("DebugOutputDeviceName: Value: %s, Data: 0x%x"), szKeyName, szBuffer); break; case REG_SZ: DPRINTF(DM_ERROR, TEXT("DebugOutputDeviceName: Value: %s, Data: %s"), szKeyName, szBuffer); } DebugOutputDeviceName_return: // Close opened key if(hkDev && (INVALID_HANDLE_VALUE != hkDev) ){ RegCloseKey(hkDev); hkDev = (HKEY)INVALID_HANDLE_VALUE; } return; } // DebugOutputDeviceRegistry( VOID DebugOutputInterfaceName( HDEVINFO hDevInfo, PSP_DEVICE_INTERFACE_DATA pspDevInterfaceData, LPCTSTR szKeyName ) { HKEY hkDev = NULL; TCHAR szBuffer[1024]; DWORD dwSize; LONG lResult; DWORD dwType; hkDev = SetupDiOpenDeviceInterfaceRegKey(hDevInfo, pspDevInterfaceData, 0, KEY_READ); if(INVALID_HANDLE_VALUE == hkDev){ // DPRINTF(DM_ERROR, TEXT("DebugOutputInterfaceName: SetupDiOpenDeviceInterfaceRegKey() failed. Err=0x%x"), GetLastError()); goto DebugOutputInterfaceName_return; } // if(INVALID_HANDLE_VALUE == hkDev) dwSize = sizeof(szBuffer); lResult = RegQueryValueEx(hkDev, szKeyName, NULL, &dwType, (LPBYTE)szBuffer, &dwSize); if(ERROR_SUCCESS != lResult){ // DPRINTF(DM_ERROR, TEXT("DebugOutputInterfaceName: RegQueryValueEx() failed. Err=0x%x"), lResult); goto DebugOutputInterfaceName_return; } switch(dwType){ case REG_DWORD: DPRINTF(DM_ERROR, TEXT("DebugOutputInterfaceName: Value: %s, Data: 0x%x"), szKeyName, szBuffer); break; case REG_SZ: DPRINTF(DM_ERROR, TEXT("DebugOutputInterfaceName: Value: %s, Data: %s"), szKeyName, szBuffer); } DebugOutputInterfaceName_return: // Close opened key if(hkDev && (INVALID_HANDLE_VALUE != hkDev) ){ RegCloseKey(hkDev); hkDev = (HKEY)INVALID_HANDLE_VALUE; } return; } // DebugOutputInterfaceName() BOOL IsStiRegKey( HKEY hkDevRegKey ) { DWORD dwValueSize; TCHAR szSubClass[MAX_PATH]; BOOL bRet; bRet = TRUE; dwValueSize = sizeof(szSubClass); memset(&szSubClass, 0, sizeof(szSubClass)); RegQueryValueEx(hkDevRegKey, SUBCLASS, NULL, NULL, (LPBYTE)szSubClass, &dwValueSize); if( (0 == lstrlen(szSubClass)) || (lstrcmpi(szSubClass, STILL_IMAGE)) ) { bRet = FALSE; } return bRet; } // IsStiRegKey() /********************************* End of File ***************************/