<!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">--> 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->ObjectName->Length;
+ DWORD len;
- TRACE( "(%p,%s,%lx,%p)\n", attr->RootDirectory,
- debugstr_us(attr->ObjectName), access, retkey );
+ TRACE( "(%p,%s,%lx,%p)\n", (attr) ? attr->RootDirectory : NULL,
+ (attr) ? debugstr_us(attr->ObjectName) : NULL, access, retkey );
+ if (!retkey || !attr) return STATUS_ACCESS_VIOLATION;
+ if (attr->Length > sizeof(OBJECT_ATTRIBUTES)) return STATUS_INVALID_PARAMETER;
+
+ len = attr->ObjectName->Length;
if (len > 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, "Expected STATUS_ACCESS_VIOLATION, got: 0x%08lx\n", status);
+
+ /* NULL attributes */
+ status = pNtOpenKey(&key, 0, NULL);
+ ok(status == STATUS_ACCESS_VIOLATION /* W2K3/XP/W2K */ || status == STATUS_INVALID_PARAMETER /* NT4 */,
+ "Expected STATUS_ACCESS_VIOLATION or STATUS_INVALID_PARAMETER(NT4), got: 0x%08lx\n", status);
+
+ InitializeObjectAttributes(&attr, &winetestpath, 0, 0, 0);
+
+ /* NULL key */
+ status = pNtOpenKey(NULL, 0, &attr);
+ ok(status == STATUS_ACCESS_VIOLATION, "Expected STATUS_ACCESS_VIOLATION, got: 0x%08lx\n", status);
+
+ /* Length > sizeof(OBJECT_ATTRIBUTES) */
+ attr.Length *= 2;
+ status = pNtOpenKey(&key, am, &attr);
+ ok(status == STATUS_INVALID_PARAMETER, "Expected STATUS_INVALID_PARAMETER, got: 0x%08lx\n", status);
+}
+
static void test_NtCreateKey(void)
{
/*Create WineTest*/
@@ -401,6 +429,7 @@ START_TEST(reg)
pRtlAppendUnicodeToString(&winetestpath, winetest);
+ test_NtOpenKey();
test_NtCreateKey();
test_NtSetValueKey();
test_RtlCheckRegistryKey();
--
1.4.1
</PRE>
</BODY>
</HTML>