• 大小: 16KB
    文件类型: .rar
    金币: 2
    下载: 1 次
    发布日期: 2021-06-12
  • 语言: C/C++
  • 标签: NTFS  数据恢复  c++  

资源简介

自己写的NTFS数据恢复的c++类代码,可供学习ntfs参考,能实现数据恢复的功能

资源截图

代码片段和文件信息

#include “stdafx.h“
#include “Winuser.h“
#include “NTFS.h“

//*************************************************类成员函数的实现****************************************************
//*************************************************类成员函数的实现****************************************************
//TODO:实现文件恢复的类
//定义小端数字转换成大端数字
WORD CNTFS_Recovery::DiskNumToRealNum( IN WORD wNeedChange )
{
    WORD wReturn=0 ;

    //截取wNeedChange低8位实际数高8位
    wReturn = wReturn|( 255&wNeedChange );
    wReturn=wReturn<<8;
    wReturn=wNeedChange>>8;
    wReturn = wReturn|( 255&wNeedChange );

    return wReturn ;
}
DWORD CNTFS_Recovery::DiskNumToRealNum(IN  DWORD dwNeedChange )
{
    DWORD dwReturn=0 ;

    //截取wNeedChange低8位实际数高8位
    for ( int i = 0 ; i<3 ; i++ )
    {
        dwReturn = dwReturn|( 255&dwNeedChange );
        dwReturn=dwReturn<<8;
        dwReturn=dwNeedChange>>8;
    }
    dwReturn = dwReturn|( 255&dwNeedChange );
    return dwReturn ;
}
QWORD CNTFS_Recovery::DiskNumToRealNum(IN QWORD qwNeedChange )
{
    QWORD qwReturn=0 ;

    //截取wNeedChange低8位实际数高8位
    for ( int i = 0 ; i<7 ; i++ )
    {
        qwReturn = qwReturn|( 255&qwNeedChange );
        qwReturn=qwReturn<<8;
        qwReturn=qwNeedChange>>8;
    }
    qwReturn = qwReturn|( 255&qwNeedChange );
    return qwReturn ;
}

//实现读取磁盘数据的函数一次性最大可读65535字节
BOOL CNTFS_Recovery::ReadDiskData(IN HANDLE hFile  IN QWORD qwStartByte  IN DWORD qwLength OUT LPVOID lpData )
{
    DWORD dwCB ;

    //将qwStartByteqwLength用512整倍字节长度替代
    DWORD dOffsetBytes = qwStartByte%512;                                       //dOffset为qwStartByte距离qwStartByte所在扇区的偏移地址
    QWORD qwOffsetSectors = qwStartByte/512 ;                                   //dOffsetStartSectors为读取数据的起始扇区
    DWORD dLengthAwayEnd = ( 512 -(qwLength + dOffsetBytes )%512 )%512;         //应读取的数据尾距离本扇区的末尾距离
    LARGE_INTEGER llOffset ;
    llOffset.QuadPart = (QWORD)( qwOffsetSectors*512 );                         //llOffset.QuadPart为实际读取的起始字节位置

    //设置文件句柄位置
    if ( INVALID_SET_FILE_POINTER == SetFilePointer( hFile  llOffset.LowPart  &llOffset.HighPart  FILE_BEGIN ))
    {
        return FALSE ;
    }
    //读取文件数据
    DWORD dLength = ( qwLength + dOffsetBytes + dLengthAwayEnd )>65024 ? 65024 : ( qwLength + dOffsetBytes + dLengthAwayEnd ) ;
 
    CHAR *lpBuffer = (CHAR *)malloc(dLength+1);

    ZeroMemory( lpBuffer  sizeof(lpBuffer) );

    if ( !ReadFile( hFile  lpBuffer dLength  & dwCB  NULL ) )
    {
        return FALSE ;
    }
    memcpy( lpData  lpBuffer+dOffsetBytes  qwLength );

    free(lpBuffer);

    return TRUE ;
}

//实现读取指定驱动器盘的函数
BOOL CNTFS_Recovery::ReadDriverData( IN CHAR *pcDriver IN  QWORD qwStartByte IN DWORD dwLength OUT LPVOID lpData ) 
{
    TCHAR szFilePath[255]={0};

    wsprintf( szFilePath  L“\\\\.\\%s:“  pcDriver );

    //根据路径获取物理磁盘指针
    HANDLE hDevice = CreateFile( szFilePathGENERIC_READ|GENERIC_WRITEFILE_SHARE_RE

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      61773  2012-05-12 19:35  NTFS.cpp

     文件      28336  2012-05-11 16:17  NTFS.h

----------- ---------  ---------- -----  ----

                90109                    2


评论

共有 条评论