`
isiqi
  • 浏览: 16493920 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

一个碎片整理程序的实现

阅读更多

申明: 代码是网上收集的,原则上只供学习使用

//====================================================================<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

//

// Defrag.h

//

// Copyright (C) 1997 Mark Russinovich

//

// Header file for defragmentation demonstration program. This file

// includes definitions for defragmentation File System Control

// commands, as well as the undocumented NtFsControl call.

//

//====================================================================

//--------------------------------------------------------------------

// D E F I N E S

//--------------------------------------------------------------------

//

// File System Control commands related to defragging

//

#define FSCTL_READ_MFT_RECORD 0x90068

#define FSCTL_GET_VOLUME_BITMAP 0x<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="9006" unitname="F">9006F</chmetcnv>

#define FSCTL_GET_RETRIEVAL_POINTERS 0x90073

#define FSCTL_MOVE_FILE 0x90074

//

// return code type

//

typedef UINT NTSTATUS;

//

// Error codes returned by NtFsControlFile (see NTSTATUS.H)

//

#define STATUS_SUCCESS ((NTSTATUS)0x<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="0" unitname="l">00000000L</chmetcnv>)

#define STATUS_BUFFER_OVERFLOW ((NTSTATUS)0x<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="80000005" unitname="l">80000005L</chmetcnv>)

#define STATUS_INVALID_PARAMETER ((NTSTATUS)0xC<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="0" unitname="dl">000000DL</chmetcnv>)

#define STATUS_BUFFER_TOO_SMALL ((NTSTATUS)0xC<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="23" unitname="l">0000023L</chmetcnv>)

#define STATUS_ALREADY_COMMITTED ((NTSTATUS)0xC<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="21" unitname="l">0000021L</chmetcnv>)

#define STATUS_INVALID_DEVICE_REQUEST ((NTSTATUS)0xC<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="10" unitname="l">0000010L</chmetcnv>)

//--------------------------------------------------------------------

// F S C T L S P E C I F I C T Y P E D E F S

//--------------------------------------------------------------------

//

// This is the definition for a VCN/LCN (virtual cluster/logical cluster)

// mapping pair that is returned in the buffer passed to

// FSCTL_GET_RETRIEVAL_POINTERS

//

typedef struct {

ULONGLONG Vcn;

ULONGLONG Lcn;

} MAPPING_PAIR, *PMAPPING_PAIR;

//

// This is the definition for the buffer that FSCTL_GET_RETRIEVAL_POINTERS

// returns. It consists of a header followed by mapping pairs

//

typedef struct {

ULONG NumberOfPairs;

ULONGLONG StartVcn;

MAPPING_PAIR Pair[1];

} GET_RETRIEVAL_DESCRIPTOR, *PGET_RETRIEVAL_DESCRIPTOR;

//

// This is the definition of the buffer that FSCTL_GET_VOLUME_BITMAP

// returns. It consists of a header followed by the actual bitmap data

//

typedef struct {

ULONGLONG StartLcn;

ULONGLONG ClustersToEndOfVol;

BYTE Map[1];

} BITMAP_DESCRIPTOR, *PBITMAP_DESCRIPTOR;

//

// This is the definition for the data structure that is passed in to

// FSCTL_MOVE_FILE

//

typedef struct {

HANDLE FileHandle;

ULONG Reserved;

LARGE_INTEGER StartVcn;

LARGE_INTEGER TargetLcn;

ULONG NumVcns;

ULONG Reserved1;

} MOVEFILE_DESCRIPTOR, *PMOVEFILE_DESCRIPTOR;

//--------------------------------------------------------------------

// N T F S C O N T R O L F I L E D E F I N I T I O N S

//--------------------------------------------------------------------

//

// Prototype for NtFsControlFile and data structures

// used in its definition

//

//

// Io Status block (see NTDDK.H)

//

typedef struct _IO_STATUS_BLOCK {

NTSTATUS Status;

ULONG Information;

} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;

//

// Apc Routine (see NTDDK.H)

//

typedef VOID (*PIO_APC_ROUTINE) (

PVOID ApcContext,

PIO_STATUS_BLOCK IoStatusBlock,

ULONG Reserved

);

//

// The undocumented NtFsControlFile

//

// This function is used to send File System Control (FSCTL)

// commands into file system drivers. Its definition is

// in ntdll.dll (ntdll.lib), a file shipped with the NTDDK.

//

NTSTATUS (__stdcall *NtFsControlFile)(

HANDLE FileHandle,

HANDLE Event, // optional

PIO_APC_ROUTINE ApcRoutine, // optional

PVOID ApcContext, // optional

PIO_STATUS_BLOCK IoStatusBlock,

ULONG FsControlCode,

PVOID InputBuffer, // optional

ULONG InputBufferLength,

PVOID OutputBuffer, // optional

ULONG OutputBufferLength

);

//====================================================================

//

// Defrag.c

//

// Copyright (C) 1997 Mark Russinovich

//

// This program demonstrates the use of NT 4.0 FAT and NTFS cluster

// movement File System Control functions.

//

//====================================================================

#include <windows.h>

#include <stdio.h>

#include <conio.h>

#include "defrag.h"

//--------------------------------------------------------------------

// D E F I N E S

//--------------------------------------------------------------------

//

// Interval at which output is paused (in lines)

//

#define PAUSEINTERVAL 24

//

// Size of the buffer we read file mapping information into.

// The buffer is big enough to hold the 16 bytes that

// come back at the head of the buffer (the number of entries

// and the starting virtual cluster), as well as 512 pairs

// of [virtual cluster, logical cluster] pairs.

//

#define FILEMAPSIZE (512+2)

//

// Size of the bitmap buffer we pass in. Its large enough to

// hold information for the 16-byte header that's returned

// plus the indicated number of bytes, each of which has 8 bits

// (imagine that!)

//

#define BITMAPBYTES 4096

#define BITMAPSIZE (BITMAPBYTES+2*sizeof(ULONGLONG))

//

// Invalid longlong number

//

#define LLINVALID ((ULONGLONG) -1)

//--------------------------------------------------------------------

// G L O B A L S

//--------------------------------------------------------------------

//

// Handle for the raw volume that was opened

//

HANDLE VolumeHandle;

//

// Buffer to read file mapping information into

//

ULONGLONG FileMap[ FILEMAPSIZE ];

//

// Buffer thats passed to bitmap function

//

BYTE BitMap[ BITMAPSIZE ];

//

// Bit shifting array for efficient processing of the bitmap

//

BYTE BitShift[] = { 1, 2, 4, 8, 16, 32, 64, 128 };

//--------------------------------------------------------------------

// F U N C T I O N S

//--------------------------------------------------------------------

//--------------------------------------------------------------------

//

// PrintNtError

//

// Translates an NTDLL error code into its text equivalent. This

// only deals with ones commonly returned by defragmenting FS Control

// commands.

//--------------------------------------------------------------------

void PrintNtError( NTSTATUS Status )

{

<span

分享到:
评论

相关推荐

    磁盘碎片整理程序

    磁盘碎片整理程序是计算机维护中的一个重要工具,主要用于优化硬盘驱动器的性能。在日常使用电脑的过程中,由于频繁的文件创建、删除和修改,硬盘上的数据会变得分散,形成所谓的"磁盘碎片"。这些碎片使得硬盘读写...

    windows磁盘碎片整理程序源代码.zip

    5. **DEFRAG.NCB**:这可能是一个NetBeans项目的配置文件,虽然Windows磁盘碎片整理程序通常由Microsoft开发,但这里可能是第三方开发者使用NetBeans IDE时生成的辅助文件。 6. **DEFRAG.C**:核心源代码文件,实现...

    超小超快的磁盘碎片整理

    而文件“磁盘碎片整理.exe”很可能就是这样的一个高效工具,用户只需下载并运行,即可享受其带来的速度提升。不过,在实际使用中,还应结合其他维护措施,如定期清理无用文件,以保持系统的整体健康和高效。

    磁盘碎片整理(中文版)

    磁盘碎片整理是计算机维护中的一个重要环节,尤其在传统硬盘驱动器(HDD)上更为显著。随着文件的创建、删除和移动,磁盘上的数据会变得分散,形成所谓的"碎片"。这些碎片不仅可能导致系统性能下降,还可能延长文件...

    碎片整理

    通过了解和应用碎片整理,我们可以有效地提升计算机的启动速度,程序加载速度以及整体的系统响应时间,让电脑运行更加流畅。而DefragExpress作为一款优秀的工具,可以帮助我们更便捷地完成这一任务。

    存储卡和RAM碎片整理软件

    碎片整理是提升存储设备性能的一种方法,通过重新组织数据在存储介质上的分布来实现。 首先,我们需要理解什么是碎片。在数字存储系统中,文件可能不连续地存储在磁盘或闪存上,导致存储空间的碎片化。当一个文件被...

    磁盘碎片整理AusLogics Disk Defrag

    AusLogics Disk Defrag是一款专业的磁盘碎片整理软件,相较于Windows操作系统内置的碎片整理工具,其在速度、效果和功能方面具有显著优势。这款软件旨在优化硬盘性能,提高计算机的整体运行速度,通过高效地重组文件...

    磁盘碎片整理

    磁盘碎片整理是计算机维护中的一个重要环节,尤其在传统硬盘(HDD)中更为关键,因为这些设备的数据存储方式导致了文件碎片的问题。碎片是指文件在磁盘上非连续存储,使得读取和写入数据时,磁头需要在不同位置间...

    最快的磁盘碎片整理工具

    磁盘碎片整理是计算机维护中的一个重要环节,它涉及到操作系统对硬盘数据存储的管理方式。在日常使用电脑过程中,由于文件的频繁创建、修改和删除,硬盘上的数据往往会变得分散不连续,形成所谓的“磁盘碎片”。这些...

    绿色硬盘碎片整理工具

    总结来说,这个“绿色硬盘碎片整理工具”是一个便携、高效、易用的磁盘碎片管理软件,适用于希望优化硬盘性能、提高电脑运行速度的用户。其核心功能是查找和整理硬盘碎片,通过优化文件布局来提升磁盘读写速度,从而...

    BAT批处理脚本-磁盘碎片整理.zip

    在Windows的任务计划程序中,创建一个新的任务,指定这个批处理脚本,并设置合适的触发时间,这样就可以定期执行磁盘碎片整理,保持系统的高效运行。 总结,使用BAT批处理脚本进行磁盘碎片整理是一种有效且自动化的...

    磁盘清理和磁盘碎片整理的区别有哪些?.docx

    磁盘碎片整理程序可以将这些碎片重新整理,使得文件连续地保存在磁盘中,从而提高计算机的运行速度。 磁盘清理和磁盘碎片整理的主要区别在于它们的目的和实现方式。磁盘清理的目的是释放磁盘空间,删除不需要的文件...

    Java智能卡EEPROM碎片整理算法.pdf

    本文的贡献在于提出了一个高效的EEPROM碎片整理算法,解决了智能卡中的存储碎片问题,提高了卡片的执行效率。 在实际应用中,Java智能卡EEPROM碎片整理算法可以广泛应用于金融、通信等安全性要求很高的领域,提高...

    Defraggler.rar 磁盘碎片整理工具

    Piriform 公司出品的磁盘碎片整理工具,Defraggler 是一个轻量级的整理工具,但它可以快速高效的整理某个磁盘、文件夹甚至一个文件。也可以对硬盘进行查错,类似 Windows 的 Check Disk 命令。自带一个独立的控制台...

    fDiskDefrag碎片整理

    【标题】"fDiskDefrag碎片整理"是一个与磁盘碎片整理相关的软件工具。在计算机领域,磁盘碎片整理是一个重要的维护任务,它涉及到硬盘驱动器的管理和优化。当文件在硬盘上被频繁创建、修改和删除时,原本连续存储的...

    Smart Defrag(磁盘碎片清理) v6.0.1.116 多国语言版.zip

    不仅整理碎片速度非常快,而且还能够对磁盘的文件系统进行优化,让你的硬盘一直保持最高的运行效率,这样的一款简单实用免费的碎片整理程序绝对是人用户,家庭及小企业用户日常使用计算机、实现磁盘碎片清理功能的好...

    代替windows系统自带的非常快的磁盘整理软件SmartDefrag

    最后,“新云软件.url”可能是一个快捷方式,链接到提供SmartDefrag下载和其他相关软件资源的网站。 总的来说,SmartDefrag是一款高效、免费的磁盘碎片整理工具,它利用ExpressDefrag技术实现快速的碎片整理和文件...

    BAT批处理脚本-垃圾清理清除-系统盘碎片整理.zip

    【标题解析】:“BAT批处理脚本-垃圾清理清除-系统盘碎片整理.zip”这个标题表明,这是一个关于使用批处理脚本来进行系统垃圾清理和磁盘碎片整理的资源包。BAT批处理是Windows操作系统中的一种命令行脚本,用于自动...

Global site tag (gtag.js) - Google Analytics