移动数据例程

该博客介绍了一个用于处理移动数据的系统,包括获取卷映射位图、分析文件分配和移动文件。BitMap类用于处理卷映射,通过DeviceIoControl获取卷的位图信息并展示自由空间列表。 MovFle类负责分析文件的分配情况,通过FSCTL_GET_RETRIEVAL_POINTERS获取文件的VCN和LCN,并进行文件移动操作。VolTdy类初始化卷,获取卷的自由空间位图,遍历卷上的所有文件进行分析和迁移。
摘要由CSDN通过智能技术生成
#ifndef BITMAP_H
#define BITMAP_H

#define _WIN32_WINNT 0x600

#include "windows.h"
#include "winioctl.h"
#include <vector>
#include <map>
using namespace std;

class BitMap
{
public:
    void getMapList(const VOLUME_BITMAP_BUFFER *pInBuff);
    void dispalyMapListOfFree() const;
    void showVecOfBit() const;
    const map<ULONGLONG, ULONGLONG> & returnMaplist() const;
    const vector<bool> & returnBitVec() const;
private:
    map<ULONGLONG, ULONGLONG> mapListOfFree;
    vector<bool> vecOfBit;
};

#endif


================================ ================

#include "bitmap.h"
#include <iostream>
#include <bitset>
#include <fstream>

void BitMap::getMapList(const VOLUME_BITMAP_BUFFER *pInBuff)
{
    ULONGLONG count_size = 0;
    ULONGLONG size_clusterarray = (pInBuff -> BitmapSize.QuadPart + 7) / 8;
    while (count_size != size_clusterarray)
    {
        bitset<8> bit(*(pInBuff -> Buffer + count_size));
        for (int i = 0; i != 8; ++i)
        {
            vecOfBit.push_back(bit[i]);
        }
        count_size++;
    }
    if (vecOfBit.size() != pInBuff -> BitmapSize.QuadPart)
    {
        ULONGLONG popnum = vecOfBit.size() - pInBuff -> BitmapSize.QuadPart;
        for (ULONGLONG i = 0; i < popnum; ++i)
        {
            vecOfBit.pop_back();
        }
    }

    ULONGLONG add = 0;
    ULONGLONG size = 0;
    for (ULONGLONG i = 0; i < vecOfBit.size();)
    {
        size = 0;
        if (vecOfBit[i] == 0)
        {
            add = i;
            ULONGLONG idx = i;
            while ((idx < vecOfBit.size()) && !vecOfBit[idx]) //
            {
                size ++;
                idx++;
            }
            i += size;
            mapListOfFree.insert(make_pair(add, size));
        }
        else
        {
            i++;
            continue;
        }
    }
}

void BitMap::showVecOfBit() const
{
    fstream vecbit("bitmap.txt", ios_base::out);
    if (!vecbit) return;
    for (ULONGLONG i = 0; i < vecOfBit.size(); ++i)
    {
        if (i % 32 == 0)
        {
            vecbit << endl;
        }
        vecbit << (DWORD)vecOfBit[i] << " ";
    }
    vecbit.close();
}

void BitMap::dispalyMapListOfFree() const
{
    cout << "Free Space List <start cluster number, free space size>" << endl;
    for (map<ULONGLONG, ULONGLONG>::const_iterator cit = mapListOfFree.begin(); cit != mapListOfFree.end(); ++cit)
    {
        cout << "address: " << ULONG((*cit).first) << "/tsize: " << ULONG((*cit).second) << endl;
    }
}

const map<ULONGLONG, ULONGLONG>&  BitMap::returnMaplist() const
{
    return mapListOfFree;
}

const vector<bool>& BitMap::returnBitVec() const
{
    return vecOfBit;
}


=================================================

#ifndef MOVFLE_H
#define NOVFLE_H

#include <string>
#include <map>
using namespace std;
#define _WIN32_WINNT 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值