• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 799
  • Last Modified:

Physical/Logical partition info - how to get?

I have a computer with one hard disk. the disk is splited into two logical drives (C:, D:). I need to write a procedure that retrive this data (one hard disk with two logical drives).
The real task is to know how many hard disks the computer have( IDE or SCSI ) and which logical drive reside in which hard disk.
I know how to do this by reading from the registry in win95, but the NT registry is different from the win95 one, so I can't use this.
I also tried use the DeviceIOCtrl, but failed to make it work right.
There is also an int 21 service that deals with the subject but I couldn't make it work properly.
I already post this question in the delphi section but they helped none. Please answer this only if you REALLY know the answer.
0
TheSwine
Asked:
TheSwine
1 Solution
 
jhanceCommented:
Use the DevIoControl IOCTL_DISK_GET_DRIVE_LAYOUT operation.  This gets you a DRIVE_LAYOUT_INFORMATION structure which points to a series of PARTITION_INFORMATION structutes for each partition.
0
 
TheSwineAuthor Commented:
As I wrote before, I failed make this work using DeviceIOControl. I am familiar with everything you wrote, please add some full sample code, Thanks.
0
 
TheSwineAuthor Commented:
Adjusted points to 305
0
Transaction-level recovery for Oracle database

Veeam Explore for Oracle delivers low RTOs and RPOs with agentless transaction log backup and transaction-level recovery of Oracle databases. You can restore the database to a precise point in time, even to a specific transaction.

 
jeurkCommented:
Hi,
You might recognize me, cause I already tried to answer your question
in the delphi section.
You see, I am also interessed in solving that problem.
I'm writing here now to keep the question alive ;)
Would you agree to help me solve your problem ?
May you send me the code you already tryed out ?
I will only have time to answer that question next week,
cause for now I still have exams at school :(
Unfortunately I had done a part of the answer yesterday,
but since I'm very new to using NT, I made some changes that
crashed the NT partition, so I lost the code source I wrote in temp ;).
I wrote C++ in parallel with pascal, and I did not get the same
result in pascal. this might be because I had to write the
structures by myself. How do you translate following in pascal ?

partLayout test[1];

partLayout is the type. The msdn says this is a variable array.
How do you make such a thing in pascal?

I'm waiting your suggestions ?

Jeurk
0
 
interCommented:
Dear Jeurk,

The partLayout test[1]; code is a generic code that indicates the test variable may contain several partLayout structures attached end to end in the memory: The direct translation is

  test : array[0..0] of partLayout;

but I should see the actual API help fragment to correcly interpret. If need help please give the keyword for WIN32 help

Igor
0
 
jeurkCommented:
Hi Igor,
Your help is welcome, i'm at school for now.
I'll come back tomorrow and post the structures I need
to be translated.

CU, Jeurk
0
 
Tommy HuiCommented:
Here's some sample code:

void CDrvLayView::AddLine(const CString& msg)
{
      CRichEditCtrl& ctrl = GetRichEditCtrl();

      long l = ctrl.GetTextLength();
      ctrl.SetSel(l, l);
      ctrl.ReplaceSel(msg);
}

struct _PTMAP
{
      int   m_PT;
      char* m_Info;
} g_PTMap[] =
{
      { PARTITION_ENTRY_UNUSED, "Entry unused" },
      { PARTITION_FAT_12, "Specifies a partition with 12-bit FAT entries" },
      { PARTITION_XENIX_1, "Specifies a Xenix type 1 partition" },
      { PARTITION_XENIX_2, "Specifies a Xenix type 2 partition" },
      { PARTITION_FAT_16, "Specifies a partition with 16-bit FAT entries" },
      { PARTITION_EXTENDED, "Specifies an extended partition entry" },
      { PARTITION_HUGE, "Specifies an MS-DOS V4 huge partition" },
      { PARTITION_IFS, "Specifies an IFS partition" },
      { PARTITION_PREP, "Specifies a PowerPC Reference Platform partition" },
      { PARTITION_UNIX, "Specifies a UNIX partition" },
      { VALID_NTFT, "Specifies an NTFT partition" },
      { PARTITION_XINT13, "Specifies a Windows 95 partition that uses extended int13 services" },
      { PARTITION_XINT13_EXTENDED, "Same as PARTITION_EXTENDED, but uses extended int13 services" },
};

CString ConvertBool(BOOL b)
{
      return b ? "True" : "False";
}


void CDrvLayView::OnDrivesSelChange()
{
      CString driveLetter =  g_DriveTB->GetCurrentDrive();

      CString msg;
      msg.Format("Changing to %s.\r\n", driveLetter);
      AddLine(msg);

      CString drive = "\\\\.\\" + driveLetter;

      HANDLE h = CreateFile(drive, GENERIC_READ, FILE_SHARE_WRITE, NULL,
            OPEN_EXISTING, 0, NULL);

      if (h == INVALID_HANDLE_VALUE)
      {
            msg.Format("Failed to open %s. GetLastError() returned %d\r\n",
                  driveLetter, GetLastError());
            AddLine(msg);
      }
      else
      {
            PARTITION_INFORMATION pi;
            DWORD bytesReturned = 0;

            if (!DeviceIoControl(h, IOCTL_DISK_GET_PARTITION_INFO, NULL, 0,
                  &pi, sizeof(pi), &bytesReturned, NULL))
            {
                  msg.Format("Failed to obtain partition info for %s. GetLastError() returned %d\r\n",
                        driveLetter, GetLastError());
                  AddLine(msg);
            }
            else
            {
                  msg.Format("Offset at 0x%08X:0x%08X\r\n", pi.StartingOffset.HighPart,
                        pi.StartingOffset.LowPart);
                  AddLine(msg);

                  msg.Format("Length at 0x%08X:0x%08X\r\n", pi.PartitionLength.HighPart,
                        pi.PartitionLength.LowPart);
                  AddLine(msg);

                  msg.Format("Number of hidden sectors: %d\r\n", pi.HiddenSectors);
                  AddLine(msg);

                  msg.Format("Number of partitions: %d\r\n", pi.PartitionNumber);
                  AddLine(msg);

                  CString partitionType = "Unknown";

                  for (int i = 0; i < sizeof(g_PTMap) / sizeof(g_PTMap[0]); i++)
                  {
                        if (pi.PartitionType == g_PTMap[i].m_PT)
                        {
                              partitionType = g_PTMap[i].m_Info;
                              break;
                        }
                  }

                  msg.Format("Type of partitions: %s\r\n", partitionType);
                  AddLine(msg);

                  msg.Format("Bootable? %s\r\n", ConvertBool(pi.BootIndicator));
                  AddLine(msg);

                  msg.Format("Recognized? %s\r\n", ConvertBool(pi.RecognizedPartition));
                  AddLine(msg);

//                  msg.Format("Rewritable? %s\r\n", ConvertBool(pi.RewritePartition));
//                  AddLine(msg);
            }

            CloseHandle(h);
      }
}


0
 
TheSwineAuthor Commented:
Thanks tui.
It will take me about a week to check it up cause I'm very busy right now. I'll get back to you in few day's
0

Featured Post

NFR key for Veeam Backup for Microsoft Office 365

Veeam is happy to provide a free NFR license (for 1 year, up to 10 users). This license allows for the non‑production use of Veeam Backup for Microsoft Office 365 in your home lab without any feature limitations.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now