Author: pschweitzer
Date: Mon May 16 17:52:03 2011
New Revision: 51796

URL: http://svn.reactos.org/svn/reactos?rev=51796&view=rev
Log:
[NTOSKRNL]
- Implemented IoSetSystemPartition(). This is required by MountMgr.
- Fixed buffer size in IopStoreSystemPartitionInformation(). No need to have a 
buffer twice bigger than maximum use.

Modified:
    trunk/reactos/ntoskrnl/io/iomgr/iorsrce.c
    trunk/reactos/ntoskrnl/io/iomgr/volume.c

Modified: trunk/reactos/ntoskrnl/io/iomgr/iorsrce.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/iorsrce.c?rev=51796&r1=51795&r2=51796&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/io/iomgr/iorsrce.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/io/iomgr/iorsrce.c [iso-8859-1] Mon May 16 17:52:03 
2011
@@ -701,7 +701,7 @@
     UNICODE_STRING LinkTarget, KeyName;
     OBJECT_ATTRIBUTES ObjectAttributes;
     HANDLE LinkHandle, RegistryHandle, KeyHandle;
-    WCHAR LinkTargetBuffer[256], KeyNameBuffer[sizeof("SystemPartition")];
+    WCHAR LinkTargetBuffer[256], KeyNameBuffer[sizeof("SystemPartition") / 
sizeof(WCHAR)];
     UNICODE_STRING CmRegistryMachineSystemName = 
RTL_CONSTANT_STRING(L"\\Registry\\Machine\\SYSTEM");
 
     ASSERT(NtSystemPartitionDeviceName->MaximumLength >= 
NtSystemPartitionDeviceName->Length + sizeof(WCHAR));

Modified: trunk/reactos/ntoskrnl/io/iomgr/volume.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/volume.c?rev=51796&r1=51795&r2=51796&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/io/iomgr/volume.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/io/iomgr/volume.c [iso-8859-1] Mon May 16 17:52:03 
2011
@@ -937,14 +937,56 @@
 }
 
 /*
- * @unimplemented
+ * @implemented
  */
 NTSTATUS
 NTAPI
 IoSetSystemPartition(IN PUNICODE_STRING VolumeNameString)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
+    NTSTATUS Status;
+    HANDLE RootHandle, KeyHandle;
+    UNICODE_STRING HKLMSystem, KeyString;
+    WCHAR Buffer[sizeof(L"SystemPartition") / sizeof(WCHAR)];
+
+    RtlInitUnicodeString(&HKLMSystem, L"\\REGISTRY\\MACHINE\\SYSTEM");
+
+    /* Open registry to save data (HKLM\SYSTEM) */
+    Status = IopOpenRegistryKeyEx(&RootHandle, 0, &HKLMSystem, KEY_ALL_ACCESS);
+    if (!NT_SUCCESS(Status))
+    {
+        return Status;
+    }
+
+    /* Create or open Setup subkey */
+    KeyString.Buffer = Buffer;
+    KeyString.Length = sizeof(L"Setup") - sizeof(UNICODE_NULL);
+    KeyString.MaximumLength = sizeof(L"Setup");
+    RtlCopyMemory(Buffer, L"Setup", sizeof(L"Setup"));
+    Status = IopCreateRegistryKeyEx(&KeyHandle,
+                                    RootHandle,
+                                    &KeyString,
+                                    KEY_ALL_ACCESS,
+                                    REG_OPTION_NON_VOLATILE,
+                                    NULL);
+    ZwClose(RootHandle);
+    if (!NT_SUCCESS(Status))
+    {
+        return Status;
+    }
+
+    /* Store caller value */
+    KeyString.Length = sizeof(L"SystemPartition") - sizeof(UNICODE_NULL);
+    KeyString.MaximumLength = sizeof(L"SystemPartition");
+    RtlCopyMemory(Buffer, L"SystemPartition", sizeof(L"SystemPartition"));
+    Status = ZwSetValueKey(KeyHandle,
+                           &KeyString,
+                           0,
+                           REG_SZ,
+                           VolumeNameString->Buffer,
+                           VolumeNameString->Length + sizeof(UNICODE_NULL));
+    ZwClose(KeyHandle);
+
+    return Status;
 }
 
 /*


Reply via email to