Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Sign In with Facebook Sign In with Google Sign In with OpenID

Categories

We have migrated to a new platform! Please note that you will need to reset your password to log in (your credentials are still in-tact though). Please contact lee@programmersheaven.com if you have questions.
Welcome to the new platform of Programmer's Heaven! We apologize for the inconvenience caused, if you visited us from a broken link of the previous version. The main reason to move to a new platform is to provide more effective and collaborative experience to you all. Please feel free to experience the new platform and use its exciting features. Contact us for any issue that you need to get clarified. We are more than happy to help you.

How to get the HardDisk ID...?

zovestazovesta Posts: 10Member
Hi...

i would like to know how can i build an application using VC++ 6 MFC to get the HardDisk ID of any computer that to run the app. on it?

Thanx
Zovesta

Comments

  • stoberstober Posts: 9,765Member ✭✭✭
    : Hi...
    :
    : i would like to know how can i build an application using VC++ 6 MFC to get the HardDisk ID of any computer that to run the app. on it?
    :
    : Thanx
    : Zovesta
    :
    :
    [blue]If this is not exactly what you want, it should give you some hints[/blue]
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/enumerating_volume_mount_points.asp
  • suhredayansuhredayan Posts: 69Member
    Check these functions and to get hints

    to get hard disk id we have to use different ways depending on operating system and also hard disk type. like (nt/98 or SCSI drive etc)

    int ReadPhysicalDriveInNT (void)
    {
    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, must have admin rights
    hPhysicalDriveIOCTL = CreateFile (driveName,
    GENERIC_READ | GENERIC_WRITE,
    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
    ",
    // drive, GetLastError ());

    if (hPhysicalDriveIOCTL != INVALID_HANDLE_VALUE)
    {
    GETVERSIONOUTPARAMS VersionParams;
    DWORD cbBytesReturned = 0;

    // Get the version, etc of PhysicalDrive IOCTL
    memset ((void*) &VersionParams, 0, sizeof(VersionParams));

    if ( ! DeviceIoControl (hPhysicalDriveIOCTL, DFP_GET_VERSION,
    NULL,
    0,
    &VersionParams,
    sizeof(VersionParams),
    &cbBytesReturned, NULL) )
    {
    // printf ("DFP_GET_VERSION failed for drive %d
    ", i);
    // continue;
    }

    // If there is a IDE device at number "i" issue commands
    // to the device
    if (VersionParams.bIDEDeviceMap > 0)
    {
    BYTE bIDCmd = 0; // IDE or ATAPI IDENTIFY cmd
    SENDCMDINPARAMS scip;
    //SENDCMDOUTPARAMS OutCmd;

    // Now, get the ID sector for all IDE devices in the system.
    // If the device is ATAPI use the IDE_ATAPI_IDENTIFY command,
    // otherwise use the IDE_ATA_IDENTIFY command
    bIDCmd = (VersionParams.bIDEDeviceMap >> drive & 0x10) ?
    IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;

    memset (&scip, 0, sizeof(scip));
    memset (IdOutCmd, 0, sizeof(IdOutCmd));

    if ( DoIDENTIFY (hPhysicalDriveIOCTL,
    &scip,
    (PSENDCMDOUTPARAMS)&IdOutCmd,
    (BYTE) bIDCmd,
    (BYTE) drive,
    &cbBytesReturned))
    {
    DWORD diskdata [256];
    int ijk = 0;
    USHORT *pIdSector = (USHORT *)
    ((PSENDCMDOUTPARAMS) IdOutCmd) -> bBuffer;

    for (ijk = 0; ijk < 256; ijk++)
    diskdata [ijk] = pIdSector [ijk];

    PrintIdeInfo (drive, diskdata);

    done = TRUE;
    }
    }

    CloseHandle (hPhysicalDriveIOCTL);
    }
    }

    return done;
    }
    int ReadIdeDriveAsScsiDriveInNT (void)
    {
    int done = FALSE;
    int controller = 0;

    for (controller = 0; controller < 2; controller++)
    {
    HANDLE hScsiDriveIOCTL = 0;
    char driveName [256];

    // Try to get a handle to PhysicalDrive IOCTL, report failure
    // and exit if can't.
    sprintf (driveName, "\\.\Scsi%d:", controller);

    // Windows NT, Windows 2000, any rights should do
    hScsiDriveIOCTL = CreateFile (driveName,
    GENERIC_READ | GENERIC_WRITE,
    FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
    OPEN_EXISTING, 0, NULL);
    // if (hScsiDriveIOCTL == INVALID_HANDLE_VALUE)
    // printf ("Unable to open SCSI controller %d, error code: 0x%lX
    ",
    // controller, GetLastError ());

    if (hScsiDriveIOCTL != INVALID_HANDLE_VALUE)
    {
    int drive = 0;

    for (drive = 0; drive < 2; drive++)
    {
    char buffer [sizeof (SRB_IO_CONTROL) + SENDIDLENGTH];
    SRB_IO_CONTROL *p = (SRB_IO_CONTROL *) buffer;
    SENDCMDINPARAMS *pin =
    (SENDCMDINPARAMS *) (buffer + sizeof (SRB_IO_CONTROL));
    DWORD dummy;

    memset (buffer, 0, sizeof (buffer));
    p -> HeaderLength = sizeof (SRB_IO_CONTROL);
    p -> Timeout = 10000;
    p -> Length = SENDIDLENGTH;
    p -> ControlCode = IOCTL_SCSI_MINIPORT_IDENTIFY;
    strncpy ((char *) p -> Signature, "SCSIDISK", 8);

    pin -> irDriveRegs.bCommandReg = IDE_ATA_IDENTIFY;
    pin -> bDriveNumber = drive;

    if (DeviceIoControl (hScsiDriveIOCTL, IOCTL_SCSI_MINIPORT,
    buffer,
    sizeof (SRB_IO_CONTROL) +
    sizeof (SENDCMDINPARAMS) - 1,
    buffer,
    sizeof (SRB_IO_CONTROL) + SENDIDLENGTH,
    &dummy, NULL))
    {
    SENDCMDOUTPARAMS *pOut =
    (SENDCMDOUTPARAMS *) (buffer + sizeof (SRB_IO_CONTROL));
    IDSECTOR *pId = (IDSECTOR *) (pOut -> bBuffer);
    if (pId -> sModelNumber [0])
    {
    DWORD diskdata [256];
    int ijk = 0;
    USHORT *pIdSector = (USHORT *) pId;

    for (ijk = 0; ijk < 256; ijk++)
    diskdata [ijk] = pIdSector [ijk];

    PrintIdeInfo (controller * 2 + drive, diskdata);

    done = TRUE;
    }
    }
    }
    CloseHandle (hScsiDriveIOCTL);
    }
    }

    return done;
    }
    int ReadDrivePortsInWin9X (void)
    {
    int done = FALSE;
    int drive = 0;

    InitializeWinIo ();

    // Get IDE Drive info from the hardware ports
    // loop thru all possible drives
    for (drive = 0; drive < 8; drive++)
    {
    DWORD diskdata [256];
    WORD baseAddress = 0; // Base address of drive controller
    DWORD portValue = 0;
    int waitLoop = 0;
    int index = 0;

    switch (drive / 2)
    {
    case 0: baseAddress = 0x1f0; break;
    case 1: baseAddress = 0x170; break;
    case 2: baseAddress = 0x1e8; break;
    case 3: baseAddress = 0x168; break;
    }

    // Wait for controller not busy
    waitLoop = 100000;
    while (--waitLoop > 0)
    {
    GetPortVal ((WORD) (baseAddress + 7), &portValue, (BYTE) 1);
    // drive is ready
    if ((portValue & 0x40) == 0x40) break;
    // previous drive command ended in error
    if ((portValue & 0x01) == 0x01) break;
    }

    if (waitLoop < 1) continue;

    // Set Master or Slave drive
    if ((drive % 2) == 0)
    SetPortVal ((WORD) (baseAddress + 6), 0xA0, 1);
    else
    SetPortVal ((WORD) (baseAddress + 6), 0xB0, 1);

    // Get drive info data
    SetPortVal ((WORD) (baseAddress + 7), 0xEC, 1);

    // Wait for data ready
    waitLoop = 100000;
    while (--waitLoop > 0)
    {
    GetPortVal ((WORD) (baseAddress + 7), &portValue, 1);
    // see if the drive is ready and has it's info ready for us
    if ((portValue & 0x48) == 0x48) break;
    // see if there is a drive error
    if ((portValue & 0x01) == 0x01) break;
    }

    // check for time out or other error
    if (waitLoop < 1 || portValue & 0x01) continue;

    // read drive id information
    for (index = 0; index < 256; index++)
    {
    diskdata [index] = 0; // init the space
    GetPortVal (baseAddress, &(diskdata [index]), 2);
    }

    PrintIdeInfo (drive, diskdata);
    done = TRUE;
    }

    ShutdownWinIo ();

    return done;
    }


Sign In or Register to comment.