怎么通过程序获取磁盘指定扇区的数据

怎么通过程序获取磁盘指定扇区的数据,第1张

(1)先用函数

CreateFile

获取硬盘的句柄

h;

(2)然后用函数

DeviceIoControl

得到硬盘扇区大小;

(3)之后用函数

SetFilePointerEx

将硬盘的文件指针移动到要读取的位置;

(4)最后用

ReadFile

读取数据。

第二步是必要的,因为对硬盘的ReadFile/WriteFile/SetFilePointer等 *** 作,必须读/写/将指针移动扇区大小的整数倍

得到磁盘方法如下:

CString CurDiskNo; //当前录像的盘符号

CString TotalDiskSize; //当前录像盘的总大小

CString FreeDiskSize; //当前录像盘和剩余空间

char cName[4 m_iMaxCount] = {0};

char sDiskPath[4 m_iMaxCount] = {0};

GetModuleFileName(NULL, cName, sizeof(cName)); //得到当前运行程序的路径

CString sSettingFile;

sSettingFileFormat("%s", cName);

sSettingFile = sSettingFileLeft(sSettingFileReverseFind('//'));

sSettingFile = sSettingFile + "//" + "Settingini";

//得到配置文件的全路径,录像盘的盘符保存在Settingini中

GetPrivateProfileString("disk", "path", NULL, sDiskPath, sizeof(sDiskPath), sSettingFile);

//从配置文件中得到盘符

char DiskName[4];

DiskName[0] = sDiskPath[0];

DiskName[1] = sDiskPath[1];

DiskName[2] = sDiskPath[2];

DiskName[3] = '/0';

ULARGE_INTEGER lpuse;

ULARGE_INTEGER lptotal;

ULARGE_INTEGER lpfree;

GetDiskFreeSpaceEx(DiskName,&lpuse,&lptotal,&lpfree);

//得到DiskName盘符的的总容量、已用空间大小、剩余空间大小

TotalDiskSizeFormat("总空间:%42fGB",lptotalQuadPart/10240/10240/10240);

FreeDiskSizeFormat("可用空间:%42fGB",lpfreeQuadPart/10240/10240/10240);

CurDiskNoFormat("当前磁盘:%s",sDiskPath);

Settingini文件内容如下:

[package]

time=1

[disk]

path=E:/

那么上面的DiskName就是 E:/ 得到的就是E盘的空间大小

备注:要把Settingini文件放到执行文件的目录下。

BOOL __fastcall DoIdentify( HANDLE hPhysicalDriveIOCTL,

PSENDCMDINPARAMS pSCIP,

PSENDCMDOUTPARAMS pSCOP,

BYTE btIDCmd,

BYTE btDriveNum,

PDWORD pdwBytesReturned)

{

pSCIP->cBufferSize = IDENTIFY_BUFFER_SIZE;

pSCIP->irDriveRegsbFeaturesReg = 0;

pSCIP->irDriveRegsbSectorCountReg = 1;

pSCIP->irDriveRegsbSectorNumberReg = 1;

pSCIP->irDriveRegsbCylLowReg = 0;

pSCIP->irDriveRegsbCylHighReg = 0;

pSCIP->irDriveRegsbDriveHeadReg = (btDriveNum & 1) 0xB0 : 0xA0;

pSCIP->irDriveRegsbCommandReg = btIDCmd;

pSCIP->bDriveNumber = btDriveNum;

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,

pdwBytesReturned, NULL);

}

char __fastcall ConvertToString(DWORD dwDiskData[256], int nFirstIndex, int nLastIndex)

{

static char szResBuf[1024];

char ss[256];

int nIndex = 0;

int nPosition = 0;

for(nIndex = nFirstIndex; nIndex <= nLastIndex; nIndex++)

{

ss[nPosition] = (char)(dwDiskData[nIndex] / 256);

nPosition++;

// Get low BYTE for 2nd character

ss[nPosition] = (char)(dwDiskData[nIndex] % 256);

nPosition++;

}

// End the string ss[nPosition] = '\0';

int i, index=0;

for(i=0; i<nPosition; i++)

{

if(ss[i]==0 || ss[i]==32) continue;

szResBuf[index]=ss[i];

index++;

}

szResBuf[index]=0;

return szResBuf;

}

