BOOL CRegKey2::ExportToIni(LPCTSTR szIniPath) const { ASSERT (m_hKey); if (!m_hKey) return FALSE; CStdioFileEx file; if (!file.Open(szIniPath, CFile::modeCreate | CFile::modeWrite)) return FALSE; // process top level keys. ie we ignore any values in the root CStringArray aSubKeys; if (GetSubkeyNames(aSubKeys)) { for (int nKey = 0; nKey < aSubKeys.GetSize(); nKey++) { CString sName = aSubKeys[nKey]; if (!ExportKeyToIni(sName, file)) return FALSE; } } return TRUE; }
HKEY FindAdapterKey( PDHCP_ADAPTER Adapter ) { int i = 0; PCHAR EnumKeyName = "SYSTEM\\CurrentControlSet\\Control\\Class\\" "{4D36E972-E325-11CE-BFC1-08002BE10318}"; PCHAR TargetKeyNameStart = "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\"; PCHAR TargetKeyName = NULL; PCHAR *EnumKeysLinkage = GetSubkeyNames( EnumKeyName, "\\Linkage" ); PCHAR *EnumKeysTop = GetSubkeyNames( EnumKeyName, "" ); PCHAR RootDevice = NULL; HKEY EnumKey, OutKey = NULL; DWORD Error = ERROR_SUCCESS; if( !EnumKeysLinkage || !EnumKeysTop ) goto cleanup; Error = RegOpenKey( HKEY_LOCAL_MACHINE, EnumKeyName, &EnumKey ); if( Error ) goto cleanup; for( i = 0; EnumKeysLinkage[i]; i++ ) { RootDevice = RegReadString ( EnumKey, EnumKeysLinkage[i], "RootDevice" ); if( RootDevice && !strcmp( RootDevice, Adapter->DhclientInfo.name ) ) { TargetKeyName = (CHAR*) malloc( strlen( TargetKeyNameStart ) + strlen( RootDevice ) + 1); if( !TargetKeyName ) goto cleanup; sprintf( TargetKeyName, "%s%s", TargetKeyNameStart, RootDevice ); Error = RegCreateKeyExA( HKEY_LOCAL_MACHINE, TargetKeyName, 0, NULL, 0, KEY_READ, NULL, &OutKey, NULL ); break; } else { free( RootDevice ); RootDevice = 0; } } cleanup: if( RootDevice ) free( RootDevice ); if( EnumKeysLinkage ) free( EnumKeysLinkage ); if( EnumKeysTop ) free( EnumKeysTop ); if( TargetKeyName ) free( TargetKeyName ); return OutKey; }