Java如何读取硬盘的序列号

java如何读取硬盘的序列号
2011-02-12 14:46

以下是获取硬盘序列号,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   <windows.h>   
  #include   <iostream.h>   
  #include   <stdio.h>   
  
  #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;   
    }   
  }  

 7)新建Sys.def   文件,内容如下 
  EXPORTS 
      Java_Sys_showHDSerial  
   
 编译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  

这个是在网上找的,先留在空间,有时间了再研究下。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值