zoukankan      html  css  js  c++  java
  • windows下读取磁盘扇区数据

       在Windows下,磁盘可以看做是一个文件,其文件名为\\.\PhysicalDriveX其中X表示磁盘的编号,例如\\.\PhysicalDrive0表示的是第0号磁盘,如果需要读取一个磁盘只需要通过对应的文件名称获取到磁盘的句柄,然后通过函数ReadFile读取即可,下面是相关的代码。

      

    //通过给定磁盘的编号,获取到磁盘的句柄
    HANDLE GetDiskHandle(int iDiskNo)
    {
     char szDriverBuffer[128];
     memset(szDriverBuffer,0,128);
     //格式化设备文件名称
     sprintf_s(szDriverBuffer,"\\.\PhysicalDrive%d",iDiskNo);
     HANDLE m_hDevice = NULL;
     //CreateFile获取到设备句柄
     m_hDevice = CreateFileA(
     szDriverBuffer,// 设备名称,这里指第一块硬盘,多个硬盘的自己修改就好了
     GENERIC_READ, // 指定读访问方式
     FILE_SHARE_READ | FILE_SHARE_WRITE, // 共享模式为读|写,0表示不能共享
     NULL, // NULL表示该句柄不能被子程序继承
     OPEN_EXISTING, // 打开已经存在的文件,文件不存在则函数调用失败
     NULL, // 指定文件属性
     NULL);
     if (m_hDevice==INVALID_HANDLE_VALUE){
     m_hDevice = NULL;
     //无效
     return INVALID_HANDLE_VALUE;
     }
     //设备句柄
     return m_hDevice;
    }
     
    //通过磁盘的句柄,给定读取的位置,获取到扇区512字节数据返回
    //readpos:扇区的逻辑地址
    //lpOutBuffer512:用于返回读取的数据
    BOOL ReadSectorData( HANDLE& hDevice,UINT64 redpos,__out char * lpOutBuffer512 )
    {
     memset(lpOutBuffer512,0,512);
     LARGE_INTEGER li;
     li.QuadPart = redpos*0x200;//0x200 = 512,求出扇区的 字节地址,通过设置读取的地址和长度进行read
     SetFilePointer(hDevice,li.LowPart,&li.HighPart,FILE_BEGIN);
     DWORD DCount=0; //计数
     BOOL bResult=ReadFile(hDevice, lpOutBuffer512,512, &DCount, NULL);
     return bResult;
    }
    通过上面的操作可以获取到磁盘指定扇区的512字节数据。
  • 相关阅读:
    <<Rust程序设计语言>>个人版(4: 所有权)
    《逻辑学入门》笔记(45-66)
    《逻辑学入门》笔记(23-44)
    <<Rust程序设计语言>>个人版(3.3: 函数/3.4: 注释/3.5: 控制流)
    <<Rust程序设计语言>>个人版(1: 入门/2: 编写猜谜游戏)
    网站如何保护用户的密码
    在 Gin 项目中使用 WebSocket
    《逻辑学入门》笔记(1-22)
    浅谈双重认证逻辑
    某大型网络安全活动中遇到的钓鱼邮件
  • 原文地址:https://www.cnblogs.com/wangccc/p/5372575.html
Copyright © 2011-2022 走看看