Home | Info | Community | Development | myReactOS | Contact Us
Definition at line 167 of file registry.c.
{ PLIST_ENTRY Ptr; FRLDRHKEY SearchKey = NULL; FRLDRHKEY CurrentKey; FRLDRHKEY NewKey; PWCHAR p; PCWSTR name; SIZE_T subkeyLength; SIZE_T stringLength; ULONG NameSize; int CmpResult; TRACE("KeyName '%S'\n", KeyName); if (*KeyName == L'\\') { KeyName++; CurrentKey = RootKey; } else if (ParentKey == NULL) { CurrentKey = RootKey; } else { CurrentKey = ParentKey; } /* Check whether current key is a link */ if (CurrentKey->DataType == REG_LINK) { CurrentKey = (FRLDRHKEY)CurrentKey->Data; } while (*KeyName != 0) { TRACE("KeyName '%S'\n", KeyName); if (*KeyName == L'\\') KeyName++; p = wcschr(KeyName, L'\\'); if ((p != NULL) && (p != KeyName)) { subkeyLength = p - KeyName; stringLength = subkeyLength + 1; name = KeyName; } else { subkeyLength = wcslen(KeyName); stringLength = subkeyLength; name = KeyName; } NameSize = (ULONG)((subkeyLength + 1) * sizeof(WCHAR)); Ptr = CurrentKey->SubKeyList.Flink; CmpResult = 1; while (Ptr != &CurrentKey->SubKeyList) { TRACE("Ptr 0x%x\n", Ptr); SearchKey = CONTAINING_RECORD(Ptr, KEY, KeyList); TRACE("SearchKey 0x%x\n", SearchKey); TRACE("Searching '%S'\n", SearchKey->Name); CmpResult = _wcsnicmp(SearchKey->Name, name, subkeyLength); if (CmpResult == 0 && SearchKey->NameSize == NameSize) break; else if (CmpResult == -1) break; Ptr = Ptr->Flink; } if (CmpResult != 0) { /* no key found -> create new subkey */ NewKey = MmHeapAlloc(sizeof(KEY)); if (NewKey == NULL) return ERROR_OUTOFMEMORY; InitializeListHead(&NewKey->SubKeyList); InitializeListHead(&NewKey->ValueList); NewKey->SubKeyCount = 0; NewKey->ValueCount = 0; NewKey->DataType = 0; NewKey->DataSize = 0; NewKey->Data = NULL; InsertTailList(Ptr, &NewKey->KeyList); CurrentKey->SubKeyCount++; NewKey->NameSize = NameSize; NewKey->Name = (PWCHAR)MmHeapAlloc(NewKey->NameSize); if (NewKey->Name == NULL) return ERROR_OUTOFMEMORY; memcpy(NewKey->Name, name, NewKey->NameSize - sizeof(WCHAR)); NewKey->Name[subkeyLength] = 0; TRACE("NewKey 0x%x\n", NewKey); TRACE("NewKey '%S' Length %d\n", NewKey->Name, NewKey->NameSize); CurrentKey = NewKey; } else { CurrentKey = SearchKey; /* Check whether current key is a link */ if (CurrentKey->DataType == REG_LINK) { CurrentKey = (FRLDRHKEY)CurrentKey->Data; } } KeyName = KeyName + stringLength; } if (Key != NULL) *Key = CurrentKey; return ERROR_SUCCESS; }