Leaked source code of windows server 2003
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.
 
 
 
 
 
 

129 lines
3.5 KiB

#include "inspch.h"
#include "diskspac.h"
#include "util2.h"
void AddTempSpace(DWORD dwDownloadSize, DWORD dwExtractSize, DriveInfo drvinfo[])
{
DWORD uTempDrive = 0xffffffff;
char szRoot[5] = { "A:\\" };
BOOL bEnoughSpaceFound = FALSE;
DWORD dwNeededSize;
while ( szRoot[0] <= 'Z' && !bEnoughSpaceFound)
{
UINT uType;
uType = GetDriveType(szRoot);
// even the drive type is OK, verify the drive has valid connection
//
if ( ( ( uType != DRIVE_RAMDISK) && (uType != DRIVE_FIXED) ) ||
( GetFileAttributes( szRoot ) == -1) )
{
szRoot[0]++;
continue;
}
// see if this drive is one of our "special drives" and use our own disk space
BOOL bFoundDrive = FALSE;
for(UINT i = 0; i < 3 && !bFoundDrive ; i++)
{
if(szRoot[0] == drvinfo[i].Drive())
{
bFoundDrive = TRUE;
dwNeededSize = dwDownloadSize * drvinfo[i].CompressFactor() / 10 + dwExtractSize;
if(dwNeededSize < drvinfo[i].Free())
{
uTempDrive = i;
bEnoughSpaceFound = TRUE;
}
}
}
// if !bFoundDrive, this is not a special drive, do old check
if(!bFoundDrive)
{
DWORD dwVolFlags, dwCompressFactor;
if(!GetVolumeInformation(szRoot, NULL, 0, NULL, NULL, &dwVolFlags, NULL, 0))
{
szRoot[0]++;
continue;
}
if(dwVolFlags & FS_VOL_IS_COMPRESSED)
dwCompressFactor = 19;
else
dwCompressFactor = 10;
// Decide how much we need if we extract to this drive
dwNeededSize = dwDownloadSize * dwCompressFactor / 10 + dwExtractSize;;
// if this drive has enough bump Req if appropiate
if(IsEnoughSpace(szRoot, dwNeededSize ))
{
bEnoughSpaceFound = TRUE;
}
}
szRoot[0]++;
}
// ok, if we haven't found enough space anywhere, add it to install drive or win drive
if(!bEnoughSpaceFound)
{
if(drvinfo[1].Drive() != 0)
uTempDrive = 1;
else
uTempDrive = 0;
}
if(uTempDrive != 0xffffffff)
{
drvinfo[uTempDrive].UseSpace(dwDownloadSize, TRUE);
drvinfo[uTempDrive].UseSpace(dwExtractSize, FALSE);
// now free up what we used
drvinfo[uTempDrive].FreeSpace(dwDownloadSize, TRUE);
drvinfo[uTempDrive].FreeSpace(dwExtractSize, FALSE);
}
}
DriveInfo::DriveInfo() : m_dwUsed(0), m_dwMaxUsed(0),
m_dwStart(0xffffffff), m_chDrive(0),
m_uCompressFactor(10)
{
}
void DriveInfo::InitDrive(char chDrive)
{
char szPath[5] = { "?:\\" };
DWORD dwVolFlags = 0;
m_chDrive = chDrive;
szPath[0] = chDrive;
m_dwStart = GetSpace(szPath);
GetVolumeInformation(szPath,NULL,0,NULL,NULL, &dwVolFlags,NULL,0);
if(dwVolFlags & FS_VOL_IS_COMPRESSED)
m_uCompressFactor = 19;
else
m_uCompressFactor = 10;
}
void DriveInfo::UseSpace(DWORD dwAmt, BOOL bCompressed)
{
if(bCompressed)
dwAmt = dwAmt * m_uCompressFactor/10;
m_dwUsed += dwAmt;
if(m_dwUsed > m_dwMaxUsed)
m_dwMaxUsed = m_dwUsed;
}
void DriveInfo::FreeSpace(DWORD dwAmt, BOOL bCompressed)
{
if(bCompressed)
dwAmt = dwAmt * m_uCompressFactor/10;
m_dwUsed -= dwAmt;
}