mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-14 09:30:56 +00:00
kernelbase: Restructure the create_key() loop.
This commit is contained in:
parent
6b7adb3d5d
commit
b5a0759b15
|
@ -274,30 +274,21 @@ static NTSTATUS create_key( HKEY *retkey, HKEY root, UNICODE_STRING name, ULONG
|
||||||
if (status == STATUS_OBJECT_NAME_NOT_FOUND)
|
if (status == STATUS_OBJECT_NAME_NOT_FOUND)
|
||||||
{
|
{
|
||||||
WCHAR *buffer = name.Buffer;
|
WCHAR *buffer = name.Buffer;
|
||||||
DWORD attrs, pos = 0, i = 0, len = name.Length / sizeof(WCHAR);
|
DWORD attrs, i, len = name.Length / sizeof(WCHAR);
|
||||||
|
|
||||||
/* don't try to create registry root */
|
|
||||||
if (!attr.RootDirectory && len > 10 && !wcsnicmp( buffer, L"\\Registry\\", 10 )) i += 10;
|
|
||||||
|
|
||||||
while (i < len && buffer[i] != '\\') i++;
|
|
||||||
if (i == len && !force_wow32) return status;
|
|
||||||
|
|
||||||
attrs = attr.Attributes;
|
attrs = attr.Attributes;
|
||||||
|
|
||||||
for (;;)
|
while (len)
|
||||||
{
|
{
|
||||||
name.Buffer = buffer + pos;
|
i = 0;
|
||||||
name.Length = (i - pos) * sizeof(WCHAR);
|
|
||||||
if (force_wow32 && pos)
|
/* don't try to create registry root */
|
||||||
{
|
if (!attr.RootDirectory && len > 10 && !wcsnicmp( buffer, L"\\Registry\\", 10 )) i += 10;
|
||||||
if (is_wow6432node( &name )) force_wow32 = FALSE;
|
while (i < len && buffer[i] != '\\') i++;
|
||||||
else if ((subkey = open_wow6432node( attr.RootDirectory )))
|
|
||||||
{
|
name.Buffer = buffer;
|
||||||
if (attr.RootDirectory != root) NtClose( attr.RootDirectory );
|
name.Length = i * sizeof(WCHAR);
|
||||||
attr.RootDirectory = subkey;
|
|
||||||
force_wow32 = FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (i == len)
|
if (i == len)
|
||||||
{
|
{
|
||||||
attr.Attributes = attrs;
|
attr.Attributes = attrs;
|
||||||
|
@ -311,19 +302,25 @@ static NTSTATUS create_key( HKEY *retkey, HKEY root, UNICODE_STRING name, ULONG
|
||||||
}
|
}
|
||||||
if (attr.RootDirectory != root) NtClose( attr.RootDirectory );
|
if (attr.RootDirectory != root) NtClose( attr.RootDirectory );
|
||||||
if (!NT_SUCCESS(status)) return status;
|
if (!NT_SUCCESS(status)) return status;
|
||||||
if (i == len) break;
|
|
||||||
attr.RootDirectory = subkey;
|
attr.RootDirectory = subkey;
|
||||||
while (i < len && buffer[i] == '\\') i++;
|
while (i < len && buffer[i] == '\\') i++;
|
||||||
pos = i;
|
buffer += i;
|
||||||
while (i < len && buffer[i] != '\\') i++;
|
len -= i;
|
||||||
|
|
||||||
|
if (force_wow32)
|
||||||
|
{
|
||||||
|
name.Buffer = buffer;
|
||||||
|
name.Length = len * sizeof(WCHAR);
|
||||||
|
if (is_wow6432node( &name )) force_wow32 = FALSE;
|
||||||
|
else if ((subkey = open_wow6432node( attr.RootDirectory )))
|
||||||
|
{
|
||||||
|
NtClose( attr.RootDirectory );
|
||||||
|
attr.RootDirectory = subkey;
|
||||||
|
force_wow32 = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
attr.RootDirectory = subkey;
|
|
||||||
if (force_wow32 && (subkey = open_wow6432node( attr.RootDirectory )))
|
|
||||||
{
|
|
||||||
if (attr.RootDirectory != root) NtClose( attr.RootDirectory );
|
|
||||||
attr.RootDirectory = subkey;
|
|
||||||
}
|
|
||||||
if (status == STATUS_PREDEFINED_HANDLE)
|
if (status == STATUS_PREDEFINED_HANDLE)
|
||||||
{
|
{
|
||||||
attr.RootDirectory = get_perflib_key( attr.RootDirectory );
|
attr.RootDirectory = get_perflib_key( attr.RootDirectory );
|
||||||
|
|
Loading…
Reference in a new issue