diff -ru M:\work\ReactOS\trunk\reactos\ntoskrnl\fstub\disksup.c M:\work\ReactOS\trunk.upd\fstub\disksup.c
--- M:\work\ReactOS\trunk\reactos\ntoskrnl\fstub\disksup.c	Fri Aug 15 10:33:21 2014
+++ M:\work\ReactOS\trunk.upd\fstub\disksup.c	Fri Aug 15 12:32:03 2014
@@ -1042,8 +1042,16 @@
     ULONGLONG EndingSector;
     PAGED_CODE();
 
+    DPRINT1("FSTUB: entry \n");
+    DPRINT1("type %#x\n", Entry->PartitionType);
+    DPRINT1("offset %#08lx\n", GET_STARTING_SECTOR(Entry));
+    DPRINT1("length %#08lx\n", GET_PARTITION_LENGTH(Entry));
+
     /* Unused partitions are considered valid */
-    if (Entry->PartitionType == PARTITION_ENTRY_UNUSED) return TRUE;
+    if (Entry->PartitionType == PARTITION_ENTRY_UNUSED) {
+        DPRINT1("FSTUB: unused entry \n");
+        return TRUE;
+    }
 
     /* Get the last sector of the partition */
     EndingSector = GET_STARTING_SECTOR(Entry) +  GET_PARTITION_LENGTH(Entry);
