Windows物理磁盘扇区读写示例总结

来源:互联网 发布:网络借贷管理办法 编辑:程序博客网 时间:2024/05/29 04:46

Windows物理磁盘扇区读写示例

主要功能:

1. 根据逻辑磁盘盘符获取物理磁盘号;

2. 物理磁盘扇区计算;

3. 物理磁盘扇区读写;


void CPDiskOprateDlg::OnBnClickedButton18(){DWORD ret;CString strMsg;STORAGE_DEVICE_NUMBER deviceInfo;DWORD bytesReturned;HANDLE hDev = INVALID_HANDLE_VALUE,hDev2=INVALID_HANDLE_VALUE;char outbuf[128] = {0};char diskName[32] = {0};__int64 SectorCount;LARGE_INTEGER pointer;DISK_GEOMETRY DiskGeom1;DWORD return_bytes;unsigned char ucWBuff[2048] = {0};unsigned char ucRBuff[2048] = {0};unsigned long writed = 0;unsigned long readed = 0;LONGLONG llRet = 0;hDev = CreateFileA("\\\\.\\g:",GENERIC_WRITE | GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);if(hDev == INVALID_HANDLE_VALUE){return;}//  WIN7及以上系统,在磁盘没有被使用的情况下使用FSCTL_LOCK_VOLUME、FSCTL_UNLOCK_VOLUME,如果磁盘被使用时使用FSCTL_DISMOUNT_VOLUME强制DISMOUNT磁盘// if(!DeviceIoControl(hDev, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &bytesReturned, NULL))// {// ret = GetLastError();// CloseHandle(hDev);// return;// }if(!DeviceIoControl(hDev, FSCTL_DISMOUNT_VOLUME, NULL, 0, NULL, 0, &bytesReturned, NULL)){ret = GetLastError();CloseHandle(hDev);return;}if(!DeviceIoControl(hDev,IOCTL_STORAGE_GET_DEVICE_NUMBER,NULL,0,&deviceInfo,sizeof(deviceInfo),&bytesReturned,NULL)){CloseHandle(hDev);return;}hDev2 = CreateFileA("\\\\.\\PHYSICALDRIVE2",GENERIC_WRITE | GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);if(hDev2 == INVALID_HANDLE_VALUE){CloseHandle(hDev);ret = GetLastError();return;}if(!DeviceIoControl(hDev2,IOCTL_DISK_GET_DRIVE_GEOMETRY,NULL,0,&DiskGeom1,sizeof(DISK_GEOMETRY),&return_bytes,NULL)){ret = GetLastError();CloseHandle(hDev);CloseHandle(hDev2);return;}SectorCount = DiskGeom1.Cylinders.HighPart;SectorCount = ((SectorCount<< 32) & 0xffffffff00000000 ) + DiskGeom1.Cylinders.LowPart;SectorCount = SectorCount * DiskGeom1.BytesPerSector / 512;SectorCount = SectorCount * DiskGeom1.SectorsPerTrack;SectorCount = SectorCount * DiskGeom1.TracksPerCylinder;memset(ucWBuff, 0xff, 2048);llRet = FileSeek(hDev2, (SectorCount-5)*512, FILE_BEGIN);ret = WriteFile(hDev2,ucWBuff,2048,&writed,NULL);if(0 == ret || writed != 2048){ret = GetLastError();CloseHandle(hDev);CloseHandle(hDev2);ret = -1;return;}llRet = FileSeek(hDev2, (SectorCount-5)*512, FILE_BEGIN);ret = ReadFile(hDev2,ucRBuff,2048,&readed,NULL);if(0 == ret || readed != 2048){ret = GetLastError();CloseHandle(hDev);CloseHandle(hDev2);ret = -1;return;}ret = memcmp(ucWBuff, ucRBuff, 2048);if (0 != ret){CloseHandle(hDev);CloseHandle(hDev2);ret = -1;return;}// if(!DeviceIoControl(hDev, FSCTL_UNLOCK_VOLUME, NULL, 0, NULL, 0, &bytesReturned, NULL))// {// ret = GetLastError();// CloseHandle(hDev);// return;// }CloseHandle(hDev);CloseHandle(hDev2);}


原创粉丝点击