Log in

View Full Version : How to get hard disk information


somaraj
Dec 1, 2004, 01:39 AM
Hi,

I want to retrieve the hard disk information such as
1) size
2) Product id
3) vendor id
4) serial number
5) firmware version
6) model number

I am able to retrieve the serial number ,firmware version and model number

But the first 3 I am not able to retrieve . I want to know whether these information are available for a harddisk , if then how to retrive using c++

If some one knows please help me

Thanks in advance
somaraj

cremedies
Dec 6, 2004, 02:07 AM
I need to know which version of Windows you are using in order to give you the location to find this information.

somaraj
Dec 6, 2004, 03:15 AM
I want my application to work on windows 2000 , given below is what I am doing .Iam not getting the vendorID .I also want whether it is slave/master.
I don't know how to retrieve this info .




int done = FALSE;
int drive = 0;

// for (drive = 0; drive < MAX_IDE_DRIVES; drive++)
// {
HANDLE hPhysicalDriveIOCTL = 0;

// Try to get a handle to PhysicalDrive IOCTL, report failure
// and exit if can't.
char driveName [256];

sprintf (driveName, "\\\\.\\PhysicalDrive%d", drive);

// Windows NT, Windows 2000, Windows XP - admin rights not required
hPhysicalDriveIOCTL = CreateFile (driveName, 0,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, 0, NULL);
// if (hPhysicalDriveIOCTL == INVALID_HANDLE_VALUE)
// printf ("Unable to open physical drive %d, error code: 0x%lX\n",
// drive, GetLastError ());

if (hPhysicalDriveIOCTL != INVALID_HANDLE_VALUE)
{
STORAGE_PROPERTY_QUERY query;
DWORD cbBytesReturned = 0;


char buffer [1000];
memset ((void *) & query, 0, sizeof (query));
query.PropertyId = StorageDeviceProperty;
query.QueryType = PropertyStandardQuery;

memset (buffer, 0, sizeof (buffer));

if ( DeviceIoControl (hPhysicalDriveIOCTL, IOCTL_STORAGE_QUERY_PROPERTY,
& query,
sizeof (query),
buffer,
sizeof (buffer),
& cbBytesReturned, NULL) )
{
STORAGE_DEVICE_DESCRIPTOR * descrip = (STORAGE_DEVICE_DESCRIPTOR *) buffer;
char serialNumber [1000];

strcpy (serialNumber,
flipAndCodeBytes ( & buffer [descrip -> SerialNumberOffset]));
if (0 == HardDriveSerialNumber [0] &&
// serial number must be alphanumeric
// (but there can be leading spaces on IBM drives)
(isalnum (serialNumber [0]) || isalnum (serialNumber [19])))
strcpy (HardDriveSerialNumber, serialNumber);





if(descrip -> VendorIdOffset)
{
strcpy(vid, &buffer [descrip -> VendorIdOffset]);
}
if(buffer [descrip -> ProductIdOffset])
{
strcpy(pid, &buffer [descrip -> ProductIdOffset]);
}


// & buffer [descrip -> ProductRevisionOffset],
//serialNumber);

}
else
{
DWORD err = GetLastError ();
char errcod[4];
sprintf(errcod,"%d",err);
char errstr[100]="DeviceIOControl IOCTL_STORAGE_QUERY_PROPERTY error code =";
strcat(errstr,errcod);
AfxMessageBox (errstr);

}

memset (buffer, 0, sizeof (buffer));


CloseHandle (hPhysicalDriveIOCTL);
}
//}