同步操作将从 精易科技/eapi 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
#include "..\include_eapi_header.h"#include"..\elib\fnshare.h"#include<string>typedef struct HDInfo{char* model;char* Version;char* serial;//单位:MBsize_t capacity;//单位:MBsize_t cachesize;size_t sectorspertrack;size_t heads;size_t cylinders;HDInfo() {//VC6只能这样初始化memset(this, 0, sizeof(*this));}}*PHDINFO;#define IDE_ATA_IDENTIFY 0xEC; //读取ATA设备的命令inline std::string Trim(std::string str){std::string::size_type pos = str.find_last_not_of(' ');if (pos != std::string::npos){str.erase(pos + 1);pos = str.find_first_not_of(L' ');if (pos != std::string::npos)str.erase(0, pos);}elsestr.erase(str.begin(), str.end());return str;}inline BOOL DoIdentify(HANDLE hPhysicalDriveIOCTL, PSENDCMDINPARAMS pSCIP, PSENDCMDOUTPARAMS pSCOP, BYTE bIDCmd, BYTE bDriveNum, PDWORD lpcbBytesReturned){// Set up data structures for IDENTIFY command.pSCIP->cBufferSize = IDENTIFY_BUFFER_SIZE;pSCIP->irDriveRegs.bFeaturesReg = 0;pSCIP->irDriveRegs.bSectorCountReg = 1;pSCIP->irDriveRegs.bSectorNumberReg = 1;pSCIP->irDriveRegs.bCylLowReg = 0;pSCIP->irDriveRegs.bCylHighReg = 0;//Compute the drive number.(主盘和从盘所对应的值是不一样的)pSCIP->irDriveRegs.bDriveHeadReg = (bDriveNum & 1) ? 0xB0 : 0xA0;// The command can either be IDE identify or ATAPI identify.pSCIP->irDriveRegs.bCommandReg = bIDCmd;pSCIP->bDriveNumber = bDriveNum;pSCIP->cBufferSize = IDENTIFY_BUFFER_SIZE;return DeviceIoControl(hPhysicalDriveIOCTL, SMART_RCV_DRIVE_DATA, (LPVOID)pSCIP, sizeof(SENDCMDINPARAMS) - 1,(LPVOID)pSCOP, sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1, lpcbBytesReturned, NULL);}inline std::string ChangeByteOrder(unsigned char* first, size_t len){char* ret = new char[len + 1];memset(ret, 0, len + 1);for (size_t i = 0; i < len - 1; i += 2){ret[i] = first[i + 1];ret[i + 1] = first[i];}std::string result = std::string(std::string(ret, len).c_str());//截断结束符delete[] ret;return Trim(result);}bool GetHDInfo(HDInfo* pHDInfo, int HDIndex) {BYTE IdOutCmd[sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1];HANDLE hPhysicalDriveIOCTL;char DriveName[32];bool ret = false;sprintf_s(DriveName, "\\\\.\\PhysicalDrive%d", HDIndex);hPhysicalDriveIOCTL = CreateFileA(DriveName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);memset(pHDInfo, 0, sizeof(HDInfo));if (hPhysicalDriveIOCTL != INVALID_HANDLE_VALUE){DWORD cbBytesReturned = 0;GETVERSIONINPARAMS VersionParams;ZeroMemory(&VersionParams, sizeof(GETVERSIONINPARAMS));if (DeviceIoControl(hPhysicalDriveIOCTL, SMART_GET_VERSION, NULL, 0, &VersionParams, sizeof(VersionParams), &cbBytesReturned, NULL)){if (VersionParams.bIDEDeviceMap > 0){BYTE bIDCmd = 0;SENDCMDINPARAMS InParams;bIDCmd = IDE_ATA_IDENTIFY;ZeroMemory(&InParams, sizeof(SENDCMDINPARAMS));ZeroMemory(IdOutCmd, sizeof(IdOutCmd));if (DoIdentify(hPhysicalDriveIOCTL, (PSENDCMDINPARAMS)&InParams, (PSENDCMDOUTPARAMS)IdOutCmd, (BYTE)bIDCmd, (BYTE)HDIndex, &cbBytesReturned)){unsigned char* pIDSector = ((SENDCMDOUTPARAMS*)IdOutCmd)->bBuffer; // 对应结构IDSECTOR,见头文件pHDInfo->model = CloneTextData(const_cast<char*>(ChangeByteOrder(pIDSector + 54, 0x28u).c_str()));pHDInfo->Version = CloneTextData(const_cast<char*>(ChangeByteOrder((pIDSector + 46), 8).c_str()));pHDInfo->serial = CloneTextData(const_cast<char*>(ChangeByteOrder((pIDSector + 20), 0x14u).c_str()));pHDInfo->capacity = (*(DWORD*)(pIDSector + 120) >> 11);//容量pHDInfo->heads = *(WORD*)(pIDSector + 6);//磁头数pHDInfo->sectorspertrack = *(WORD*)(pIDSector + 12);//扇区数pHDInfo->cachesize = (*(WORD*)(pIDSector + 42) << 9) / 1024 / 1024;//缓存大小pHDInfo->cylinders = *(DWORD*)(pIDSector + 120) / (unsigned int)*(WORD*)(pIDSector + 6) / *(WORD*)(pIDSector + 12);//柱面数ret = true;}}}CloseHandle(hPhysicalDriveIOCTL);}return ret;}// 调用格式: SDT_BOOL 取硬盘信息, 命令说明: "取硬件出厂信息。Win95/98/Me中可能无效。特殊情况下也许只能获取部分硬盘信息,其它未被成功获取的部分,将被设置为空文本或0。本命令为初级命令。"// 参数<1>: &硬盘信息 MAKELONG(0x07, 0), 参数说明: "待取得的硬盘信息"// 参数<2>: [硬盘序号 SDT_INT], 参数说明: "可以被省略。待取得的硬盘信息的硬盘序号。可以为以下常量之一:0、#接口常量.磁盘0;1、#接口常量.磁盘1;2、#接口常量.磁盘2;3、#接口常量.磁盘3。"EAPI_EXTERN_C void eapi_GetHDInfo_3_eapi(PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf){PHDINFO pHDInfo = *reinterpret_cast<PHDINFO*>(pArgInf[0].m_pCompoundData);INT type = 0;if (pArgInf[1].m_dtDataType){type = pArgInf[1].m_int;}pRetData->m_bool = GetHDInfo(pHDInfo, type);}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。