220 lines
3.7 KiB
C++
220 lines
3.7 KiB
C++
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1991 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
bitfrs.cxx
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module contains the member function definitions for
|
|||
|
the NTFS_BITMAP_FILE class.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Bill McJohn (billmc) 18-June-91
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
ULIB, User Mode
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include <pch.cxx>
|
|||
|
|
|||
|
#define _NTAPI_ULIB_
|
|||
|
#define _UNTFS_MEMBER_
|
|||
|
|
|||
|
#include "ulib.hxx"
|
|||
|
#include "error.hxx"
|
|||
|
#include "untfs.hxx"
|
|||
|
|
|||
|
#include "ntfsbit.hxx"
|
|||
|
#include "drive.hxx"
|
|||
|
#include "attrib.hxx"
|
|||
|
#include "bitfrs.hxx"
|
|||
|
|
|||
|
DEFINE_EXPORTED_CONSTRUCTOR( NTFS_BITMAP_FILE, NTFS_FILE_RECORD_SEGMENT, UNTFS_EXPORT );
|
|||
|
|
|||
|
UNTFS_EXPORT
|
|||
|
NTFS_BITMAP_FILE::~NTFS_BITMAP_FILE(
|
|||
|
)
|
|||
|
{
|
|||
|
Destroy();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
NTFS_BITMAP_FILE::Construct(
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Worker function for the construtor.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
NTFS_BITMAP_FILE::Destroy(
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Clean up an NTFS_BITMAP_FILE object in preparation for
|
|||
|
destruction or reinitialization.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
UNTFS_EXPORT
|
|||
|
BOOLEAN
|
|||
|
NTFS_BITMAP_FILE::Initialize(
|
|||
|
IN OUT PNTFS_MASTER_FILE_TABLE Mft
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This method initializes a Bitmap File object.
|
|||
|
The only special knowledge that it adds to the File Record Segment
|
|||
|
initialization is the location within the Master File Table of the
|
|||
|
Bitmap File.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Mft -- Supplies the volume MasterFile Table.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
TRUE upon successful completion
|
|||
|
|
|||
|
Notes:
|
|||
|
|
|||
|
This class is reinitializable.
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
Destroy();
|
|||
|
|
|||
|
return( NTFS_FILE_RECORD_SEGMENT::Initialize( BIT_MAP_FILE_NUMBER,
|
|||
|
Mft ) );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
NTFS_BITMAP_FILE::Create(
|
|||
|
IN PCSTANDARD_INFORMATION StandardInformation,
|
|||
|
IN OUT PNTFS_BITMAP VolumeBitmap
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This method formats a Bitmap-File File Record
|
|||
|
Segment in memory (without writing it to disk).
|
|||
|
|
|||
|
It creates a DATA attribute to hold the volume bitmap, and
|
|||
|
allocates space on disk for the bitmap. Note that it does
|
|||
|
not write the bitmap.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
StandardInformation -- supplies the standard information for the
|
|||
|
file record segment.
|
|||
|
|
|||
|
VolumeBitmap -- supplies the volume bitmap
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
TRUE upon successful completion.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
NTFS_ATTRIBUTE DataAttribute;
|
|||
|
NTFS_EXTENT_LIST Extents;
|
|||
|
LCN BitmapLcn;
|
|||
|
BIG_INT NumberOfClusters;
|
|||
|
ULONG Size;
|
|||
|
ULONG ClusterSize;
|
|||
|
ULONG ClustersToHoldBitmap;
|
|||
|
|
|||
|
|
|||
|
// Set this object up as a File Record Segment.
|
|||
|
|
|||
|
if( !NTFS_FILE_RECORD_SEGMENT::Create( StandardInformation ) ) {
|
|||
|
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// Determine the number of clusters necessary to hold the bitmap.
|
|||
|
|
|||
|
NumberOfClusters = VolumeBitmap->QuerySize();
|
|||
|
|
|||
|
if( NumberOfClusters.GetHighPart() != 0 ) {
|
|||
|
|
|||
|
DebugAbort( "Bitmap is too big.\n" );
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
Size = NumberOfClusters.GetLowPart()/8;
|
|||
|
|
|||
|
ClusterSize = GetDrive()->QuerySectorSize() * QueryClusterFactor();
|
|||
|
|
|||
|
if( NumberOfClusters.GetLowPart() % (ULONG)8 ) {
|
|||
|
|
|||
|
Size += 1;
|
|||
|
}
|
|||
|
|
|||
|
Size = QuadAlign(Size);
|
|||
|
|
|||
|
ClustersToHoldBitmap = Size/ClusterSize;
|
|||
|
if( Size % ClusterSize ) {
|
|||
|
|
|||
|
ClustersToHoldBitmap++;
|
|||
|
}
|
|||
|
|
|||
|
// Create a zero-length non-resident attribute, and
|
|||
|
// then resize it to the correct size to hold the bitmap.
|
|||
|
//
|
|||
|
if( !Extents.Initialize( 0, 0 ) ||
|
|||
|
!Extents.Resize( ClustersToHoldBitmap, VolumeBitmap ) ||
|
|||
|
!DataAttribute.Initialize( GetDrive(),
|
|||
|
QueryClusterFactor(),
|
|||
|
&Extents,
|
|||
|
Size,
|
|||
|
Size,
|
|||
|
$DATA ) ||
|
|||
|
!DataAttribute.InsertIntoFile( this, VolumeBitmap ) ) {
|
|||
|
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|