请教高手:java如何读取硬盘的序列号

请教高手:java如何读取硬盘的序列号

我在CSDN里面帮你找到了一个。。。

http://topic.csdn.net/t/20060222/19/4571391.html

[code="java"]
以下是获取硬盘序列号,CPU 道理一样.

// Sys.java

public class Sys

{

public static native void showHDSerial();

static {

System.loadLibrary("Sys");

}

public static void main(String[] args)

{

showHDSerial();

}

}

1) 编译

javac Sys.java

2)生成 .h 文件

javah -jni Sys

3)打开VC->文件->新建->工程->Win32 DLL (这里简写了)

4)写入工程名;Sys 创建空白工程

5)将Sys.h,jni.h 添加到工程中(其中jni.h在[JAVA_HOME]\include 下).

6)创建Sys.cpp 文件.文件内容如下:

// Sys.cpp

#include "jni.h"

#include

#include

#include

#define DFP_GET_VERSION 0x00074080

#define DFP_SEND_DRIVE_COMMAND 0x0007c084

#define DFP_RECEIVE_DRIVE_DATA 0x0007c088

#pragma pack(1)

typedef struct _GETVERSIONOUTPARAMS {

BYTE bVersion; // Binary driver version.

BYTE bRevision; // Binary driver revision.

BYTE bReserved; // Not used.

BYTE bIDEDeviceMap; // Bit map of IDE devices.

DWORD fCapabilities; // Bit mask of driver capabilities.

DWORD dwReserved[4]; // For future use.

} GETVERSIONOUTPARAMS, *PGETVERSIONOUTPARAMS, *LPGETVERSIONOUTPARAMS;

typedef 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.

} IDEREGS, *PIDEREGS, *LPIDEREGS;

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.

} SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS;

typedef struct _DRIVERSTATUS {

BYTE bDriverError; // Error code from driver,

// or 0 if no error.

BYTE bIDEStatus; // Contents of IDE Error register.

// Only valid when bDriverError

// is SMART_IDE_ERROR.

BYTE bReserved[2]; // Reserved for future expansion.

DWORD dwReserved[2]; // Reserved for future expansion.

} DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS;

typedef struct _SENDCMDOUTPARAMS {

DWORD cBufferSize; // Size of bBuffer in bytes

DRIVERSTATUS DriverStatus; // Driver status structure.

BYTE bBuffer[512]; // Buffer of arbitrary length

// in which to store the data read from the drive.

} SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS;

typedef struct _IDSECTOR {

USHORT wGenConfig;

USHORT wNumCyls;

USHORT wReserved;

USHORT wNumHeads;

USHORT wBytesPerTrack;

USHORT wBytesPerSector;

USHORT wSectorsPerTrack;

USHORT wVendorUnique[3];

CHAR sSerialNumber[20];

USHORT wBufferType;

USHORT wBufferSize;

USHORT wECCSize;

CHAR sFirmwareRev[8];

CHAR sModelNumber[40];

USHORT wMoreVendorUnique;

USHORT wDoubleWordIO;

USHORT wCapabilities;

USHORT wReserved1;

USHORT wPIOTiming;

USHORT wDMATiming;

USHORT wBS;

USHORT wNumCurrentCyls;

USHORT wNumCurrentHeads;

USHORT wNumCurrentSectorsPerTrack;

ULONG ulCurrentSectorCapacity;

USHORT wMultSectorStuff;

ULONG ulTotalAddressableSectors;

USHORT wSingleWordDMA;

USHORT wMultiWordDMA;

BYTE bReserved[128];

} IDSECTOR, *PIDSECTOR;

/*+++

Global vars

---*/

GETVERSIONOUTPARAMS vers;

SENDCMDINPARAMS in;

SENDCMDOUTPARAMS out;

HANDLE h;

DWORD i;

BYTE j;

VOID ChangeByteOrder(PCHAR szString, USHORT uscStrSize)

{

USHORT i;

CHAR temp;

for   (i   =   0;   i   <   uscStrSize;   i+=2)    
{    
  temp   =   szString[i];    
  szString[i]   =   szString[i+1];    
  szString[i+1]   =   temp;    
}    

}

