Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

457 lines
11 KiB

/*++
Copyright (c) 1993 Microsoft Corporation
Module Name:
Drivesp.c
Abstract:
This module contains support for displaying the Drives dialog.
Author:
Scott B. Suhy (ScottSu) 6/1/93
Environment:
User Mode
--*/
#include "dialogsp.h"
#include "drivesp.h"
#include "msgp.h"
#include "strtabp.h"
#include "winmsdp.h"
#include "printp.h"
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <tchar.h>
//
// Macro to support freeing of NULL pointers.
//
#define Free( p ) \
{ if(p) free(p); }
//
// Object used to pass information around about a logical drive.
//
typedef
struct
_DRIVE_INFO {
DECLARE_SIGNATURE
TCHAR DriveLetter[ 3 ];
UINT DriveType;
LPTSTR RemoteNameBuffer;
DWORD SectorsPerCluster;
DWORD BytesPerSector;
DWORD FreeClusters;
DWORD Clusters;
LPTSTR VolumeNameBuffer;
DWORD VolumeSerialNumber;
DWORD MaximumComponentLength;
DWORD FileSystemFlags;
LPTSTR FileSystemNameBuffer;
BOOL ValidDetails;
} DRIVE_INFO, *LPDRIVE_INFO;
//
// Internal function prototypes.
//
LPDRIVE_INFO
CreateDriveInfo(
IN LPTSTR Drive
);
BOOL
DestroyDriveInfo(
IN LPDRIVE_INFO DriveInfo
);
BOOL
DriveDetailsProc(
LPDRIVE_INFO DriveObject
);
LPDRIVE_INFO
CreateDriveInfo(
IN LPTSTR Drive
)
/*++
Routine Description:
Create a DRIVE_INFO object for the supplied drive.
Arguments:
Drive - Supplies a pointer to a string which is the root directory
of the drive (e.g. c:\).
Return Value:
LPDRIVE_INFO - Returns a pointer to a DRIVE_INFO object with information
about the supplied drive.
--*/
{
UINT OldErrorMode;
LPDRIVE_INFO DriveInfo;
TCHAR FileSystemNameBuffer[ MAX_PATH ];
TCHAR VolumeNameBuffer[ MAX_PATH ];
TCHAR RemoteNameBuffer[ MAX_PATH ];
DWORD SizeOfRemoteNameBuffer;
//
// Allocate a DRIVE_INFO object.
//
DriveInfo = AllocateObject( DRIVE_INFO, 1 );
DbgPointerAssert( DriveInfo );
if( DriveInfo == NULL ) {
return NULL;
}
SetSignature( DriveInfo );
//
// Initialize buffers with empty strings.
//
FileSystemNameBuffer[ 0 ] = TEXT( '\0' );
VolumeNameBuffer[ 0 ] = TEXT( '\0' );
RemoteNameBuffer[ 0 ] = TEXT( '\0' );
//
// Remember the drive letter.
//
DriveInfo->DriveLetter[ 0 ] = Drive[ 0 ];
DriveInfo->DriveLetter[ 1 ] = Drive[ 1 ];
DriveInfo->DriveLetter[ 2 ] = TEXT( '\0' );
//
// Get the type of this drive.
//
DriveInfo->DriveType = GetDriveType( Drive );
//
// If this is a network drive, get the share its connected to.
//
if( DriveInfo->DriveType == DRIVE_REMOTE ) {
DWORD WNetError;
//
// WinNet APIs want the drive name w/o a trailing slash so use the
// DriveLetter field in the DRIVE_INFO object.
//
SizeOfRemoteNameBuffer = sizeof( RemoteNameBuffer );
WNetError = WNetGetConnection(
DriveInfo->DriveLetter,
RemoteNameBuffer,
&SizeOfRemoteNameBuffer
);
DbgAssert( ( WNetError == NO_ERROR )
|| ( WNetError == ERROR_VC_DISCONNECTED ));
DriveInfo->RemoteNameBuffer = _tcsdup( RemoteNameBuffer );
DbgPointerAssert( DriveInfo->RemoteNameBuffer );
}
//
// Disable pop-ups (especially if there is no media in the
// removable drives.)
//
OldErrorMode = SetErrorMode( SEM_FAILCRITICALERRORS );
//
// Get the space statistics for this drive.
//
DriveInfo->ValidDetails = GetDiskFreeSpace(
Drive,
&DriveInfo->SectorsPerCluster,
&DriveInfo->BytesPerSector,
&DriveInfo->FreeClusters,
&DriveInfo->Clusters
);
if( DriveInfo->ValidDetails == FALSE ) {
return DriveInfo;
}
//
// Get information about the volume for this drive.
//
DriveInfo->ValidDetails = GetVolumeInformation(
Drive,
VolumeNameBuffer,
sizeof( VolumeNameBuffer ),
&DriveInfo->VolumeSerialNumber,
&DriveInfo->MaximumComponentLength,
&DriveInfo->FileSystemFlags,
FileSystemNameBuffer,
sizeof( FileSystemNameBuffer )
);
//
// Reenable pop-ups.
//
SetErrorMode( OldErrorMode );
//
// If no error occurred, make dynamic copies of the volume,
// and file system name buffers.
//
if( DriveInfo->ValidDetails == TRUE ) {
DriveInfo->VolumeNameBuffer = _tcsdup( VolumeNameBuffer );
DbgPointerAssert( DriveInfo->VolumeNameBuffer );
DriveInfo->FileSystemNameBuffer = _tcsdup( FileSystemNameBuffer );
DbgPointerAssert( DriveInfo->FileSystemNameBuffer );
}
return DriveInfo;
}
BOOL
DestroyDriveInfo(
IN LPDRIVE_INFO DriveInfo
)
/*++
Routine Description:
Destroys a DRIVE_INFO object by deleting it and all resources associated
with it.
Arguments:
LPDRIVE_INFO - Supplies a pointer to a DRIVE_INFO object.
Return Value:
BOOL - Returns TRUE if the DRIVE_OBJECT is succesfully destroyed
--*/
{
BOOL Success;
//
// 'free' the '_tcsdup'ed strings.
//
Free( DriveInfo->RemoteNameBuffer );
Free( DriveInfo->VolumeNameBuffer );
Free( DriveInfo->FileSystemNameBuffer );
//
// Delete the DRIVE_INFO object itself.
//
Success = FreeObject( DriveInfo );
return TRUE;
}
BOOL
DrivesProc()
/*++
Routine Description:
DrivesProc supports the display of the drives dialog which displays
information about logical drives, including type, and connection of a
remote drive.
Arguments:
None
Return Value:
BOOL - Depending on input message and processing options.
--*/
{
BOOL Success;
TCHAR LogicalDrives[ MAX_PATH ];
LPTSTR Drive;
DWORD Chars;
DWORD Widths[ ] = {
5,
( DWORD ) -1
};
//
// Retrieve the logical drive strings from the system.
//
Chars = GetLogicalDriveStrings(
sizeof( LogicalDrives ),
LogicalDrives
);
Drive = LogicalDrives;
//
// For each logical drive, create a DRIVE_INFO object and display
// its name and type.
//
while( *Drive ) {
LPDRIVE_INFO DriveInfo;
//
// Create a DRIVE_INFO object for the current drive.
//
DriveInfo = CreateDriveInfo( Drive );
if( DriveInfo == NULL ) {
return FALSE;
}
DriveDetailsProc(DriveInfo);
//
// Examine the next logical drive.
//
Drive += _tcslen( Drive ) + 1;
DestroyDriveInfo(DriveInfo);
}//end while
return TRUE;
}
BOOL
DriveDetailsProc(LPDRIVE_INFO DriveObject )
/*++
Routine Description:
DriveDetailsProc supports the display of the drives detail dialog which
displays information about a logical drive, including, label, serial number,
file system information and a host of space statistics.
Arguments:
Return Value:
BOOL - Depending on input message and processing options.
--*/
{
BOOL Success;
INT i;
TCHAR TitleBuffer[ MAX_PATH ];
LPDRIVE_INFO DriveInfo;
VALUE_ID_MAP FSFlags[ ] = {
FS_CASE_IS_PRESERVED, IDC_TEXT_CASE_IS_PRESERVED,
FS_CASE_SENSITIVE, IDC_TEXT_CASE_SENSITIVE,
FS_UNICODE_STORED_ON_DISK, IDC_TEXT_UNICODE_STORED_ON_DISK
};
//
// Retrieve and validate the DRIVE_INFO object.
//
DriveInfo = ( LPDRIVE_INFO ) DriveObject;
//
// If the drive is remote, display its connection name in the title.
//
if( DriveInfo->DriveType == DRIVE_REMOTE ) {
PrintToFile((LPCTSTR)DriveInfo->DriveLetter,IDC_REMOTE_DRIVE_TITLE,TRUE);
PrintToFile((LPCTSTR)DriveInfo->RemoteNameBuffer,IDC_REMOTE_DRIVE_TITLE,TRUE);
PrintToFile((LPCTSTR)DriveInfo->VolumeNameBuffer,IDC_REMOTE_DRIVE_TITLE,TRUE);
PrintToFile((LPCTSTR)FormatBigInteger(HIWORD (DriveInfo->VolumeSerialNumber),FALSE),IDC_REMOTE_DRIVE_TITLE,TRUE);
PrintToFile((LPCTSTR)FormatBigInteger(LOWORD (DriveInfo->VolumeSerialNumber),FALSE),IDC_REMOTE_DRIVE_TITLE,TRUE);
} else {
PrintToFile((LPCTSTR)DriveInfo->DriveLetter,IDC_DRIVE_TITLE,TRUE);
PrintToFile((LPCTSTR)DriveInfo->VolumeNameBuffer,IDC_DRIVE_TITLE,TRUE);
PrintHexToFile(HIWORD (DriveInfo->VolumeSerialNumber),IDC_VOLUME_SN_TITLE);
PrintHexToFile(LOWORD (DriveInfo->VolumeSerialNumber),IDC_VOLUME_SN_TITLE);
}
PrintToFile((LPCTSTR)FormatBigInteger(DriveInfo->SectorsPerCluster,FALSE),IDC_EDIT_SECTORS_PER_CLUSTER,TRUE);
PrintToFile((LPCTSTR)FormatBigInteger(DriveInfo->BytesPerSector,FALSE),IDC_EDIT_BYTES_PER_SECTOR,TRUE);
PrintToFile((LPCTSTR)FormatBigInteger(DriveInfo->FreeClusters,FALSE),IDC_EDIT_FREE_CLUSTERS,TRUE);
PrintToFile((LPCTSTR)FormatBigInteger(DriveInfo->Clusters - DriveInfo->FreeClusters,FALSE),IDC_EDIT_USED_CLUSTERS,TRUE);
PrintToFile((LPCTSTR)FormatBigInteger(DriveInfo->Clusters,FALSE),IDC_EDIT_TOTAL_CLUSTERS,TRUE);
PrintToFile((LPCTSTR)FormatBigInteger(DriveInfo->FreeClusters * DriveInfo->SectorsPerCluster * DriveInfo->BytesPerSector,FALSE),IDC_EDIT_FREE_SPACE,TRUE);
PrintToFile((LPCTSTR)FormatBigInteger((DriveInfo->Clusters - DriveInfo->FreeClusters ) * DriveInfo->SectorsPerCluster * DriveInfo->BytesPerSector,FALSE),IDC_EDIT_USED_SPACE,TRUE);
PrintToFile((LPCTSTR)FormatBigInteger(DriveInfo->Clusters * DriveInfo->SectorsPerCluster * DriveInfo->BytesPerSector,FALSE),IDC_EDIT_TOTAL_SPACE,TRUE);
//
// Display the file system information.
//
PrintToFile((LPCTSTR)DriveInfo->FileSystemNameBuffer,IDC_EDIT_FS_NAME,TRUE);
PrintToFile((LPCTSTR)FormatBigInteger(DriveInfo->MaximumComponentLength,FALSE),IDC_EDIT_FS_MAX_COMPONENT,TRUE);
PrintToFile((LPCTSTR)TEXT("\n"),IDC_SPACE,TRUE);
return TRUE;
}