windows-nt/Source/XPSP1/NT/base/fs/utils/untfs/src/bitfrs.cxx
2020-09-26 16:20:57 +08:00

220 lines
3.7 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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;
}