[ros-diffs] [cgutman] 53301: [NTOSKRNL] - Return an informational success status if the device interface already exists

cgutman at svn.reactos.org cgutman at svn.reactos.org
Thu Aug 18 17:32:26 UTC 2011


Author: cgutman
Date: Thu Aug 18 17:32:26 2011
New Revision: 53301

URL: http://svn.reactos.org/svn/reactos?rev=53301&view=rev
Log:
[NTOSKRNL]
- Return an informational success status if the device interface already exists

Modified:
    trunk/reactos/ntoskrnl/io/iomgr/deviface.c

Modified: trunk/reactos/ntoskrnl/io/iomgr/deviface.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/deviface.c?rev=53301&r1=53300&r2=53301&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/io/iomgr/deviface.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/io/iomgr/deviface.c [iso-8859-1] Thu Aug 18 17:32:26 2011
@@ -1136,12 +1136,42 @@
     }
     RtlAppendUnicodeToString(SymbolicLinkName, L"#");
     RtlAppendUnicodeStringToString(SymbolicLinkName, &GuidString);
+
+    if (ReferenceString && ReferenceString->Length)
+    {
+        RtlAppendUnicodeToString(SymbolicLinkName, L"\\");
+        RtlAppendUnicodeStringToString(SymbolicLinkName, ReferenceString);
+    }
     SymbolicLinkName->Buffer[SymbolicLinkName->Length/sizeof(WCHAR)] = L'\0';
+
+    /* Write symbolic link name in registry */
+    SymbolicLinkName->Buffer[1] = '\\';
+    Status = ZwSetValueKey(SubKey,
+                           &SymbolicLink,
+                           0, /* TileIndex */
+                           REG_SZ,
+                           SymbolicLinkName->Buffer,
+                           SymbolicLinkName->Length);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("ZwSetValueKey() failed with status 0x%08lx\n", Status);
+        ExFreePool(SymbolicLinkName->Buffer);
+    }
+    else
+    {
+        SymbolicLinkName->Buffer[1] = '?';
+    }
 
     /* Create symbolic link */
     DPRINT("IoRegisterDeviceInterface(): creating symbolic link %wZ -> %wZ\n", SymbolicLinkName, &PdoNameInfo->Name);
     Status = IoCreateSymbolicLink(SymbolicLinkName, &PdoNameInfo->Name);
-    if (!NT_SUCCESS(Status) && ReferenceString == NULL)
+
+    /* If the symbolic link already exists, return an informational success status */
+    if (Status == STATUS_OBJECT_NAME_COLLISION)
+        Status = STATUS_OBJECT_NAME_EXISTS;
+
+    /* Check if it really failed */
+    if (!NT_SUCCESS(Status))
     {
         DPRINT1("IoCreateSymbolicLink() failed with status 0x%08lx\n", Status);
         ZwClose(SubKey);
@@ -1152,32 +1182,6 @@
         ExFreePool(BaseKeyName.Buffer);
         ExFreePool(SymbolicLinkName->Buffer);
         return Status;
-    }
-
-    if (ReferenceString && ReferenceString->Length)
-    {
-        RtlAppendUnicodeToString(SymbolicLinkName, L"\\");
-        RtlAppendUnicodeStringToString(SymbolicLinkName, ReferenceString);
-    }
-    SymbolicLinkName->Buffer[SymbolicLinkName->Length/sizeof(WCHAR)] = L'\0';
-
-    /* Write symbolic link name in registry */
-    SymbolicLinkName->Buffer[1] = '\\';
-    Status = ZwSetValueKey(
-        SubKey,
-        &SymbolicLink,
-        0, /* TileIndex */
-        REG_SZ,
-        SymbolicLinkName->Buffer,
-        SymbolicLinkName->Length);
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT1("ZwSetValueKey() failed with status 0x%08lx\n", Status);
-        ExFreePool(SymbolicLinkName->Buffer);
-    }
-    else
-    {
-        SymbolicLinkName->Buffer[1] = '?';
     }
 
     ZwClose(SubKey);




More information about the Ros-diffs mailing list