/*++

Copyright (c) 1991      Microsoft Corporation

Module Name:

        ifssys.hxx

Abstract:

        This module contains the definition for the IFS_SYSTEM class.
    The IFS_SYSTEM class is an abstract class which offers an
    interface for communicating with the underlying operating system
    on specific IFS issues.

Author:

        Norbert P. Kusters (norbertk) 03-Sep-1991

--*/

#if ! defined( _IFS_SYSTEM_ )

#define _IFS_SYSTEM_

#include "drive.hxx"

#if defined ( _AUTOCHECK_ )
#define IFSUTIL_EXPORT
#elif defined ( _IFSUTIL_MEMBER_ )
#define IFSUTIL_EXPORT    __declspec(dllexport)
#else
#define IFSUTIL_EXPORT    __declspec(dllimport)
#endif


DECLARE_CLASS( CANNED_SECURITY );
DECLARE_CLASS( WSTRING );
DECLARE_CLASS( BIG_INT );
DECLARE_CLASS( IFS_SYSTEM );

class IFS_SYSTEM {

    public:

        STATIC
        IFSUTIL_EXPORT
        BOOLEAN
        QueryNtfsVersion(
            OUT PUCHAR           Major,
            OUT PUCHAR           Minor,
            IN  PLOG_IO_DP_DRIVE Drive,
            IN  PVOID            BootSectorData
            );

        STATIC
        IFSUTIL_EXPORT
        BOOLEAN
        QueryFileSystemName(
            IN  PCWSTRING    NtDriveName,
            OUT PWSTRING     FileSystemName,
            OUT PNTSTATUS    ErrorCode DEFAULT NULL,
            OUT PWSTRING     FileSystemNameAndVersion DEFAULT NULL
            );

        STATIC
        IFSUTIL_EXPORT
        BOOLEAN
        DosDriveNameToNtDriveName(
            IN  PCWSTRING    DosDriveName,
            OUT PWSTRING     NtDriveName
            );

        STATIC
        IFSUTIL_EXPORT
        BOOLEAN
        NtDriveNameToDosDriveName(
            IN  PCWSTRING    NtDriveName,
            OUT PWSTRING     DosDriveName
            );

        STATIC
        IFSUTIL_EXPORT
        BOOLEAN
        QueryFreeDiskSpace(
            IN  PCWSTRING   DosDriveName,
            OUT PBIG_INT    BytesFree
            );

        STATIC
        IFSUTIL_EXPORT
        VOID
        QueryNtfsTime(
            OUT PLARGE_INTEGER NtfsTime
            );

        STATIC
        VOID
        Reboot(
            IN  BOOLEAN PowerOff DEFAULT FALSE
            );

        STATIC
        IFSUTIL_EXPORT
        PCANNED_SECURITY
        GetCannedSecurity(
            );

        STATIC
        IFSUTIL_EXPORT
        BOOLEAN
        EnableFileSystem(
            IN  PCWSTRING    FileSystemName
            );

        STATIC
        IFSUTIL_EXPORT
        BOOLEAN
        IsFileSystemEnabled(
            IN  PCWSTRING    FileSystemName,
            OUT PBOOLEAN            Error DEFAULT   NULL
            );

        STATIC
        IFSUTIL_EXPORT
        ULONG
        QueryPageSize(
            );

        STATIC
        IFSUTIL_EXPORT
        BOOLEAN
        QueryCanonicalNtDriveName(
            IN  PCWSTRING   NtDriveName,
            OUT PWSTRING    CanonicalNtDriveName
            );

        STATIC
        BOOLEAN
        QueryNtSystemDriveName(
            OUT PWSTRING    NtSystemDriveName
            );

        STATIC
        BOOLEAN
        QuerySystemEnvironmentVariableValue(
            IN  PWSTRING    VariableName,
            IN  ULONG       ValueBufferLength,
            OUT PVOID       ValueBuffer,
            OUT PUSHORT     ValueLength
            );

        STATIC
        IFSUTIL_EXPORT
        BOOLEAN
        IsArcSystemPartition(
            IN  PCWSTRING   NtDriveName,
            OUT PBOOLEAN    Error
            );

        STATIC
        BOOLEAN
        IsThisFat(
            IN  BIG_INT Sectors,
            IN  PVOID   BootSectorData
            );

        STATIC
        BOOLEAN
        IsThisFat32(
            IN  BIG_INT Sectors,
            IN  PVOID   BootSectorData
            );

        STATIC
        BOOLEAN
        IsThisHpfs(
            IN  BIG_INT Sectors,
            IN  PVOID   BootSectorData,
            IN  PULONG  SuperBlock,
            IN  PULONG  SpareBlock
            );

        STATIC
        IFSUTIL_EXPORT
        BOOLEAN
        IsThisNtfs(
            IN  BIG_INT Sectors,
            IN  ULONG   SectorSize,
            IN  PVOID   BootSectorData
            );

        STATIC
        IFSUTIL_EXPORT
        BOOLEAN
        FileSetAttributes(
            IN  PCWSTRING FileName,
            IN  ULONG     NewFileAttributes,
            OUT PULONG    OldAttributes
            );

        STATIC
        BOOLEAN
        FileSetAttributes(
            IN  HANDLE  FileHandle,
            IN  ULONG   NewFileAttributes,
            OUT PULONG  OldAttributes
            );

        STATIC
        IFSUTIL_EXPORT
        BOOLEAN
        WriteToFile(
            IN  PCWSTRING   QualifiedFileName,
            IN  PVOID       Data,
            IN  ULONG       DataLength,
            IN  BOOLEAN     Append
            );

        STATIC
        IFSUTIL_EXPORT
        BOOLEAN
        EnableVolumeCompression(
                IN      PCWSTRING       NtDriveName
                );

        STATIC
        IFSUTIL_EXPORT
        BOOLEAN
        EnableVolumeUpgrade(
                IN      PCWSTRING       NtDriveName
                );

        STATIC
        IFSUTIL_EXPORT
        BOOLEAN
        DismountVolume(
                IN      PCWSTRING       NtDriveName
                );

        STATIC
        IFSUTIL_EXPORT
        BOOLEAN
        CheckValidSecurityDescriptor(
            IN ULONG Length,
            IN PISECURITY_DESCRIPTOR SecurityDescriptor
            );

        STATIC
        IFSUTIL_EXPORT
        BOOLEAN
        IsVolumeDirty(
            IN  PWSTRING NtDriveName,
            OUT PBOOLEAN Result
            );

    private:

        STATIC PCANNED_SECURITY _CannedSecurity;

};


#endif // _IFS_SYSTEM_