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);}
阅读全文
0 0
- Windows物理磁盘扇区读写示例总结
- windows NT/2000读写物理,逻辑磁盘扇区
- 直接读写磁盘扇区
- linux 读写磁盘扇区
- 不同WINDOWS平台下磁盘逻辑扇区的直接读写
- 不同WINDOWS平台下磁盘逻辑扇区的直接读写
- 不同WINDOWS平台下磁盘逻辑扇区的直接读写
- win7的磁盘扇区读写。。。。。。。。。。。。。
- linux 下得到磁盘物理扇区大小
- WinCE下的物理扇区读写
- VC、Linux、vxWorks读写物理扇区小结
- VC、Linux、vxWorks读写物理扇区小结
- [Win32] 直接读写磁盘扇区(磁盘绝对读写)
- [Win32] 直接读写磁盘扇区(磁盘绝对读写)
- Win2000下直接读写磁盘扇区
- Win2000下直接读写磁盘扇区
- VC++实现Win200直接读写磁盘扇区
- WinNT平台下直接读写磁盘扇区
- URAL1947 Meander 思路
- 关于android中的两大布局LinearLayout、RelativeLayout
- Tensorflow 读取Txt和Csv格式数据
- 130. Surrounded Regions
- 238. Product of Array Except Self
- Windows物理磁盘扇区读写示例总结
- 数据结构12————二叉树的遍历和建立
- 序列有关BIF
- Hdoj 5702 Solving Order
- 为什么C++11引入了std::ref?
- Java知识点复习系列(5)
- 区块链技术的应用场景与常见疑问
- 740. Delete and Earn
- python 中TCP协议