public bool loadAsXml(xmlReader r, string strFilename) { bool bReturn = true; ArrayList arrInternalKeyLoads = new ArrayList(); string strValueName = "", strValueValue = "", strValueType = ""; r.showMsgBoxOnError(true); r.open(strFilename); while (r.readString() && bReturn) { switch (r.getNodeType()) { case NODETYPE.NODETYPE_BEGINELEMENT: { string strElement = r.getNodeName(); strElement = getUnescapedXmlString(strElement); } break; case NODETYPE.NODETYPE_ENDELEMENT: { string strElement = r.getNodeName(); strElement = getUnescapedXmlString(strElement); // close the latest key now if (strElement.CompareTo(XML_KEY) == 0 && arrInternalKeyLoads.Count > 0) { // retrieve latest key InternalKeyLoad p = (InternalKeyLoad)arrInternalKeyLoads[arrInternalKeyLoads.Count - 1]; p.reg.Close(); arrInternalKeyLoads.RemoveAt(arrInternalKeyLoads.Count - 1); } else if (strElement.CompareTo(XML_VALUE) == 0 && arrInternalKeyLoads.Count > 0) // <v .../> { // now set/create the value InternalKeyLoad p = (InternalKeyLoad)arrInternalKeyLoads[arrInternalKeyLoads.Count - 1]; LoadAsXml_SetValue(getRegistryHandle(p.reg), strValueName, strValueValue, strValueType); strValueName = ""; strValueValue = ""; strValueType = ""; } } break; case NODETYPE.NODETYPE_ATTRIB: { string strName, strValue; strName = r.getAttribName(); strValue = r.getAttribValue(); strName = getUnescapedXmlString(strName); strValue = getUnescapedXmlString(strValue); string strCurrentElement = r.getNodeName(); // <k name="..."> ? if (strName.CompareTo(XML_NAME) == 0 && strCurrentElement.CompareTo(XML_KEY) == 0) { InternalKeyLoad p = new InternalKeyLoad(); p.strKeyname = strValue; arrInternalKeyLoads.Add(p); // open the key, and store the handle p.reg = LoadAsXml_OpenKey(arrInternalKeyLoads); arrInternalKeyLoads.RemoveAt(arrInternalKeyLoads.Count - 1); arrInternalKeyLoads.Add(p); if (p.reg == null) { bReturn = false; // abort the process } } else if (strCurrentElement.CompareTo(XML_VALUE) == 0) // <v name="..." value="..." type="..." /> { if (strName.CompareTo(XML_NAME) == 0) // name="..." { strValueName = strValue; strValueValue = ""; strValueType = ""; } else if (strName.CompareTo(XML_VALUE2) == 0) // value="..." { strValueValue = strValue; strValueType = ""; } else if (strName.CompareTo(XML_TYPE) == 0) // type="..." { strValueType = strValue; } } } break; // other nodetypes : we don't care } } // end read lines one by one r.close(); return(bReturn); }
RegistryKey LoadAsXml_OpenKey(ArrayList arrInternalKeyLoads) { RegistryKey reg = null; if (arrInternalKeyLoads.Count == 0) { return(null); // come on! } // build the real path from the array of keynames // open the key now string strMainKey = "", strPath = ""; int nSize = arrInternalKeyLoads.Count; for (int i = 0; i < nSize; i++) { InternalKeyLoad p = (InternalKeyLoad)arrInternalKeyLoads[i]; if (i == 0) { strMainKey = p.strKeyname; } else { if (strPath.Length > 0) { strPath += "\\"; } strPath += p.strKeyname; } } // end for try { // open the key now reg = openKey(strMainKey, strPath); if (reg != null) // it's ok { return(reg); } // key does not exist, so let's create it ! if (strMainKey.ToUpper().CompareTo("HKEY_CLASSES_ROOT") == 0) { reg = Registry.ClassesRoot.CreateSubKey(strPath); } else if (strMainKey.ToUpper().CompareTo("HKEY_CURRENT_USER") == 0) { reg = Registry.CurrentUser.CreateSubKey(strPath); } else if (strMainKey.ToUpper().CompareTo("HKEY_LOCAL_MACHINE") == 0) { reg = Registry.LocalMachine.CreateSubKey(strPath); } else if (strMainKey.ToUpper().CompareTo("HKEY_USERS") == 0) { reg = Registry.Users.CreateSubKey(strPath); } else if (strMainKey.ToUpper().CompareTo("HKEY_CURRENT_CONFIG") == 0) { reg = Registry.CurrentConfig.CreateSubKey(strPath); } else { return(null); // break here } } catch (Exception) { } if (reg != null) // it's ok { return(reg); } MessageBox.Show(string.Format("couldn't create key {0}\\{1}", strMainKey, strPath), "Office Recovery Manager", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return(null); }