Commit 35b56daf authored by Sven Baars's avatar Sven Baars Committed by Alexandre Julliard

kernelbase: Call open_key() from open_subkey().

parent 8b327eee
...@@ -140,20 +140,15 @@ static HKEY get_perflib_key( HANDLE key ) ...@@ -140,20 +140,15 @@ static HKEY get_perflib_key( HANDLE key )
return key; return key;
} }
static NTSTATUS open_key( HKEY *retkey, HKEY root, UNICODE_STRING name, DWORD options, ACCESS_MASK access );
static NTSTATUS open_subkey( HKEY *subkey, HKEY root, UNICODE_STRING *name, DWORD options, ACCESS_MASK access ) static NTSTATUS open_subkey( HKEY *subkey, HKEY root, UNICODE_STRING *name, DWORD options, ACCESS_MASK access )
{ {
ACCESS_MASK access_64 = access & ~KEY_WOW64_32KEY;
DWORD i = 0, len = name->Length / sizeof(WCHAR); DWORD i = 0, len = name->Length / sizeof(WCHAR);
WCHAR *buffer = name->Buffer; WCHAR *buffer = name->Buffer;
OBJECT_ATTRIBUTES attr;
UNICODE_STRING str; UNICODE_STRING str;
NTSTATUS status = 0; NTSTATUS status;
attr.Length = sizeof(attr);
attr.RootDirectory = root;
attr.ObjectName = &str;
attr.Attributes = 0;
attr.SecurityDescriptor = NULL;
attr.SecurityQualityOfService = NULL;
if (len > 0 && buffer[0] == '\\') return STATUS_OBJECT_PATH_INVALID; if (len > 0 && buffer[0] == '\\') return STATUS_OBJECT_PATH_INVALID;
while (i < len && buffer[i] != '\\') i++; while (i < len && buffer[i] != '\\') i++;
...@@ -161,23 +156,10 @@ static NTSTATUS open_subkey( HKEY *subkey, HKEY root, UNICODE_STRING *name, DWOR ...@@ -161,23 +156,10 @@ static NTSTATUS open_subkey( HKEY *subkey, HKEY root, UNICODE_STRING *name, DWOR
str.Buffer = name->Buffer; str.Buffer = name->Buffer;
str.Length = i * sizeof(WCHAR); str.Length = i * sizeof(WCHAR);
if (i == len) if (i < len)
{
if (options & REG_OPTION_OPEN_LINK) attr.Attributes |= OBJ_OPENLINK;
}
else
{
if (!(options & REG_OPTION_OPEN_LINK)) attr.Attributes &= ~OBJ_OPENLINK;
options &= ~REG_OPTION_OPEN_LINK; options &= ~REG_OPTION_OPEN_LINK;
}
status = NtOpenKeyEx( (HANDLE *)subkey, access, &attr, options );
if (status == STATUS_PREDEFINED_HANDLE)
{
*subkey = get_perflib_key( *subkey );
status = STATUS_SUCCESS;
}
status = open_key( subkey, root, str, options, access_64 );
if (!status) if (!status)
{ {
while (i < len && buffer[i] == '\\') i++; while (i < len && buffer[i] == '\\') i++;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment