📄 getideandmac.txt
字号:
// if (hScsiDriveIOCTL == INVALID_HANDLE_VALUE)
// printf ("Unable to open SCSI controller %d, error code: 0x%lX\n",
// 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;
}
void PrintIdeInfo (int drive, DWORD diskdata [256])
{
char serialNumber [1024];
char modelNumber [1024];
char revisionNumber [1024];
char bufferSize [32];
__int64 sectors = 0;
__int64 bytes = 0;
// copy the hard drive serial number to the buffer
ConvertToString (diskdata, 10, 19, serialNumber);
ConvertToString (diskdata, 27, 46, modelNumber);
ConvertToString (diskdata, 23, 26, revisionNumber);
sprintf (bufferSize, "%u", diskdata [21] * 512);
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);
strcpy (HardDriveModelNumber, modelNumber);
}
#ifdef PRINTING_TO_CONSOLE_ALLOWED
printf ("\nDrive %d - ", drive);
switch (drive / 2)
{
case 0: printf ("Primary Controller - ");
break;
case 1: printf ("Secondary Controller - ");
break;
case 2: printf ("Tertiary Controller - ");
break;
case 3: printf ("Quaternary Controller - ");
break;
}
switch (drive % 2)
{
case 0: printf (" - Master drive\n\n");
break;
case 1: printf (" - Slave drive\n\n");
break;
}
printf ("Drive Model Number________________: [%s]\n",
modelNumber);
printf ("Drive Serial Number_______________: [%s]\n",
serialNumber);
printf ("Drive Controller Revision Number__: [%s]\n",
revisionNumber);
printf ("Controller Buffer Size on Drive___: %s bytes\n",
bufferSize);
printf ("Drive Type________________________: ");
if (diskdata [0] & 0x0080)
printf ("Removable\n");
else if (diskdata [0] & 0x0040)
printf ("Fixed\n");
else printf ("Unknown\n");
// calculate size based on 28 bit or 48 bit addressing
// 48 bit addressing is reflected by bit 10 of word 83
if (diskdata [83] & 0x400)
sectors = diskdata [103] * 65536I64 * 65536I64 * 65536I64 +
diskdata [102] * 65536I64 * 65536I64 +
diskdata [101] * 65536I64 +
diskdata [100];
else
sectors = diskdata [61] * 65536 + diskdata [60];
// there are 512 bytes in a sector
bytes = sectors * 512;
printf ("Drive Size________________________: %I64d bytes\n",
bytes);
#endif // PRINTING_TO_CONSOLE_ALLOWED
char string1 [1000];
sprintf (string1, "Drive%dModelNumber", drive);
WriteConstantString (string1, modelNumber);
sprintf (string1, "Drive%dSerialNumber", drive);
WriteConstantString (string1, serialNumber);
sprintf (string1, "Drive%dControllerRevisionNumber", drive);
WriteConstantString (string1, revisionNumber);
sprintf (string1, "Drive%dControllerBufferSize", drive);
WriteConstantString (string1, bufferSize);
sprintf (string1, "Drive%dType", drive);
if (diskdata [0] & 0x0080)
WriteConstantString (string1, "Removable");
else if (diskdata [0] & 0x0040)
WriteConstantString (string1, "Fixed");
else
WriteConstantString (string1, "Unknown");
}
char *ConvertToString (DWORD diskdata [256],
int firstIndex,
int lastIndex,
char* buf)
{
int index = 0;
int position = 0;
// each integer has two characters stored in it backwards
for (index = firstIndex; index <= lastIndex; index++)
{
// get high byte for 1st character
buf [position++] = (char) (diskdata [index] / 256);
// get low byte for 2nd character
buf [position++] = (char) (diskdata [index] % 256);
}
// end the string
buf[position] = '\0';
// cut off the trailing blanks
for (index = position - 1; index > 0 && isspace(buf [index]); index--)
buf [index] = '\0';
return buf;
}
long getHardDriveComputerID ()
{
int done = FALSE;
// char string [1024];
__int64 id = 0;
OSVERSIONINFO version;
strcpy (HardDriveSerialNumber, "");
memset (&version, 0, sizeof (version));
version.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
GetVersionEx (&version);
if (version.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
// this works under WinNT4 or Win2K if you have admin rights
#ifdef PRINTING_TO_CONSOLE_ALLOWED
printf ("\nTrying to read the drive IDs using physical access with admin rights\n");
#endif
done = ReadPhysicalDriveInNTWithAdminRights ();
// this should work in WinNT or Win2K if previous did not work
// this is kind of a backdoor via the SCSI mini port driver into
// the IDE drives
#ifdef PRINTING_TO_CONSOLE_ALLOWED
printf ("\nTrying to read the drive IDs using the SCSI back door\n");
#endif
// if ( ! done)
done = ReadIdeDriveAsScsiDriveInNT ();
// this works under WinNT4 or Win2K or WinXP if you have any rights
#ifdef PRINTING_TO_CONSOLE_ALLOWED
printf ("\nTrying to read the drive IDs using physical access with zero rights\n");
#endif
//if ( ! done)
done = ReadPhysicalDriveInNTWithZeroRights ();
// this works under WinNT4 or Win2K or WinXP or Windows Server 2003 or Vista if you have any rights
#ifdef PRINTING_TO_CONSOLE_ALLOWED
printf ("\nTrying to read the drive IDs using Smart\n");
#endif
//if ( ! done)
done = ReadPhysicalDriveInNTUsingSmart ();
}
else
{
// this works under Win9X and calls a VXD
int attempt = 0;
// try this up to 10 times to get a hard drive serial number
for (attempt = 0;
attempt < 10 && ! done && 0 == HardDriveSerialNumber [0];
attempt++)
done = ReadDrivePortsInWin9X ();
}
if (HardDriveSerialNumber [0] > 0)
{
char *p = HardDriveSerialNumber;
WriteConstantString ("HardDriveSerialNumber", HardDriveSerialNumber);
// ignore first 5 characters from western digital hard drives if
// the first four characters are WD-W
if ( ! strncmp (HardDriveSerialNumber, "WD-W", 4))
p += 5;
for ( ; p && *p; p++)
{
if ('-' == *p)
continue;
id *= 10;
switch (*p)
{
case '0': id += 0; break;
case '1': id += 1; break;
case '2': id += 2; break;
case '3': id += 3; break;
case '4': id += 4; break;
case '5': id += 5; break;
case '6': id += 6; break;
case '7': id += 7; break;
case '8': id += 8; break;
case '9': id += 9; break;
case 'a': case 'A': id += 10; break;
case 'b': case 'B': id += 11; break;
case 'c': case 'C': id += 12; break;
case 'd': case 'D': id += 13; break;
case 'e': case 'E': id += 14; break;
case 'f': case 'F': id += 15; break;
case 'g': case 'G': id += 16; break;
case 'h': case 'H': id += 17; break;
case 'i': case 'I': id += 18; break;
case 'j': case 'J': id += 19; break;
case 'k': case 'K': id += 20; break;
case 'l': case 'L': id += 21; break;
case 'm': case 'M': id += 22; break;
case 'n': case 'N': id += 23; break;
case 'o': case 'O': id += 24; break;
case 'p': case 'P': id += 25; break;
case 'q': case 'Q': id += 26; break;
case 'r': case 'R': id += 27; break;
case 's': case 'S': id += 28; break;
case 't': case 'T': id += 29; break;
case 'u': case 'U': id += 30; break;
case 'v': case 'V': id += 31; break;
case 'w': case 'W': id += 32; break;
case 'x': case 'X': id += 33; break;
case 'y': case 'Y': id += 34; break;
case 'z': case 'Z': id += 35; break;
}
}
}
id %= 100000000;
if (strstr (HardDriveModelNumber, "IBM-"))
id += 300000000;
else if (strstr (HardDriveModelNumber, "MAXTOR") ||
strstr (HardDriveModelNumber, "Maxtor"))
id += 400000000;
else if (strstr (HardDriveModelNumber, "WDC "))
id += 500000000;
else
id += 600000000;
#ifdef PRINTING_TO_CONSOLE_ALLOWED
printf ("\nHard Drive Serial Number__________: %s\n",
HardDriveSerialNumber);
printf ("\nHard Drive Model Number___________: %s\n",
HardDriveModelNumber);
printf ("\nComputer ID_______________________: %I64d\n", id);
#endif
return (long) id;
}
// GetMACAdapters.cpp : Defines the entry point for the console application.
//
// Author: Khalid Shaikh [Shake@ShakeNet.com]
// Date: April 5th, 2002
//
// This program fetches the MAC address of the localhost by fetching the
// information through GetAdapatersInfo. It does not rely on the NETBIOS
// protocol and the ethernet adapter need not be connect to a network.
//
// Supported in Windows NT/2000/XP
// Supported in Windows 95/98/Me
//
// Supports multiple NIC cards on a PC.
#include <Iphlpapi.h>
#include <Assert.h>
#pragma comment(lib, "iphlpapi.lib")
// Prints the MAC address stored in a 6 byte array to stdout
static void PrintMACaddress(unsigned char MACData[])
{
#ifdef PRINTING_TO_CONSOLE_ALLOWED
printf("\nMAC Address: %02X-%02X-%02X-%02X-%02X-%02X\n",
MACData[0], MACData[1], MACData[2], MACData[3], MACData[4], MACData[5]);
#endif
char string [256];
sprintf (string, "%02X-%02X-%02X-%02X-%02X-%02X", MACData[0], MACData[1],
MACData[2], MACData[3], MACData[4], MACData[5]);
WriteConstantString ("MACaddress", string);
}
// Fetches the MAC address and prints it
DWORD GetMACaddress(void)
{
DWORD MACaddress = 0;
IP_ADAPTER_INFO AdapterInfo[16]; // Allocate information
// for up to 16 NICs
DWORD dwBufLen = sizeof(AdapterInfo); // Save memory size of buffer
DWORD dwStatus = GetAdaptersInfo( // Call GetAdapterInfo
AdapterInfo, // [out] buffer to receive data
&dwBufLen); // [in] size of receive data buffer
assert(dwStatus == ERROR_SUCCESS); // Verify return value is
// valid, no buffer overflow
PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo; // Contains pointer to
// current adapter info
do {
if (MACaddress == 0)
MACaddress = pAdapterInfo->Address [5] + pAdapterInfo->Address [4] * 256 +
pAdapterInfo->Address [3] * 256 * 256 +
pAdapterInfo->Address [2] * 256 * 256 * 256;
PrintMACaddress(pAdapterInfo->Address); // Print MAC address
pAdapterInfo = pAdapterInfo->Next; // Progress through linked list
}
while(pAdapterInfo); // Terminate if last adapter
return MACaddress;
}
static void dump_buffer (const char* title,
const unsigned char* buffer,
int len)
{
int i = 0;
int j;
printf ("\n-- %s --\n", title);
if (len > 0)
{
printf ("%8.8s ", " ");
for (j = 0; j < 16; ++j)
{
printf (" %2X", j);
}
printf (" ");
for (j = 0; j < 16; ++j)
{
printf ("%1X", j);
}
printf ("\n");
}
while (i < len)
{
printf("%08x ", i);
for (j = 0; j < 16; ++j)
{
if ((i + j) < len)
printf (" %02x", (int) buffer[i +j]);
else
printf (" ");
}
printf (" ");
for (j = 0; j < 16; ++j)
{
if ((i + j) < len)
printf ("%c", isprint (buffer[i + j]) ? buffer [i + j] : '.');
else
printf (" ");
}
printf ("\n");
i += 16;
}
printf ("-- DONE --\n");
}
int main (int argc, char * argv [])
{
printf ("To get all details use \"diskid32 /d\"\n");
if (argc > 1 && strstr (argv [1], "/d"))
PRINT_DEBUG = true;
else
PRINT_DEBUG = false;
long id = getHardDriveComputerID ();
GetMACaddress ();
system("Pause");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -