|
Harddisk Serial
//#define _WIN32_WINNT 0x500
#include
//#include
#include
struct IDEREGS {
BYTE bFeaturesReg; // Used for specifying SMART "commands".
BYTE bSectorCountReg; // IDE sector count register
BYTE bSectorNumberReg; // IDE sector number register
BYTE bCylLowReg; // IDE low order cylinder value
BYTE bCylHighReg; // IDE high order cylinder value
BYTE bDriveHeadReg; // IDE drive/head register
BYTE bCommandReg; // Actual IDE command.
BYTE bReserved; // reserved for future use. Must be zero.
};
typedef struct SENDCMDINPARAMS {
DWORD cBufferSize; // Buffer size in bytes
IDEREGS irDriveRegs; // Structure with drive register values.
BYTE bDriveNumber; // Physical drive number to send
// command to (0,1,2,3).
BYTE bReserved[3]; // Reserved for future expansion.
DWORD dwReserved[4]; // For future use.
BYTE bBuffer[1]; // Input buffer.
};
struct DRIVERSTATUS
{
char DriveError;
char IDEStatus;
char Reserved[2];
int Reserved2[2];
};
struct IDSECTOR
{
short int GenConfig,
NumberCylinders,
Reserved,//2
NumberHeads,//3
BytesPerTrack,//4
BytesPerSector,//5
SectorsPerTrack,//6
VendorUnique[3]; //7
char SerialNumber[20];// As Char '10
short int BufferClass, //20
BufferSize,//21
ECCSize;//22
char FirmwareRevision[8];// As Char '23
char ModelNumber[40];// As Char '27
short int MoreVendorUnique,//47
DoubleWordIO,//48
Capabilities,//49
Reserved1,//50
PIOTiming,//51
DMATiming,//52
BS,//53
NumberCurrentCyls,//54
NumberCurrentHeads,//55
NumberCurrentSectorsPerTrack;//56
int CurrentSectorCapacity;//57
short int MultipleSectorCapacity,//59
MultipleSectorStuff;//60
int TotalAddressableSectors;//61
short int SingleWordDMA,//63
MultiWordDMA;//64
char Reserved2[382];//65
};
struct SENDCMDOUTPARAMS2
{
int BufferSize;
DRIVERSTATUS Status;
IDSECTOR IDS;
};
// CHarddiskSerialDlg dialog
//function void getharddiskserial(char drivename,char *serial);
void getharddiskserial(char drivename,char *serial)
{
if (serial == NULL) return;
SENDCMDINPARAMS sci;
SENDCMDOUTPARAMS2 sco;
HANDLE handle = NULL;
char strHD[256];
memset(&sci,0,sizeof(sci));
memset(&sco,0,sizeof(sco));
sprintf(strHD,"\\\\.\\%c:",drivename);
//sprintf(strHD,"\\\\.\\PhysicalDrive%d",driveNumber);
handle = CreateFileA(strHD, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
if (INVALID_HANDLE_VALUE == handle)
{
sprintf(strHD,"\\\\.\\PhysicalDrive%c",drivename);
handle = CreateFileA(strHD, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
}
if (INVALID_HANDLE_VALUE == handle)
{
sprintf(strHD,"\\\\.\\Scsi%c",drivename);
handle = CreateFileA(strHD, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
}
if (INVALID_HANDLE_VALUE == handle)//win 9x
{
sprintf(strHD,"\\\\.\\Smartvsd%c",drivename);
handle = CreateFileA(strHD, 0,0,0,CREATE_NEW, 0, 0);
}
if (INVALID_HANDLE_VALUE == handle)
{
serial[0] = 0;
return;
}
sci.bDriveNumber = drivename;
sci.cBufferSize = sizeof(sco);
sci.irDriveRegs.bDriveHeadReg = (char)(0xA0 | (drivename << 5));
sci.irDriveRegs.bCommandReg = 0xEC;
sci.irDriveRegs.bSectorCountReg = 1;
sci.irDriveRegs.bSectorNumberReg = 1;
DWORD returnSize = 0;
if (DeviceIoControl(handle,0x7C088, &sci, sizeof(sci), &sco, sizeof(sco), &returnSize, 0) != 0)
{
for (int i = 18; i >= 0; i--)
{
if (sco.IDS.SerialNumber[i] != ' ')
{
sco.IDS.SerialNumber[i+1] = 0;
break;
}
}
strcpy(serial,sco.IDS.SerialNumber);
}else{
serial[0] = 0;
}
CloseHandle(handle);
}
| Create Date : 06 กุมภาพันธ์ 2550 |
| Last Update : 6 กุมภาพันธ์ 2550 15:45:55 น. |
| |
|
|