读书人

JNI取得硬盘信息

发布时间: 2013-10-01 12:15:56 作者: rapoo

JNI获得硬盘信息

? #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

读书人网 >编程

热点推荐