void DetectIDE(BYTE bIDEDeviceMap){

if (bIDEDeviceMap&1){

if (bIDEDeviceMap&16){

cout<<"ATAPI device is attached to primary controller, drive 0."<<endl;

}else{

cout<<"IDE device is attached to primary controller, drive 0."<<endl;

}

}

if (bIDEDeviceMap&2){

if (bIDEDeviceMap&32){

cout<<"ATAPI device is attached to primary controller, drive 1."<<endl;

}else{

cout<<"IDE device is attached to primary controller, drive 1."<<endl;

}

}

if (bIDEDeviceMap&4){

if (bIDEDeviceMap&64){

cout<<"ATAPI device is attached to secondary controller, drive 0."<<endl;

}else{

cout<<"IDE device is attached to secondary controller, drive 0."<<endl;

}

}

if (bIDEDeviceMap&8){

if (bIDEDeviceMap&128){

cout<<"ATAPI device is attached to secondary controller, drive 1."<<endl;

}else{

cout<<"IDE device is attached to secondary controller, drive 1."<<endl;

}

}

}

void hdid9x(){

ZeroMemory(&vers,sizeof(vers));

//We start in 95/98/Me

h=CreateFile("\\.\Smartvsd",0,0,0,CREATE_NEW,0,0);

if (!h){

cout<<"open smartvsd.vxd failed"<<endl;

exit(0);

}

if   (!DeviceIoControl(h,DFP_GET_VERSION,0,0,&vers,sizeof(vers),&i,0)){    
  cout<<"DeviceIoControl   failed:DFP_GET_VERSION"<<endl;    
  CloseHandle(h);    
  return;    
}    
//If   IDE   identify   command   not   supported,   fails    
if   (!(vers.fCapabilities&1)){    
  cout<<"Error:   IDE   identify   command   not   supported.";    
  CloseHandle(h);    
  return;    
}    
//Display   IDE   drive   number   detected    
DetectIDE(vers.bIDEDeviceMap);    
//Identify   the   IDE   drives    
for   (j=0;j<4;j++){    
  PIDSECTOR   phdinfo;    
  char   s[41];    

  ZeroMemory(&in,sizeof(in));    
  ZeroMemory(&out,sizeof(out));    
  if   (j&1){    
    in.irDriveRegs.bDriveHeadReg=0xb0;    
  }else{    
    in.irDriveRegs.bDriveHeadReg=0xa0;    
  }    
  if   (vers.fCapabilities&(16>>j)){    
    //We   don't   detect   a   ATAPI   device.    
    cout<<"Drive   "<<(int)(j+1)<<"   is   a   ATAPI   device,   we   don't   detect   it"<<endl;    
    continue;    
  }else{    
    in.irDriveRegs.bCommandReg=0xec;    
  }    
  in.bDriveNumber=j;    
  in.irDriveRegs.bSectorCountReg=1;    
  in.irDriveRegs.bSectorNumberReg=1;    
  in.cBufferSize=512;    
  if   (!DeviceIoControl(h,DFP_RECEIVE_DRIVE_DATA,&in,sizeof(in),&out,sizeof(out),&i,0)){    
    cout<<"DeviceIoControl   failed:DFP_RECEIVE_DRIVE_DATA"<<endl;    
    CloseHandle(h);    
    return;    
  }    
  phdinfo=(PIDSECTOR)out.bBuffer;    
  memcpy(s,phdinfo->sModelNumber,40);    
  s[40]=0;    
  ChangeByteOrder(s,40);    
  cout<<endl<<"Module   Number:"<<s<<endl;    
  memcpy(s,phdinfo->sFirmwareRev,8);    
  s[8]=0;    
  ChangeByteOrder(s,8);    
  cout<<"\tFirmware   rev:"<<s<<endl;    
  memcpy(s,phdinfo->sSerialNumber,20);    
  s[20]=0;    
  ChangeByteOrder(s,20);    
  cout<<"\tSerial   Number:"<<s<<endl;    
  cout<<"\tCapacity:"<<phdinfo->ulTotalAddressableSectors/2/1024<<"M"<<endl<<endl;    
}    

//Close   handle   before   quit    
CloseHandle(h);    

// CopyRight();

}

