Exemplo n.º 1
0
BOOL CEnumSerial::ScanEnumTree(LPCTSTR lpEnumPath, CArray<SSerInfo,SSerInfo&> &asi)
{
    static const TCHAR lpstrPortsClass[]=    TEXT("PORTS");
    static const TCHAR lpstrPortsClassGUID[]=TEXT("{4D36E978-E325-11CE-BFC1-08002BE10318}");

    DWORD  dwError=0;
    HKEY   hkEnum=NULL;
    DWORD  dwIndex1;
    HKEY   hkLevel1=NULL;
    DWORD  dwIndex2;
    HKEY   hkLevel2=NULL;
    DWORD  dwIndex3;
    HKEY   hkLevel3=NULL;
    HKEY   hkDeviceParameters=NULL;
    TCHAR  lpClass[sizeof(lpstrPortsClass)/sizeof(lpstrPortsClass[0])];
    DWORD  cbClass;
    TCHAR  lpClassGUID[sizeof(lpstrPortsClassGUID)/sizeof(lpstrPortsClassGUID[0])];
    DWORD  cbClassGUID;
    LPTSTR lpPortName=NULL;
    LPTSTR lpFriendlyName=NULL;

    if(dwError=RegOpenKeyEx(HKEY_LOCAL_MACHINE,lpEnumPath,0,KEY_ENUMERATE_SUB_KEYS,&hkEnum))
    {
        goto end;
    }

    for(dwIndex1=0;; ++dwIndex1)
    {
        if(hkLevel1!=NULL)
        {
            RegCloseKey(hkLevel1);
            hkLevel1=NULL;
        }
        if(dwError=OpenSubKeyByIndex(hkEnum,dwIndex1,KEY_ENUMERATE_SUB_KEYS,&hkLevel1))
        {
            if(dwError==ERROR_NO_MORE_ITEMS)
            {
                dwError=0;
                break;
            }
            else goto end;
        }

        for(dwIndex2=0;; ++dwIndex2)
        {
            if(hkLevel2!=NULL)
            {
                RegCloseKey(hkLevel2);
                hkLevel2=NULL;
            }
            if(dwError=OpenSubKeyByIndex(hkLevel1,dwIndex2,KEY_ENUMERATE_SUB_KEYS,&hkLevel2))
            {
                if(dwError==ERROR_NO_MORE_ITEMS)
                {
                    dwError=0;
                    break;
                }
                else goto end;
            }

            for(dwIndex3=0;; ++dwIndex3)
            {
                BOOL               bFriendlyNameNotFound=FALSE;
                SSerInfo portinfo;

                if(hkLevel3!=NULL)
                {
                    RegCloseKey(hkLevel3);
                    hkLevel3=NULL;
                }
                if(dwError=OpenSubKeyByIndex(hkLevel2,dwIndex3,KEY_READ,&hkLevel3))
                {
                    if(dwError==ERROR_NO_MORE_ITEMS)
                    {
                        dwError=0;
                        break;
                    }
                    else goto end;
                }

                /* Look if the driver class is the one we're looking for.
                 * We accept either "CLASS" or "CLASSGUID" as identifiers.
                 * No need to dynamically arrange for space to retrieve the values,
                 * they must have the same length as the strings they're compared to
                 * if the comparison is to be succesful.
                 */

                cbClass=sizeof(lpClass);
                if(RegQueryValueEx(hkLevel3,TEXT("CLASS"),NULL,NULL,
                                   (LPBYTE)lpClass,&cbClass)==ERROR_SUCCESS&&
                        _tcsicmp(lpClass,lpstrPortsClass)==0)
                {
                    /* ok */
                }
                else
                {
                    cbClassGUID=sizeof(lpClassGUID);
                    if(RegQueryValueEx(hkLevel3,TEXT("CLASSGUID"),NULL,NULL,
                                       (LPBYTE)lpClassGUID,&cbClassGUID)==ERROR_SUCCESS&&
                            _tcsicmp(lpClassGUID,lpstrPortsClassGUID)==0)
                    {
                        /* ok */
                    }
                    else continue;
                }

                /* get "PORTNAME" */

                dwError=QueryStringValue(hkLevel3,TEXT("PORTNAME"),&lpPortName);
                if(dwError==ERROR_FILE_NOT_FOUND)
                {
                    /* In Win200, "PORTNAME" is located under the subkey "DEVICE PARAMETERS".
                     * Try and look there.
                     */

                    if(hkDeviceParameters!=NULL)
                    {
                        RegCloseKey(hkDeviceParameters);
                        hkDeviceParameters=NULL;
                    }
                    if(RegOpenKeyEx(hkLevel3,TEXT("DEVICE PARAMETERS"),0,KEY_READ,
                                    &hkDeviceParameters)==ERROR_SUCCESS)
                    {
                        dwError=QueryStringValue(hkDeviceParameters,TEXT("PORTNAME"),&lpPortName);
                    }
                }
                if(dwError)
                {
                    if(dwError==ERROR_FILE_NOT_FOUND)
                    {
                        /* boy that was strange, we better skip this device */
                        dwError=0;
                        continue;
                    }
                    else goto end;
                }

                /* check if it is a serial port (instead of, say, a parallel port) */

                if(_tcsncicmp(lpPortName,TEXT("COM"),3)!=0)continue;

                /* now go for "FRIENDLYNAME" */

                if(dwError=QueryStringValue(hkLevel3,TEXT("FRIENDLYNAME"),&lpFriendlyName))
                {
                    if(dwError==ERROR_FILE_NOT_FOUND)
                    {
                        bFriendlyNameNotFound=TRUE;
                        dwError=0;
                    }
                    else goto end;
                }

                /* Assemble the information and pass it on to the callback.
                 * In the unlikely case there's no friendly name available,
                 * use port name instead.
                 */
                // Prepare an entry for the output array.
                portinfo.strPortName = lpPortName;
                portinfo.strFriendlyName = bFriendlyNameNotFound?lpPortName:lpFriendlyName;
                portinfo.strDevPath = CString(_T("\\\\.\\")) + lpPortName;
                portinfo.bUsbDevice = FALSE;

                // Overwrite duplicates.
                BOOL bDup = FALSE;
                for (int ii=0; ii<asi.GetSize() && !bDup; ii++)
                {
                    if (asi[ii].strPortName == lpPortName)
                    {
                        bDup = TRUE;
                        asi[ii] = portinfo;
                    }
                }
                if (!bDup)
                {
                    // Add an entry to the array
                    asi.Add(portinfo);
                }
            }
        }
    }

end:
    free(lpFriendlyName);
    free(lpPortName);
    if(hkDeviceParameters!=NULL)RegCloseKey(hkDeviceParameters);
    if(hkLevel3!=NULL)          RegCloseKey(hkLevel3);
    if(hkLevel2!=NULL)          RegCloseKey(hkLevel2);
    if(hkLevel1!=NULL)          RegCloseKey(hkLevel1);
    if(hkEnum!=NULL)            RegCloseKey(hkEnum);
    if(dwError!=0)
    {
        SetLastError(dwError);
        return FALSE;
    }
    else return TRUE;
}
Exemplo n.º 2
0
int ScanEnumTree( t_usbInterface* usbInt, LPCTSTR lpEnumPath, TCHAR** openPorts )
{
  static const TCHAR lpstrPortsClass[] = TEXT("PORTS");
  static const TCHAR lpstrPortsClassGUID[] = TEXT("{4D36E978-E325-11CE-BFC1-08002BE10318}");

  DWORD  dwError=0;
  HKEY   hkEnum=NULL;
  DWORD  dwIndex1;
  HKEY   hkLevel1=NULL;
  DWORD  dwIndex2;
  HKEY   hkLevel2=NULL;
  HKEY   hkDeviceParameters=NULL;
  TCHAR  lpClass[sizeof(lpstrPortsClass)/sizeof(lpstrPortsClass[0])];
  DWORD  cbClass;
  TCHAR  lpClassGUID[sizeof(lpstrPortsClassGUID)/sizeof(lpstrPortsClassGUID[0])];
  DWORD  cbClassGUID;
  LPTSTR lpPortName=NULL;
  LPTSTR lpFriendlyName=NULL;
  int result;
  int openCount = 0;

  typedef struct
  {
    LPCTSTR lpPortName;     /* "COM1", etc. */
    LPCTSTR lpFriendlyName; /* Suitable to describe the port, as for  */
                          /* instance "Infrared serial port (COM4)" */
  }LISTPORTS_PORTINFO;

  if(dwError=RegOpenKeyEx(HKEY_LOCAL_MACHINE,lpEnumPath,0,KEY_ENUMERATE_SUB_KEYS,&hkEnum)){
    goto end;
  }

  for(dwIndex1=0;;++dwIndex1)
  {
	//post("finding loop; dwIndex1 = %d\n", dwIndex1);

    if(hkLevel1!=NULL){
      RegCloseKey(hkLevel1);
      hkLevel1=NULL;
    }
    if(dwError=OpenSubKeyByIndex(hkEnum,dwIndex1,KEY_ENUMERATE_SUB_KEYS,&hkLevel1)){
      if(dwError==ERROR_NO_MORE_ITEMS){
        dwError=0;
        break;
      }
      else goto end;
    }

      for(dwIndex2=0;;++dwIndex2){
        BOOL               bFriendlyNameNotFound=FALSE;
        LISTPORTS_PORTINFO portinfo;

        if(hkLevel2!=NULL){
          RegCloseKey(hkLevel2);
          hkLevel2=NULL;
        }
        if(dwError=OpenSubKeyByIndex(hkLevel1,dwIndex2,KEY_READ,&hkLevel2)){
          if(dwError==ERROR_NO_MORE_ITEMS){
            dwError=0;
            break;
          }
          else goto end;
        }

        /* Look if the driver class is the one we're looking for.
         * We accept either "CLASS" or "CLASSGUID" as identifiers.
         * No need to dynamically arrange for space to retrieve the values,
         * they must have the same length as the strings they're compared to
         * if the comparison is to be succesful.
         */

        cbClass=sizeof(lpClass);
        if(RegQueryValueEx(hkLevel2,TEXT("CLASS"),NULL,NULL,
                           (LPBYTE)lpClass,&cbClass)==ERROR_SUCCESS&&
           _tcsicmp(lpClass,lpstrPortsClass)==0){
          /* ok */
        }
        else{
          cbClassGUID=sizeof(lpClassGUID);
          if(RegQueryValueEx(hkLevel2,TEXT("CLASSGUID"),NULL,NULL,
                             (LPBYTE)lpClassGUID,&cbClassGUID)==ERROR_SUCCESS&&
             _tcsicmp(lpClassGUID,lpstrPortsClassGUID)==0){
            /* ok */
          }
          else continue;
        }

        /* get "PORTNAME" */

        dwError=QueryStringValue(hkLevel2,TEXT("PORTNAME"),&lpPortName);
        if(dwError==ERROR_FILE_NOT_FOUND){
          /* In Win200, "PORTNAME" is located under the subkey "DEVICE PARAMETERS".
           * Try and look there.
           */

          if(hkDeviceParameters!=NULL){
            RegCloseKey(hkDeviceParameters);
            hkDeviceParameters=NULL;
          }
          if(RegOpenKeyEx(hkLevel2,TEXT("DEVICE PARAMETERS"),0,KEY_READ,
                          &hkDeviceParameters)==ERROR_SUCCESS){
             dwError=QueryStringValue(hkDeviceParameters,TEXT("PORTNAME"),&lpPortName);
          }
        }
        if(dwError){
          if(dwError==ERROR_FILE_NOT_FOUND){ 
            /* boy that was strange, we better skip this device */
            dwError=0;
            continue;
          }
          else goto end;
        }
         //post("found port, name %ls\n", lpPortName);

        /* check if it is a serial port (instead of, say, a parallel port) */

        if(_tcsncmp(lpPortName,TEXT("COM"),3)!=0)continue;

        /* now go for "FRIENDLYNAME" */

        if(dwError=QueryStringValue(hkLevel2,TEXT("FRIENDLYNAME"),&lpFriendlyName)){
          if(dwError==ERROR_FILE_NOT_FOUND){
            bFriendlyNameNotFound=TRUE;
            dwError=0;
          }
          else goto end;
        }
        
        /* Assemble the information and pass it on to the callback.
         * In the unlikely case there's no friendly name available,
         * use port name instead.
         */
        portinfo.lpPortName=lpPortName;
        portinfo.lpFriendlyName=bFriendlyNameNotFound?lpPortName:lpFriendlyName;
		{
			//post( "Friendly name: %s\n", portinfo.lpFriendlyName );
			if (!_tcsncmp(TEXT("Make Controller Kit"), portinfo.lpFriendlyName, 19))
			{
				TCHAR* pname;
				pname = _tcsdup(portinfo.lpPortName);
				// We've found a matching entry in the registry...
				// Now see if it's actually there by trying to open it
				result = testOpen( usbInt, pname );
				// if it is, store it
				if( result == 0 )
					openPorts[ openCount++ ] = pname; 
			}
        }
      }
  }
  goto end;

end:
  free(lpFriendlyName);
  free(lpPortName);
  if(hkDeviceParameters!=NULL)RegCloseKey(hkDeviceParameters);
  if(hkLevel2!=NULL)          RegCloseKey(hkLevel2);
  if(hkLevel1!=NULL)          RegCloseKey(hkLevel1);
  if(hkEnum!=NULL)            RegCloseKey(hkEnum);
  if(dwError!=0)
  {
    SetLastError(dwError);
    return 0;
  }
  else return openCount;
}
Exemplo n.º 3
0
BOOL ScanEnumTree(LPCTSTR lpEnumPath,LISTPORTS_CALLBACK lpCbk,LPVOID lpCbkValue)
{
  static const TCHAR lpstrPortsClass[]=    TEXT("PORTS");
  static const TCHAR lpstrPortsClassGUID[]=TEXT("{4D36E978-E325-11CE-BFC1-08002BE10318}");

  DWORD  dwError=0;
  HKEY   hkEnum=NULL;
  DWORD  dwIndex1;
  HKEY   hkLevel1=NULL;
  DWORD  dwIndex2;
  HKEY   hkLevel2=NULL;
  DWORD  dwIndex3;
  HKEY   hkLevel3=NULL;
  HKEY   hkDeviceParameters=NULL;
  TCHAR  lpClass[sizeof(lpstrPortsClass)/sizeof(lpstrPortsClass[0])];
  DWORD  cbClass;
  TCHAR  lpClassGUID[sizeof(lpstrPortsClassGUID)/sizeof(lpstrPortsClassGUID[0])];
  DWORD  cbClassGUID;
  LPTSTR lpPortName=NULL;
  LPTSTR lpFriendlyName=NULL;
  LPTSTR lpTechnology=NULL;

  if((dwError=RegOpenKeyEx(HKEY_LOCAL_MACHINE,lpEnumPath,0,KEY_ENUMERATE_SUB_KEYS,&hkEnum)) != 0){
    goto end;
  }

  for(dwIndex1=0;;++dwIndex1){
    if(hkLevel1!=NULL){
      RegCloseKey(hkLevel1);
      hkLevel1=NULL;
    }
    if((dwError=OpenSubKeyByIndex(
                hkEnum,dwIndex1,KEY_ENUMERATE_SUB_KEYS,&hkLevel1,&lpTechnology)) != 0){
      if(dwError==ERROR_NO_MORE_ITEMS){
        dwError=0;
        break;
      }
      else goto end;
    }

    for(dwIndex2=0;;++dwIndex2){
      if(hkLevel2!=NULL){
        RegCloseKey(hkLevel2);
        hkLevel2=NULL;
      }
      if((dwError=OpenSubKeyByIndex(
                   hkLevel1,dwIndex2,KEY_ENUMERATE_SUB_KEYS,&hkLevel2,NULL)) != 0){
        if(dwError==ERROR_NO_MORE_ITEMS){
          dwError=0;
          break;
        }
        else goto end;
      }

      for(dwIndex3=0;;++dwIndex3){
        BOOL               bFriendlyNameNotFound=FALSE;
        LISTPORTS_PORTINFO portinfo;

        if(hkLevel3!=NULL){
          RegCloseKey(hkLevel3);
          hkLevel3=NULL;
        }
        if((dwError=OpenSubKeyByIndex(hkLevel2,dwIndex3,KEY_READ,&hkLevel3,NULL)) != 0){
          if(dwError==ERROR_NO_MORE_ITEMS){
            dwError=0;
            break;
          }
          else goto end;
        }

        /* Look if the driver class is the one we're looking for.
         * We accept either "CLASS" or "CLASSGUID" as identifiers.
         * No need to dynamically arrange for space to retrieve the values,
         * they must have the same length as the strings they're compared to
         * if the comparison is to be succesful.
         */

        cbClass=sizeof(lpClass);
        if(RegQueryValueEx(hkLevel3,TEXT("CLASS"),NULL,NULL,
                           (LPBYTE)lpClass,&cbClass)==ERROR_SUCCESS&&
           _tcsicmp(lpClass,lpstrPortsClass)==0){
          /* ok */
        }
        else{
          cbClassGUID=sizeof(lpClassGUID);
          if(RegQueryValueEx(hkLevel3,TEXT("CLASSGUID"),NULL,NULL,
                             (LPBYTE)lpClassGUID,&cbClassGUID)==ERROR_SUCCESS&&
             _tcsicmp(lpClassGUID,lpstrPortsClassGUID)==0){
            /* ok */
          }
          else continue;
        }

        /* get "PORTNAME" */

        dwError=QueryStringValue(hkLevel3,TEXT("PORTNAME"),&lpPortName);
        if(dwError==ERROR_FILE_NOT_FOUND){
          /* In Win200, "PORTNAME" is located under the subkey "DEVICE PARAMETERS".
           * Try and look there.
           */

          if(hkDeviceParameters!=NULL){
            RegCloseKey(hkDeviceParameters);
            hkDeviceParameters=NULL;
          }
          if(RegOpenKeyEx(hkLevel3,TEXT("DEVICE PARAMETERS"),0,KEY_READ,
                          &hkDeviceParameters)==ERROR_SUCCESS){
             dwError=QueryStringValue(hkDeviceParameters,TEXT("PORTNAME"),&lpPortName);
          }
        }
        if(dwError){
          if(dwError==ERROR_FILE_NOT_FOUND){ 
            /* boy that was strange, we better skip this device */
            dwError=0;
            continue;
          }
          else goto end;
        }

        /* check if it is a serial port (instead of, say, a parallel port) */

        if(strnicmp(lpPortName,TEXT("COM"),3)!=0)continue;

        /* now go for "FRIENDLYNAME" */

        if((dwError=QueryStringValue(hkLevel3,TEXT("FRIENDLYNAME"),&lpFriendlyName)) != 0){
          if(dwError==ERROR_FILE_NOT_FOUND){
            bFriendlyNameNotFound=TRUE;
            dwError=0;
          }
          else goto end;
        }

        /* Assemble the information and pass it on to the callback.
         * In the unlikely case there's no friendly name available,
         * use port name instead.
         */
        portinfo.lpPortName=lpPortName;
        portinfo.lpFriendlyName=bFriendlyNameNotFound?lpPortName:lpFriendlyName;
        portinfo.lpTechnology=lpTechnology;
        if(!lpCbk(lpCbkValue,&portinfo)){
          goto end; /* listing aborted by callback */
        }
      }
    }
  }

end:
  free(lpTechnology);
  free(lpFriendlyName);
  free(lpPortName);
  if(hkDeviceParameters!=NULL)RegCloseKey(hkDeviceParameters);
  if(hkLevel3!=NULL)          RegCloseKey(hkLevel3);
  if(hkLevel2!=NULL)          RegCloseKey(hkLevel2);
  if(hkLevel1!=NULL)          RegCloseKey(hkLevel1);
  if(hkEnum!=NULL)            RegCloseKey(hkEnum);
  if(dwError!=0){
    SetLastError(dwError);
    return FALSE;
  }
  else return TRUE;
}