JNI获得硬盘信息

本文介绍了一种使用Java跨平台获取硬盘序列号的方法,通过JNI调用C++代码实现对不同Windows系统的IDE硬盘进行识别,并读取其序列号等信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下是获取硬盘序列号,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   

 

 

 

http://www.javaeye.com/problems/11702

1. 用户与权限管理模块 角色管理: 学生:查看实验室信息、预约设备、提交耗材申请、参与安全考核 教师:管理课题组预约、审批学生耗材申请、查看本课题组使用记录 管理员:设备全生命周期管理、审核预约、耗材采购与分发、安全检查 用户操作: 登录认证:统一身份认证(对接学号 / 工号系统,模拟实现),支持密码重置 信息管理:学生 / 教师维护个人信息(联系方式、所属院系),管理员管理所有用户 权限控制:不同角色仅可见对应功能(如学生不可删除设备信息) 2. 实验室与设备管理模块 实验室信息管理: 基础信息:实验室编号、名称、位置、容纳人数、开放时间、负责人 功能分类:按学科(计算机实验室 / 电子实验室 / 化学实验室)标记,关联可开展实验类型 状态展示:实时显示当前使用人数、设备运行状态(正常 / 故障) 设备管理: 设备档案:名称、型号、规格、购置日期、单价、生产厂家、存放位置、责任人 全生命周期管理: 入库登记:管理员录入新设备信息,生成唯一资产编号 维护记录:记录维修、校准、保养信息(时间、内容、执行人) 报废处理:登记报废原因、时间,更新设备状态为 "已报废" 设备查询:支持按名称、型号、状态多条件检索,显示设备当前可用情况 3. 预约与使用模块 预约管理: 预约规则:学生可预约未来 7 天内的设备 / 实验室,单次最长 4 小时(可设置) 预约流程:选择实验室→选择设备→选择时间段→提交申请(需填写实验目的) 审核机制:普通实验自动通过,高危实验(如化学实验)需教师审核 使用记录: 签到 / 签退:到达实验室后扫码签到,离开时签退,系统自动记录实际使用时长 使用登记:填写实验内容、设备运行情况(正常 / 异常),异常情况需详细描述 违规管理:迟到 15 分钟自动取消预约,多次违规限制预约权限 4. 耗材与安全管理模块 耗材管理: 耗材档案:名称、规格、数量、存放位置、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值