[NTDLL_WINETEST]: Sync with Wine 1.5.19.
[reactos.git] / rostests / winetests / ntdll / reg.c
index 1cad29e..076948e 100755 (executable)
@@ -124,7 +124,6 @@ static NTSTATUS (WINAPI * pRtlCheckRegistryKey)(IN ULONG,IN PWSTR);
 static NTSTATUS (WINAPI * pRtlOpenCurrentUser)(IN ACCESS_MASK, PHANDLE);
 static NTSTATUS (WINAPI * pNtOpenKey)(PHANDLE, IN ACCESS_MASK, IN POBJECT_ATTRIBUTES);
 static NTSTATUS (WINAPI * pNtClose)(IN HANDLE);
-static NTSTATUS (WINAPI * pNtDeleteValueKey)(IN HANDLE, IN PUNICODE_STRING);
 static NTSTATUS (WINAPI * pNtFlushKey)(HANDLE);
 static NTSTATUS (WINAPI * pNtDeleteKey)(HANDLE);
 static NTSTATUS (WINAPI * pNtCreateKey)( PHANDLE retkey, ACCESS_MASK access, const OBJECT_ATTRIBUTES *attr,
@@ -143,7 +142,6 @@ static NTSTATUS (WINAPI * pRtlFreeHeap)(PVOID, ULONG, PVOID);
 static LPVOID   (WINAPI * pRtlAllocateHeap)(PVOID,ULONG,ULONG);
 static NTSTATUS (WINAPI * pRtlZeroMemory)(PVOID, ULONG);
 static NTSTATUS (WINAPI * pRtlpNtQueryValueKey)(HANDLE,ULONG*,PBYTE,DWORD*,void *);
-static NTSTATUS (WINAPI * pRtlOpenCurrentUser)(ACCESS_MASK,HANDLE*);
 
 static HMODULE hntdll = 0;
 static int CurrentTest = 0;
@@ -208,7 +206,7 @@ static NTSTATUS WINAPI QueryRoutine (IN PCWSTR ValueName, IN ULONG ValueType, IN
 
         ValName = pRtlAllocateHeap(GetProcessHeap(), 0, ValueNameLength);
 
-        WideCharToMultiByte(0, 0, ValueName, ValueNameLength+1,ValName, ValueNameLength, 0, 0);
+        WideCharToMultiByte(CP_ACP, 0, ValueName, ValueNameLength+1, ValName, ValueNameLength, NULL, NULL);
 
         trace("ValueName: %s\n", ValName);
     }
@@ -396,7 +394,8 @@ static void test_NtCreateKey(void)
 
     /* Only attributes */
     status = pNtCreateKey(NULL, 0, &attr, 0, 0, 0, 0);
-    ok(status == STATUS_ACCESS_VIOLATION, "Expected STATUS_ACCESS_VIOLATION, got: 0x%08x\n", status);
+    ok(status == STATUS_ACCESS_VIOLATION || status == STATUS_ACCESS_DENIED /* Win7 */,
+       "Expected STATUS_ACCESS_VIOLATION or STATUS_ACCESS_DENIED, got: 0x%08x\n", status);
 
     /* Length > sizeof(OBJECT_ATTRIBUTES) */
     attr.Length *= 2;
@@ -637,6 +636,7 @@ static void test_NtDeleteKey(void)
 
     InitializeObjectAttributes(&attr, &winetestpath, 0, 0, 0);
     status = pNtOpenKey(&hkey, am, &attr);
+    ok(status == STATUS_SUCCESS, "NtOpenKey Failed: 0x%08x\n", status);
 
     status = pNtDeleteKey(hkey);
     ok(status == STATUS_SUCCESS, "NtDeleteKey Failed: 0x%08x\n", status);
@@ -1197,6 +1197,11 @@ static void test_redirection(void)
 
     pRtlInitUnicodeString( &str, classes64W );
     status = pNtCreateKey( &key64, KEY_WOW64_64KEY | KEY_ALL_ACCESS, &attr, 0, 0, 0, 0 );
+    if (status == STATUS_ACCESS_DENIED)
+    {
+        skip("Not authorized to modify the Classes key\n");
+        return;
+    }
     ok( status == STATUS_SUCCESS, "NtCreateKey failed: 0x%08x\n", status );
 
     pRtlInitUnicodeString( &str, classes32W );
@@ -1237,6 +1242,41 @@ static void test_redirection(void)
     pNtClose( key64 );
 }
 
+static void test_long_value_name(void)
+{
+    HANDLE key;
+    NTSTATUS status, expected;
+    OBJECT_ATTRIBUTES attr;
+    UNICODE_STRING ValName;
+    DWORD i;
+
+    InitializeObjectAttributes(&attr, &winetestpath, 0, 0, 0);
+    status = pNtOpenKey(&key, KEY_WRITE|KEY_READ, &attr);
+    ok(status == STATUS_SUCCESS, "NtOpenKey Failed: 0x%08x\n", status);
+
+    ValName.MaximumLength = 0xfffc;
+    ValName.Length = ValName.MaximumLength - sizeof(WCHAR);
+    ValName.Buffer = HeapAlloc(GetProcessHeap(), 0, ValName.MaximumLength);
+    for (i = 0; i < ValName.Length / sizeof(WCHAR); i++)
+        ValName.Buffer[i] = 'a';
+    ValName.Buffer[i] = 0;
+
+    status = pNtDeleteValueKey(key, &ValName);
+    ok(status == STATUS_OBJECT_NAME_NOT_FOUND, "NtDeleteValueKey with nonexistent long value name returned 0x%08x\n", status);
+    status = pNtSetValueKey(key, &ValName, 0, REG_DWORD, &i, sizeof(i));
+    ok(status == STATUS_INVALID_PARAMETER || broken(status == STATUS_SUCCESS) /* nt4 */,
+       "NtSetValueKey with long value name returned 0x%08x\n", status);
+    expected = (status == STATUS_SUCCESS) ? STATUS_SUCCESS : STATUS_OBJECT_NAME_NOT_FOUND;
+    status = pNtDeleteValueKey(key, &ValName);
+    ok(status == expected, "NtDeleteValueKey with long value name returned 0x%08x\n", status);
+
+    status = pNtQueryValueKey(key, &ValName, KeyValueBasicInformation, NULL, 0, &i);
+    ok(status == STATUS_OBJECT_NAME_NOT_FOUND, "NtQueryValueKey with nonexistent long value name returned 0x%08x\n", status);
+
+    pRtlFreeUnicodeString(&ValName);
+    pNtClose(key);
+}
+
 START_TEST(reg)
 {
     static const WCHAR winetest[] = {'\\','W','i','n','e','T','e','s','t',0};
@@ -1258,6 +1298,7 @@ START_TEST(reg)
     test_RtlpNtQueryValueKey();
     test_NtFlushKey();
     test_NtQueryValueKey();
+    test_long_value_name();
     test_NtDeleteKey();
     test_symlinks();
     test_redirection();