如何获取硬盘容量等相关信息(容量,型号...)?
能否从注册表中读出?
要不有没有这样的API?谢谢。[email protected]

解决方案 »

  1.   

    取硬盘信息. 
    一般情况下,我们就写个VXD或者DRIVER来完成.但是现在,通过MS的S.M.A.R.T.接口,我们可以直接从RING3调用API DeviceIoControl()来获取硬盘信息.
    /*+++ 
    HDID.CPP 
    Written by Lu Lin 
    http://lu0.126.com 
    2000.11.3 
    ---*/ 
    #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 CopyRight(){ 
    cerr<<endl<<"HDD identifier v1.0 for WIN95/98/Me/NT/2000. written by Lu Lin"<<endl; 
    cerr<<"For more information, please visit Inside Programming: http://lu0.126.com"<<endl; 
    cerr<<"2000.11.3"<<endl<<endl; 

    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; 


      

  2.   

    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(); 
    } void main(){ 
    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; 

      

  3.   


    看看这个http://fonsea.51.net/vc/apidevice.htm主要用到两个API函数,GetDriveType和GetDiskFreeSpace。GetDriveType是用来检测驱动器类型的,一共6种类型。
    GetDiskFreeSpace的作用是获取磁盘组织和容量有关的信息。
      

  4.   

    就是就是,直接读写IDE端口或SCSI端口,你想要什么都读得到。呵呵 就是有点难写。神仙宣言
      

  5.   

    那个ID号,据说会随着format而改变?会改变吗?如果回的话就不能用来作加密了=============================================
    您想非常省事的写 C++ 程序文档吗?
    DocWizard 略作小改动,版本号 1.0.0.2 欢迎使用欢迎下载,提出改进建议 http://www.betajin.com/alphasun/您在写文档时是否被数量众多的类成员函数所烦恼?是否为了美观的
    版面、格式而困扰?是否为了做成CHM而不得不进行大量的手工操作?
    本软件可以帮助您        ●    生成C++的类的HTML格式的文档,条分缕析,版面美观而朴实。
                    并且可以集成到  HTML  Workshop  中,和其他类一起形成CHM。        ●    而且可以生成  content  of  topic  (.hhc)  文件以及生成
                    index  (.hhk)  文件。避免您手工编辑生成文件的麻烦。要知
                    道在  HTML  Workshop  中编辑生成这两种文件是非常麻烦的。        ●    在马上就要推出的新版本中,将提供二次开发接口,您将可以
                    操纵文档生成过程,形成更符合您要求的文档。当然源代码的
                    解析本软件已经帮您完成了,您所要做的仅仅是生成您所关心
                    的“部分”文档。欢迎下载,提出改进建议 http://www.betajin.com/alphasun/