int GetID() //主函数

{

//创建设备对象,得到设备句柄,设备为硬盘。

CString sFilePath;

sFilePathFormat("\\\\\\PHYSICALDRIVE%d", driver);

HANDLE hFile=::CreateFile(sFilePath,

GENERIC_READ | GENERIC_WRITE,

FILE_SHARE_READ | FILE_SHARE_WRITE,

NULL, OPEN_EXISTING,

0, NULL);

DWORD dwBytesReturned;

GETVERSIONINPARAMS gvopVersionParams;

DeviceIoControl(hFile, //向设备对象发送SMART_GET_VERSION设备请求,获取硬盘属性

SMART_GET_VERSION,

NULL,

0,

&gvopVersionParams,

sizeof(gvopVersionParams),

&dwBytesReturned, NULL);

if(gvopVersionParamsbIDEDeviceMap <= 0) return -2;

//发送SMART_RCV_DRIVE_DATA设备请求,获取硬盘详细信息。

// IDE or ATAPI IDENTIFY cmd

int btIDCmd = 0;

SENDCMDINPARAMS InParams;

int nDrive =0;

btIDCmd = (gvopVersionParamsbIDEDeviceMap >> nDrive & 0x10) IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;

// 输出参数

BYTE btIDOutCmd[sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1];

if(DoIdentify(hFile,

&InParams,

(PSENDCMDOUTPARAMS)btIDOutCmd,

(BYTE)btIDCmd,

(BYTE)nDrive, &dwBytesReturned) == FALSE) return -3;

::CloseHandle(hFile);

DWORD dwDiskData[256]; USHORT pIDSector; // 对应结构IDSECTOR,见头文件

pIDSector = (USHORT)((SENDCMDOUTPARAMS)btIDOutCmd)->bBuffer; for(int i=0; i < 256; i++) dwDiskData[i] = pIDSector[i];

// 取系列号

ZeroMemory(szSerialNumber, sizeof(szSerialNumber));

strcpy(szSerialNumber, ConvertToString(dwDiskData, 10, 19));

// 取模型号

ZeroMemory(szModelNumber, sizeof(szModelNumber));

strcpy(szModelNumber, ConvertToString(dwDiskData, 27, 46));

return 0;}

更改本地磁盘的名称方法如下:

1打开桌面图标我的电脑(或者计算机)。

2在d出的窗口,看到本地磁盘的标志,右击图标,选择重命名,然后输入想更改的名称。

3 最后再单击任意一处即可保存更改。

本地磁盘(Local disk)是指安装于同一台计算机主板上,不可随意插拔、移动的磁盘(硬盘),一般包括计算机 *** 作系统所在分区及其他分区。

在Matlab中,可以使用函数diskinfo来查看磁盘的信息,通过该函数可以查看磁盘的颗粒大小、磁盘类型、字节顺序等信息。例如:

disksize = diskinfo('C:\');

disksizeBytesPerSector %查看颗粒大小

JS是没有对应的命令来直接获取这些信息的。

1、如果需要使用JS获取这些信息,可以通过JS释放一个VB文件,通过该脚本间接获取这些信息,不需要直接提取。

2、VB语言中的一些函数可以用于获取这些信息,并储存在特定的地方;JS自带的XML>

3、JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。

4、JavaScript是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言。同时也是一种广泛用于客户端Web开发的脚本语言,常用来给HTML网页添加动态功能,比如响应用户的各种 *** 作。

以上就是关于怎么通过程序获取磁盘指定扇区的数据全部的内容,包括:怎么通过程序获取磁盘指定扇区的数据、VC如何得到磁盘的剩余空间、C++如何获取硬盘的ID求代码!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9615244.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存