@@ -1052,9 +1060,11 @@
     if (EndingSector > MaxSector)
     {
         /* Invalid partition */
-        DPRINT1("FSTUB: entry is invalid\n");
+        DPRINT1("FSTUB: entry is invalid [1]\n");
+        /*
         DPRINT1("FSTUB: offset %#08lx\n", GET_STARTING_SECTOR(Entry));
         DPRINT1("FSTUB: length %#08lx\n", GET_PARTITION_LENGTH(Entry));
+        */
         DPRINT1("FSTUB: end %#I64x\n", EndingSector);
         DPRINT1("FSTUB: max %#I64x\n", MaxSector);
         return FALSE;
@@ -1062,9 +1072,11 @@
     else if(GET_STARTING_SECTOR(Entry) > MaxOffset)
     {
         /* Invalid partition */
-        DPRINT1("FSTUB: entry is invalid\n");
+        DPRINT1("FSTUB: entry is invalid [2]\n");
+        /*
         DPRINT1("FSTUB: offset %#08lx\n", GET_STARTING_SECTOR(Entry));
         DPRINT1("FSTUB: length %#08lx\n", GET_PARTITION_LENGTH(Entry));
+        */
         DPRINT1("FSTUB: end %#I64x\n", EndingSector);
         DPRINT1("FSTUB: maxOffset %#I64x\n", MaxOffset);
         return FALSE;
@@ -1377,7 +1389,7 @@
     PUCHAR Buffer = NULL;
     ULONG BufferSize = 2048, InputSize;
     PDRIVE_LAYOUT_INFORMATION DriveLayoutInfo = NULL;
-    LONG j = -1, i = -1, k;
+    LONG j = -1, i = -1;
     DISK_GEOMETRY DiskGeometry;
     LONGLONG EndSector, MaxSector, StartOffset;
     ULONGLONG MaxOffset;
@@ -1476,7 +1488,10 @@
 
         /* Normalize status code and check for failure */
         if (Status == STATUS_NO_DATA_DETECTED) Status = STATUS_SUCCESS;
-        if (!NT_SUCCESS(Status)) break;
+        if (!NT_SUCCESS(Status)) {
+            DPRINT1("Can't read Part desc, status %#x\n", Status);
+            break;
+        }
 
         /* If we biased for EZ-Drive, unbias now */
         if (IsEzDrive && (Offset.QuadPart == 512)) Offset.QuadPart = 0;
@@ -1507,25 +1522,26 @@
 
         /* Start looping partitions */
         j++;
-        DPRINT("FSTUB: Partition Table %d:\n", j);
-        for (Entry = 1, k = 0; Entry <= 4; Entry++, PartitionDescriptor++)
+        DPRINT1("FSTUB: Partition Table %d:\n", j);
+        for (Entry = 1; Entry <= 4; Entry++, PartitionDescriptor++)
         {
             /* Get the partition type */
             PartitionType = PartitionDescriptor->PartitionType;
 
             /* Print debug messages */
-            DPRINT("Partition Entry %d,%d: type %#x %s\n",
+            DPRINT1("Partition Entry %d,%d: type %#x %s\n",
                     j,
                     Entry,
                     PartitionType,
                     (PartitionDescriptor->ActiveFlag) ? "Active" : "");
-            DPRINT("\tOffset %#08lx for %#08lx Sectors\n",
+            DPRINT1("\tOffset %#08lx for %#08lx Sectors\n",
                     GET_STARTING_SECTOR(PartitionDescriptor),
                     GET_PARTITION_LENGTH(PartitionDescriptor));
 
             /* Check whether we're facing a protective MBR */
             if (PartitionType == EFI_PMBR_OSTYPE_EFI)
             {
+                DPRINT1("FSTUB: EFI_PMBR_OSTYPE_EFI\n");
                 /* Partition length might be bigger than disk size */
                 FstubFixupEfiPartition(PartitionDescriptor,
                                        MaxOffset);
@@ -1536,21 +1552,19 @@
                                             MaxOffset,
                                             MaxSector)) && !(j))
             {
-                /* It's invalid, so fail */
-                IsValid = FALSE;
-                break;
-            }
-
-            /* Check if it's a container */
-            if (IsContainerPartition(PartitionType))
-            {
-                /* Increase the count of containers */
-                if (++k != 1)
-                {
-                    /* More then one table is invalid */
-                    DPRINT1("FSTUB: Multiple container partitions found in "
-                            "partition table %d\n - table is invalid\n",
-                            j);
+                /* It's invalid */
+                if (PartitionType == PARTITION_ENTRY_UNUSED) {
+                    DPRINT1("Skip invalid Part Entry %d,%d\n", j, Entry);
+                    continue;
+                }
+                if (IsContainerPartition(PartitionType)) {
+                    /* Some disk utilities generate wrong partition size for 
+                       Extended Partition, while set correct values inside.
+                       Keep it.
+                     */
+                    DPRINT1("Keep invalid ExtPart Entry %d,%d\n", j, Entry);
+                } else {
+                    DPRINT1("Invalid Part Entry %d,%d\n", j, Entry);
                     IsValid = FALSE;
                     break;
                 }
@@ -1591,6 +1605,7 @@
                                                         TAG_FILE_SYSTEM);
                 if (!DriveLayoutInfo)
                 {
+                    DPRINT1("FSTUB: Out of memory, buff size %#x\n", BufferSize);
                     /* Out of memory, unto this extra structure */
                     --i;
                     Status = STATUS_INSUFFICIENT_RESOURCES;

diff -ru M:\work\ReactOS\trunk\reactos\ntoskrnl\io\iomgr\arcname.c M:\work\ReactOS\trunk.upd\io\iomgr\arcname.c
--- M:\work\ReactOS\trunk\reactos\ntoskrnl\io\iomgr\arcname.c	Tue Mar 11 16:58:38 2014
+++ M:\work\ReactOS\trunk.upd\io\iomgr\arcname.c	Fri Aug 15 12:08:45 2014
@@ -43,6 +43,7 @@
 {
     SIZE_T Length;
     NTSTATUS Status;
+    NTSTATUS StatusCD;
     CHAR Buffer[128];
     BOOLEAN SingleDisk;
     BOOLEAN FoundBoot = FALSE;
@@ -138,9 +139,12 @@
     /* Loop every disk and try to find boot disk */
     Status = IopCreateArcNamesDisk(LoaderBlock, SingleDisk, &FoundBoot);
     /* If it succeed but we didn't find boot device, try to browse Cds */
-    if (NT_SUCCESS(Status) && !FoundBoot)
+    if(!FoundBoot)
     {
-        Status = IopCreateArcNamesCd(LoaderBlock);
+        StatusCD = IopCreateArcNamesCd(LoaderBlock);
+        if(NT_SUCCESS(StatusCD)) {
+            Status = StatusCD;
+        }
     }
 
     /* Return success */
@@ -383,7 +387,7 @@
                 /* Create symbolic link */
                 IoAssignArcName(&ArcNameStringW, &DeviceStringW);
                 RtlFreeUnicodeString(&ArcNameStringW);
-                DPRINT1("Boot device found\n");
+                DPRINT1("Boot CD device found\n");
             }
 
             /* And quit, whatever happens */
@@ -396,6 +400,7 @@
     }
 
 Cleanup:
+    DPRINT1("IopCreateArcNamesCd: status %#x\n", Status);
     if (PartitionBuffer)
     {
         ExFreePoolWithTag(PartitionBuffer, TAG_IO);
@@ -482,6 +487,7 @@
     for (DiskNumber = 0; DiskNumber < DiskCount; DiskNumber++)
     {
         /* Check if we have an enabled disk */
+        DPRINT1("Try DISK %d\n", DiskNumber);
         if (lSymbolicLinkList && *lSymbolicLinkList != UNICODE_NULL)
         {
             /* Create its device name using first symbolic link */
@@ -526,9 +532,12 @@
                 /* If we didn't get the appriopriate data, just skip that disk */
                 if (!NT_SUCCESS(Status))
                 {
-                   ObDereferenceObject(FileObject);
-                   continue;
+                    DPRINT1("Can't get device number, status %#x\n", Status);
+                    ObDereferenceObject(FileObject);
+                    continue;
                 }
+            } else {
+                DPRINT1("Can't get DO, status %#x\n", Status);
             }
 
             /* End of enabled disks enumeration */
@@ -558,6 +567,7 @@
             Status = RtlAnsiStringToUnicodeString(&DeviceStringW, &DeviceStringA, TRUE);
             if (!NT_SUCCESS(Status))
             {
+                DPRINT1("Can't create disk path, status %#x\n", Status);
                 goto Cleanup;
             }
 
@@ -575,6 +585,7 @@
         /* Something failed somewhere earlier, just skip the disk */
         if (!NT_SUCCESS(Status))
         {
+            DPRINT1("DIsk access error, status %#x\n", Status);
             continue;
         }
 
@@ -734,11 +745,14 @@
                 for (i = 1; i <= DriveLayout->PartitionCount; i++)
                 {
                     /* Create device name */
+                    DPRINT1("Try create \\Device\\Harddisk%lu\\Partition%lu, status %#x\n",
+                        (DeviceNumber.DeviceNumber != ULONG_MAX) ? DeviceNumber.DeviceNumber : DiskNumber, i);
                     sprintf(Buffer, "\\Device\\Harddisk%lu\\Partition%lu", (DeviceNumber.DeviceNumber != ULONG_MAX) ? DeviceNumber.DeviceNumber : DiskNumber, i);
                     RtlInitAnsiString(&DeviceStringA, Buffer);
                     Status = RtlAnsiStringToUnicodeString(&DeviceStringW, &DeviceStringA, TRUE);
                     if (!NT_SUCCESS(Status))
                     {
+                        DPRINT1("Can't create, status %#x\n", Status);
                         goto Cleanup;
                     }
 
@@ -749,7 +763,7 @@
                     /* Is that boot device? */
                     if (RtlEqualString(&ArcNameStringA, &ArcBootString, TRUE))
                     {
-                        DPRINT("Found boot device\n");
+                        DPRINT1("Found HDD boot device\n");
                         *FoundBoot = TRUE;
                     }
 
@@ -761,6 +775,7 @@
                         Status = RtlAnsiStringToUnicodeString(&HalPathStringW, &HalPathStringA, TRUE);
                         if (!NT_SUCCESS(Status))
                         {
+                            DPRINT1("Can't create HAT path, status %#x\n", Status);
                             RtlFreeUnicodeString(&DeviceStringW);
                             goto Cleanup;
                         }
@@ -776,6 +791,7 @@
                     Status = RtlAnsiStringToUnicodeString(&ArcNameStringW, &ArcNameStringA, TRUE);
                     if (!NT_SUCCESS(Status))
                     {
+                        DPRINT1("Can't create Arc path, status %#x\n", Status);
                         RtlFreeUnicodeString(&DeviceStringW);
                         goto Cleanup;
                     }
@@ -813,6 +829,7 @@
     Status = STATUS_SUCCESS;
 
 Cleanup:
+    DPRINT1("IopCreateArcNamesDisk: status %#x\n", Status);
     if (SymbolicLinkList)
     {
         ExFreePool(SymbolicLinkList);
