示例#1
0
void CEnumSerial::EnumPortsW9x(CArray<SSerInfo,SSerInfo&> &asi)
{
    // Look at all keys in HKLM\Enum, searching for subkeys named
    // *PNP0500 and *PNP0501. Within these subkeys, search for
    // sub-subkeys containing value entries with the name "PORTNAME"
    // Search all subkeys of HKLM\Enum\USBPORTS for PORTNAME entries.

    // First, open HKLM\Enum
    HKEY hkEnum = NULL;
    HKEY hkSubEnum = NULL;
    HKEY hkSubSubEnum = NULL;

    try
    {
        if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Enum"), 0, KEY_READ, &hkEnum) != ERROR_SUCCESS)
            throw CString(_T("Could not read from HKLM\\Enum"));

        // Enumerate the subkeys of HKLM\Enum
        CString acSubEnum;
        DWORD dwSubEnumIndex = 0;
        DWORD dwSize = sizeof(acSubEnum);
        BOOL bContinue;
        LONG regRet;

        bContinue = TRUE;

        while (bContinue)
        {
            dwSize = 1024;
            regRet = RegEnumKeyEx(hkEnum, dwSubEnumIndex, acSubEnum.GetBuffer(1024), &dwSize, NULL, NULL, NULL, NULL);
            acSubEnum.ReleaseBuffer();

            if (regRet == ERROR_SUCCESS)
            {
                dwSubEnumIndex++;
                HKEY hkSubEnum = NULL;
                if (RegOpenKeyEx(hkEnum, acSubEnum, 0, KEY_READ, &hkSubEnum) != ERROR_SUCCESS)
                    throw CString(_T("Could not read from HKLM\\Enum\\"))+acSubEnum;

                // Enumerate the subkeys of HKLM\Enum\*\, looking for keys
                // named *PNP0500 and *PNP0501 (or anything in USBPORTS)
                BOOL bUsbDevice;
                if (acSubEnum == _T("USBPORTS"))
                    bUsbDevice = TRUE;
                else
                    bUsbDevice = FALSE;

                CString acSubSubEnum;
                BOOL bContinueSub;
                DWORD dwSubSubEnumIndex = 0;

                bContinueSub = TRUE;
                while (bContinueSub)
                {
                    dwSize = 1024;  // set the buffer size
                    regRet = RegEnumKeyEx(hkSubEnum, dwSubSubEnumIndex, acSubSubEnum.GetBuffer(1024), &dwSize, NULL, NULL, NULL, NULL);
                    acSubSubEnum.ReleaseBuffer();
                    dwSubSubEnumIndex++;

                    if (regRet == ERROR_SUCCESS)
                    {
                        BOOL bMatch;
                        if ( (acSubSubEnum == _T("*PNP0500")) || (acSubSubEnum == _T("*PNP0501")) || bUsbDevice )
                            bMatch = TRUE;
                        else
                            bMatch = FALSE;

                        if (bMatch)
                        {
                            HKEY hkSubSubEnum = NULL;
                            if (RegOpenKeyEx(hkSubEnum, acSubSubEnum, 0, KEY_READ, &hkSubSubEnum) != ERROR_SUCCESS)
                                throw CString(_T("Could not read from HKLM\\Enum\\")) + acSubEnum + _T("\\") + acSubSubEnum;

                            SearchPnpKeyW9x(hkSubSubEnum, bUsbDevice, asi);
                            RegCloseKey(hkSubSubEnum);
                            hkSubSubEnum = NULL;
                        }
                    }
                    else
                    {
                        bContinueSub = FALSE;
                    }
                }
                RegCloseKey(hkSubEnum);
                hkSubEnum = NULL;
            }
            else
            {
                bContinue = FALSE;
            }
        }
    }
    catch (CString strError)
    {
        if (hkEnum != NULL)
            RegCloseKey(hkEnum);
        if (hkSubEnum != NULL)
            RegCloseKey(hkSubEnum);
        if (hkSubSubEnum != NULL)
            RegCloseKey(hkSubSubEnum);
        throw strError;
    }

    RegCloseKey(hkEnum);
}
void EnumPortsW9x(CArray<SSerInfo,SSerInfo&> &asi)
{
	// Look at all keys in HKLM\Enum, searching for subkeys named
	// *PNP0500 and *PNP0501. Within these subkeys, search for
	// sub-subkeys containing value entries with the name "PORTNAME"
	// Search all subkeys of HKLM\Enum\USBPORTS for PORTNAME entries.

	// First, open HKLM\Enum
	HKEY hkEnum = NULL;
	HKEY hkSubEnum = NULL;
	HKEY hkSubSubEnum = NULL;
	
	try {
		if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Enum", 0, KEY_READ,
			&hkEnum) != ERROR_SUCCESS)
			throw CString("Could not read from HKLM\\Enum");

		// Enumerate the subkeys of HKLM\Enum
  		char acSubEnum[128];
  		DWORD dwSubEnumIndex = 0;
  		DWORD dwSize = sizeof(acSubEnum);
		CString strTemp_acSubEnum;
	 
	 
		while (RegEnumKeyEx(hkEnum, dwSubEnumIndex++, strTemp_acSubEnum.GetBuffer(), &dwSize,
			NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
		{
			strTemp_acSubEnum.ReleaseBuffer();
			HKEY hkSubEnum = NULL;
			if (RegOpenKeyEx(hkEnum, strTemp_acSubEnum.GetBuffer(), 0, KEY_READ,
				&hkSubEnum) != ERROR_SUCCESS)
			{
				strTemp_acSubEnum.ReleaseBuffer();
				throw CString("Could not read from HKLM\\Enum\\") + strTemp_acSubEnum;
			}
			

			// Enumerate the subkeys of HKLM\Enum\*\, looking for keys
			// named *PNP0500 and *PNP0501 (or anything in USBPORTS)
			BOOL bUsbDevice = (strTemp_acSubEnum.CompareNoCase(L"USBPORTS")==0);
			char acSubSubEnum[128];
			dwSize = sizeof(acSubSubEnum);  // set the buffer size
			DWORD dwSubSubEnumIndex = 0;
			CString strTemp_acSubSubEnum;
			while (RegEnumKeyEx(hkSubEnum, dwSubSubEnumIndex++, strTemp_acSubSubEnum.GetBuffer(),
				&dwSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
			{
				strTemp_acSubSubEnum.ReleaseBuffer();
				BOOL bMatch = (strTemp_acSubSubEnum.CompareNoCase(L"*PNP0500")==0 ||
					strTemp_acSubSubEnum.CompareNoCase(L"*PNP0501")==0 ||
					bUsbDevice);
				if (bMatch) {
					HKEY hkSubSubEnum = NULL;
					if (RegOpenKeyEx(hkSubEnum, strTemp_acSubSubEnum.GetBuffer(), 0, KEY_READ,
						&hkSubSubEnum) != ERROR_SUCCESS)
					{
						strTemp_acSubSubEnum.ReleaseBuffer();
						throw CString("Could not read from HKLM\\Enum\\") +
							strTemp_acSubEnum + L"\\" + strTemp_acSubSubEnum;
					}
						
					SearchPnpKeyW9x(hkSubSubEnum, bUsbDevice, asi);
					RegCloseKey(hkSubSubEnum);
					hkSubSubEnum = NULL;
				}

				dwSize = sizeof(acSubSubEnum);  // restore the buffer size
			}

			RegCloseKey(hkSubEnum);
			hkSubEnum = NULL;
			dwSize = sizeof(acSubEnum); // restore the buffer size
		}
	}
	catch (CString strError) {
		if (hkEnum != NULL)
			RegCloseKey(hkEnum);
		if (hkSubEnum != NULL)
			RegCloseKey(hkSubEnum);
		if (hkSubSubEnum != NULL)
			RegCloseKey(hkSubSubEnum);
		throw strError;
	}

	RegCloseKey(hkEnum);
}