void hdidnt(){

char hd[80];

PIDSECTOR phdinfo;

char s[41];

ZeroMemory(&vers,sizeof(vers));    
//We   start   in   NT/Win2000    
for   (j=0;j<4;j++){    
  sprintf(hd,"\\\\.\\PhysicalDrive%d",j);    
  h=CreateFile(hd,GENERIC_READ|GENERIC_WRITE,    
    FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);    
  if   (!h){    
    continue;    
  }    
  if   (!DeviceIoControl(h,DFP_GET_VERSION,0,0,&vers,sizeof(vers),&i,0)){    
    CloseHandle(h);    
    continue;    
  }    
  //If   IDE   identify   command   not   supported,   fails    
  if   (!(vers.fCapabilities&1)){    
    cout<<"Error:   IDE   identify   command   not   supported.";    
    CloseHandle(h);    
    return;    
  }    
  //Identify   the   IDE   drives    
  ZeroMemory(&in,sizeof(in));    
  ZeroMemory(&out,sizeof(out));    
  if   (j&1){    
    in.irDriveRegs.bDriveHeadReg=0xb0;    
  }else{    
    in.irDriveRegs.bDriveHeadReg=0xa0;    
  }    
  if   (vers.fCapabilities&(16>>j)){    
    //We   don't   detect   a   ATAPI   device.    
    cout<<"Drive   "<<(int)(j+1)<<"   is   a   ATAPI   device,   we   don't   detect   it"<<endl;    
    continue;    
  }else{    
    in.irDriveRegs.bCommandReg=0xec;    
  }    
  in.bDriveNumber=j;    
  in.irDriveRegs.bSectorCountReg=1;    
  in.irDriveRegs.bSectorNumberReg=1;    
  in.cBufferSize=512;    
  if   (!DeviceIoControl(h,DFP_RECEIVE_DRIVE_DATA,&in,sizeof(in),&out,sizeof(out),&i,0)){    
    cout<<"DeviceIoControl   failed:DFP_RECEIVE_DRIVE_DATA"<<endl;    
    CloseHandle(h);    
    return;    
  }    
  phdinfo=(PIDSECTOR)out.bBuffer;    
  memcpy(s,phdinfo->sModelNumber,40);    
  s[40]=0;    
  ChangeByteOrder(s,40);    
  cout<<endl<<"Module   Number:"<<s<<endl;    
  memcpy(s,phdinfo->sFirmwareRev,8);    
  s[8]=0;    
  ChangeByteOrder(s,8);    
  cout<<"\tFirmware   rev:"<<s<<endl;    
  memcpy(s,phdinfo->sSerialNumber,20);    
  s[20]=0;    
  ChangeByteOrder(s,20);    
  cout<<"\tSerial   Number:"<<s<<endl;    
  cout<<"\tCapacity:"<<phdinfo->ulTotalAddressableSectors/2/1024<<"M"<<endl<<endl;    
  CloseHandle(h);    
}    

// CopyRight();

}

JNIEXPORT void JNICALL Java_Sys_showHDSerial(JNIEnv *env, jclass jcls)

{

OSVERSIONINFO VersionInfo;

ZeroMemory(&VersionInfo,sizeof(VersionInfo));    
VersionInfo.dwOSVersionInfoSize=sizeof(VersionInfo);    
GetVersionEx(&VersionInfo);    

switch   (VersionInfo.dwPlatformId){    
case   VER_PLATFORM_WIN32s:    
  cout<<"Win32s   is   not   supported   by   this   programm."<<endl;    
  return;    
case   VER_PLATFORM_WIN32_WINDOWS:    
  hdid9x();    
  return;    
case   VER_PLATFORM_WIN32_NT:    
  hdidnt();    
  return;    
}    

}

[/code]

7)新建Sys.def 文件,内容如下

EXPORTS

Java_Sys_showHDSerial

8)编译Sys 工程,生成Sys.dll

9)将Sys.dll 拷到Sys.class 同目录下

10)运行

java Sys

得到如下结果(本人机器)

F:>java Sys

Module Number:SAMSUNG SP0802N

Firmware rev:TK100-28

Serial Number: S00JJ50Y418303

Capacity:76293M

直接用Java比较的困难……
看[url=http://www.rgagnon.com/javadetails/java-0580.html]这里[/url]和[url=http://forums.sun.com/thread.jspa?forumID=31&threadID=683640]这里[/url],都是用Java调用外部的VBS脚本来获取驱动器信息的,只能在Windows上使用。不想这样的话,试试用[url=https://jna.dev.java.net/]JNA[/url]来调用特定于系统的函数吧。