请教高手:java如何读取硬盘的序列号
2条回答 默认 最新
- zkgale 2009-02-22 13:41关注
我在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 Sys3)打开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_showHDSerial8)编译Sys 工程,生成Sys.dll
9)将Sys.dll 拷到Sys.class 同目录下
10)运行
java Sys得到如下结果(本人机器)
F:>java SysModule Number:SAMSUNG SP0802N
Firmware rev:TK100-28
Serial Number: S00JJ50Y418303
Capacity:76293M本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥20 删除和修改功能无法调用
- ¥15 kafka topic 所有分副本数修改
- ¥15 小程序中fit格式等运动数据文件怎样实现可视化?(包含心率信息))
- ¥15 如何利用mmdetection3d中的get_flops.py文件计算fcos3d方法的flops?
- ¥40 串口调试助手打开串口后,keil5的代码就停止了
- ¥15 电脑最近经常蓝屏,求大家看看哪的问题
- ¥60 高价有偿求java辅导。工程量较大,价格你定,联系确定辅导后将采纳你的答案。希望能给出完整详细代码,并能解释回答我关于代码的疑问疑问,代码要求如下,联系我会发文档
- ¥50 C++五子棋AI程序编写
- ¥30 求安卓设备利用一个typeC接口,同时实现向pc一边投屏一边上传数据的解决方案。
- ¥15 SQL Server analysis services 服务安装失败