`
huangjun_mail
  • 浏览: 116154 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

API读取文件链表&读取文件

阅读更多

 

  1#define _WIN32_WINNT 0x0400
  2#include <windows.h>
  3#include <winioctl.h>
  4//ReadFileLink
  5ULONGLONG *GetFileClusters(
  6                    PCHAR lpFileName,
  7                    ULONG *ClusterSize, 
  8                    ULONG *ClCount,
  9                    ULONG *FileSize 
 10                    )
 11{
 12    HANDLE  hFile;
 13    ULONG   OutSize;
 14    ULONG   Bytes, Cls, CnCount, r;
 15    ULONGLONG *Clusters = NULL;
 16    BOOLEAN Result = FALSE;
 17    LARGE_INTEGER PrevVCN, Lcn;
 18    STARTING_VCN_INPUT_BUFFER  InBuf;
 19    PRETRIEVAL_POINTERS_BUFFER OutBuf;
 20    CHAR          Name[7];
 21 
 22    Name[0= lpSrcName[0];
 23    Name[1= ':';
 24    Name[2= 0;
 25
 26    GetDiskFreeSpace(Name, &SecPerCl, &BtPerSec, NULL, NULL);
 27
 28    ClusterSize = SecPerCl * BtPerSec;
 29
 30    hFile = CreateFile(lpFileName, FILE_READ_ATTRIBUTES,
 31                       FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
 32                       NULL, OPEN_EXISTING, 00);
 33
 34    if (hFile != INVALID_HANDLE_VALUE)
 35    {
 36        *FileSize = GetFileSize(hFile, NULL);
 37
 38        OutSize = sizeof(RETRIEVAL_POINTERS_BUFFER) + (*FileSize / ClusterSize) * sizeof(OutBuf->Extents);
 39
 40        OutBuf = malloc(OutSize);
 41
 42        InBuf.StartingVcn.QuadPart = 0;
 43  
 44        if (DeviceIoControl(hFile, FSCTL_GET_RETRIEVAL_POINTERS, &InBuf, 
 45                            sizeof(InBuf), OutBuf, OutSize, &Bytes, NULL))
 46        {
 47            *ClCount = (*FileSize + ClusterSize - 1/ ClusterSize;
 48
 49            Clusters = malloc(*ClCount * sizeof(ULONGLONG));
 50
 51            PrevVCN = OutBuf->StartingVcn;
 52
 53            for (r = 0, Cls = 0; r < OutBuf->ExtentCount; r++)
 54            {
 55                Lcn = OutBuf->Extents[r].Lcn;
 56
 57                for (CnCount = (ULONG)(OutBuf->Extents[r].NextVcn.QuadPart - PrevVCN.QuadPart);
 58                     CnCount; CnCount--, Cls++, Lcn.QuadPart++) Clusters[Cls] = Lcn.QuadPart;
 59
 60                PrevVCN = OutBuf->Extents[r].NextVcn;
 61            }

 62        }

 63   
 64        free(OutBuf); 
 65
 66        CloseHandle(hFile);
 67    }

 68    return Clusters;
 69}

 70
 71//how do we use the clusters
 72void Read(
 73        PCHAR lpSrcName        
 74        )
 75{
 76    ULONG         ClusterSize, BlockSize;
 77    ULONGLONG    *Clusters;
 78    ULONG         ClCount, FileSize, Bytes;
 79    HANDLE        hDrive, hFile;
 80    ULONG         SecPerCl, BtPerSec, r;
 81    PVOID         Buff;
 82    LARGE_INTEGER Offset;
 83    CHAR          Name[7];
 84    
 85    Clusters = GetFileClusters(lpSrcName, &ClusterSize, &ClCount, &FileSize);
 86
 87    if (Clusters)
 88    {
 89        Name[0= '\\';
 90        Name[1= '\\';
 91        Name[2= '.';
 92        Name[3= '\\';
 93        Name[4= lpSrcName[0];
 94        Name[5= ':';
 95        Name[6= 0;
 96
 97        hDrive = CreateFile(Name, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 00);
 98
 99        if (hDrive != INVALID_HANDLE_VALUE)
100        {
101
102            Buff = malloc(ClusterSize);
103
104            for (r = 0; r < ClCount; r++, FileSize -= BlockSize)
105            {
106                Offset.QuadPart = ClusterSize * Clusters[r];
107
108                SetFilePointer(hDrive, Offset.LowPart, &Offset.HighPart, FILE_BEGIN);
109
110                ReadFile(hDrive, Buff, ClusterSize, &Bytes, NULL);
111
112                BlockSize = FileSize < ClusterSize ? FileSize : ClusterSize;
113
114            }

115
116            free(Buff);
117
118            CloseHandle(hDrive);
119        }

120        free(Clusters);
121    }

122}

123

 

分享到:
评论

相关推荐

    Redis API文档 全称:Remote Dictionary Server 远程字典服务

    和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更...

    C语言实现电子相册文档手册

    * 实现遥控器按键控制来读取链表数据。 * 实现图片的显示。 六、结果分析 * 电子相册实现简单的文件读取、文件单浏览的模块按键控制,以及图片全屏时的按键控制。 * 总共分四个模块,一个是初始化模块、单浏览模式...

    learning-java:遵循www.caveofprogramming.com教程

    建设者静态(和最终) 字符串生成器和字符串格式toString()方法遗产配套介面公共,私人,受保护多态性封装和API文档转换数值上投和下投使用泛型泛型和通配符匿名类使用扫描仪读取文件处理样品多个例外运行时与已...

    VC驿站基础班无KEY高清C++教程下载地址

    ②、文件的读写、何时读取完毕、读取一行数据; ③、文件指针位置的设置; ④、刷新缓存数据到文件; 17、文件的基本操作[Ⅱ] ①、文件的复制[适用于文件夹]; ②、文件的重命名或移动[适用于文件夹]; ③、...

    Windows内核安全与驱动开发光盘源码

    12.4.1 保存在文件外、文件头还是文件尾 263 12.4.2 隐藏文件头的大小 264 12.4.3 隐藏文件头的设置偏移 266 12.4.4 隐藏文件头的读/写偏移 267 12.5 文件加密表 267 12.5.1 何时进行加密操作 267 12.5.2 文件...

    Windows内核安全驱动开发(随书光盘)

    12.4.1 保存在文件外、文件头还是文件尾 263 12.4.2 隐藏文件头的大小 264 12.4.3 隐藏文件头的设置偏移 266 12.4.4 隐藏文件头的读/写偏移 267 12.5 文件加密表 267 12.5.1 何时进行加密操作 267 12.5.2 文件...

    input_dev_handler.png

    输入核心:输入核心提供了注册设备驱动以及事件驱动的API,维护着事件驱动的链表以及设备驱动的链表 设备驱动 对应input_dev 负责实际的设备数据读取,通过input core 将数据传递到事件驱动程序,上报给用户层 事件...

    车辆违章查询系统

    基于unbuntu下的违章查询系统,使用tinyxml读取XML文件数据,存储进结构体中,声明两个Map容器,单号容器Sequence_numMap的键为单号, 值为结构体;声明一个表CarList,暂时存储孙节点,继而将表存入车牌容器再清除...

    20秋学期(1909、2003、2009-)《计算机病毒分析》在线作业.docx

    A:数组 B:结构体 C:链表 D:变量 答案:A 以下哪个选项属于木马()。 A:震网病毒 B:WannaCry C:灰鸽子 D:熊猫烧香 答案:C WinINet API实现了()层的协议。 A:网络层 B:数据链路层 C:应用层 D:传输层 答案:C 单步...

    基于winpcap的嗅探器设计与实现设计说明.doc

    * 数据包捕获模块:创建了新的线程,利用了WinPcap的非回调函数Pcap_next_ex()函数从WinPcap底层驱动的数据缓冲区中读取数据包,并将数据包存储在系统临时文件中,以便于之后的分析。 * 解析和显示模块:负责解析...

    Delphi开发范例宝典目录

    实例197 采用API实现文件拖放 254 实例198 文件比较 255 第6章 操作系统与Windows相关程序 257 6.1 获得磁盘属性 258 实例199 获得硬盘序列号 258 实例200 获取映射驱动器路径 259 实例201 判断驱动器...

    windows驱动开发技术详解-part2

     2.2.4 Native API  2.2.5 系统服务  2.2.6 执行程序组件  2.2.7 驱动程序  2.2.8 内核  2.2.9 硬件抽象层  2.2.10 Windows与微内核  2.3 从应用程序到驱动程序  2.4 小结  第3章 Windows驱动...

    Windows驱动开发技术详解的光盘-part1

     2.2.4 Native API  2.2.5 系统服务  2.2.6 执行程序组件  2.2.7 驱动程序  2.2.8 内核  2.2.9 硬件抽象层  2.2.10 Windows与微内核  2.3 从应用程序到驱动程序  2.4 小结  第3章 Windows驱动...

    java 面试题 总结

    forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。 redirect...

    Java开发技术大全(500个源代码).

    readDataThread.java 读取数据的线程类 demoEnhanceThread.java 使用自己定义的线程类示例 producer_consumer.java 演示生产者-消费者线程 consumer.java 消费者线程 producer.java 生产者线程 common.java ...

    易语言 茶凉专用模块

    模块名称:茶凉专用模块 作者:茶凉 版本:2.0 本模块可以编程更简单...子程序 读内存长整数型, 长整数型, 公开, 从内存中读取长整数型数据,失败返回失败内容 .参数 进程ID, 整数型, , 进程ID .参数 地址, 整数型, , ...

    C++MFC教程

    了解和MFC各个类功能相近的API函数。 3、一定要理解MFC中消息映射的作用。 4、训练自己在编写代码时不使用参考书而是使用Help Online。 5、记住一些常用的消息名称和参数的意义。 6、学会看别人的代码。 7、多看书,...

    reading-notes

    代码401-高级软件开发表中的内容阅读编号读取名称阅读回购阅读1 节点生态系统,TDD,CI / CD 阅读2 表达 阅读3 Express REST API 阅读4 资料建模 阅读5 链表 阅读6 验证 阅读7 承载授权 阅读8 访问控制(ACL) 阅读...

Global site tag (gtag.js) - Google Analytics