<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">
<HTML>
<HEAD>
  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=UTF-8">
  <META NAME="GENERATOR" CONTENT="GtkHTML/3.10.1">
</HEAD>
<BODY>
<PRE>
Hi,
<!--+GtkHTML:<DATA class="ClueFlow" key="orig" value="0">-->
</PRE>
<TT>New tests pass on NT4/W2K/XP/W2K3 and Wine.</TT><BR>
<BR>
<!--+GtkHTML:<DATA class="ClueFlow" clear="orig">--><TT>Some original tests still fail for NT4, haven't looked into that (yet).</TT><BR>
<BR>
<TT>Changelog</TT><BR>
<!--+GtkHTML:<DATA class="ClueFlow" key="orig" value="0">-->&nbsp; Fix returncodes for NtOpenKey (with tests) 
<PRE>

Cheers,

Paul.
---
 dlls/ntdll/reg.c       |   11 +++++++----
<!--+GtkHTML:<DATA class="ClueFlow" clear="orig">--> dlls/ntdll/tests/reg.c |   29 +++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+), 4 deletions(-)

diff --git a/dlls/ntdll/reg.c b/dlls/ntdll/reg.c
index c88bc1f..fb67207 100644
--- a/dlls/ntdll/reg.c
+++ b/dlls/ntdll/reg.c
@@ -116,13 +116,16 @@ NTSTATUS WINAPI RtlpNtCreateKey( PHANDLE
 NTSTATUS WINAPI NtOpenKey( PHANDLE retkey, ACCESS_MASK access, const OBJECT_ATTRIBUTES *attr )
 {
     NTSTATUS ret;
-    DWORD len = attr-&gt;ObjectName-&gt;Length;
+    DWORD len;
 
-    TRACE( &quot;(%p,%s,%lx,%p)\n&quot;, attr-&gt;RootDirectory,
-           debugstr_us(attr-&gt;ObjectName), access, retkey );
+    TRACE( &quot;(%p,%s,%lx,%p)\n&quot;, (attr) ? attr-&gt;RootDirectory : NULL,
+           (attr) ? debugstr_us(attr-&gt;ObjectName) : NULL, access, retkey );
 
+    if (!retkey || !attr) return STATUS_ACCESS_VIOLATION;
+    if (attr-&gt;Length &gt; sizeof(OBJECT_ATTRIBUTES)) return STATUS_INVALID_PARAMETER;
+
+    len = attr-&gt;ObjectName-&gt;Length;
     if (len &gt; MAX_NAME_LENGTH) return STATUS_BUFFER_OVERFLOW;
-    if (!retkey) return STATUS_INVALID_PARAMETER;
 
     SERVER_START_REQ( open_key )
     {
diff --git a/dlls/ntdll/tests/reg.c b/dlls/ntdll/tests/reg.c
index 654ae64..6f04b23 100644
--- a/dlls/ntdll/tests/reg.c
+++ b/dlls/ntdll/tests/reg.c
@@ -290,6 +290,34 @@ static void test_RtlQueryRegistryValues(
     pRtlFreeHeap(GetProcessHeap(), 0, QueryTable);
 }
 
+static void test_NtOpenKey(void)
+{
+    HANDLE key;
+    NTSTATUS status;
+    OBJECT_ATTRIBUTES attr;
+    ACCESS_MASK am = KEY_READ;
+
+    /* All NULL */
+    status = pNtOpenKey(NULL, 0, NULL);
+    ok(status == STATUS_ACCESS_VIOLATION, &quot;Expected STATUS_ACCESS_VIOLATION, got: 0x%08lx\n&quot;, status);
+
+    /* NULL attributes */
+    status = pNtOpenKey(&amp;key, 0, NULL);
+    ok(status == STATUS_ACCESS_VIOLATION /* W2K3/XP/W2K */ || status == STATUS_INVALID_PARAMETER /* NT4 */,
+        &quot;Expected STATUS_ACCESS_VIOLATION or STATUS_INVALID_PARAMETER(NT4), got: 0x%08lx\n&quot;, status);
+
+    InitializeObjectAttributes(&amp;attr, &amp;winetestpath, 0, 0, 0);
+
+    /* NULL key */
+    status = pNtOpenKey(NULL, 0, &amp;attr);
+    ok(status == STATUS_ACCESS_VIOLATION, &quot;Expected STATUS_ACCESS_VIOLATION, got: 0x%08lx\n&quot;, status);
+
+    /* Length &gt; sizeof(OBJECT_ATTRIBUTES) */
+    attr.Length *= 2;
+    status = pNtOpenKey(&amp;key, am, &amp;attr);
+    ok(status == STATUS_INVALID_PARAMETER, &quot;Expected STATUS_INVALID_PARAMETER, got: 0x%08lx\n&quot;, status);
+}
+
 static void test_NtCreateKey(void)
 {
     /*Create WineTest*/
@@ -401,6 +429,7 @@ START_TEST(reg)
 
     pRtlAppendUnicodeToString(&amp;winetestpath, winetest);
 
+    test_NtOpenKey();
     test_NtCreateKey();
     test_NtSetValueKey();
     test_RtlCheckRegistryKey();
-- 
1.4.1
</PRE>
</BODY>
</HTML>