Files

786 lines
22 KiB
Plaintext

' // ***************************************************************************
' //
' // Copyright (c) Microsoft Corporation. All rights reserved.
' //
' // Microsoft Deployment Toolkit Solution Accelerator
' //
' // File: ZTIDiskUtility.vbs
' //
' // Version: 6.3.8456.1000
' //
' // Purpose: Utility functions for disk operations
' //
' // Usage: <script language="VBScript" src="ZTIDiskUtility.vbs"/>
' //
' // ***************************************************************************
Option Explicit
Const ZTIDiskPart_Script = "4acfedd2-f865-4b32-b8dd-8e7841b235c5"
Class ZTIDisk ' VBSCript Wrapper Class around the WMI Win32_DiskDrive class
Private g_Win32_DiskDrive
Property Let Disk ( iDisk )
Dim oDisk
TestAndFail isNumeric(iDisk), 7801, "Verify iDisk index is numeric: " & iDisk
If iDisk <> Disk or isempty(Disk) then
g_Win32_DiskDrive = empty
For Each oDisk in objWMI.ExecQuery( "SELECT * FROM Win32_DiskDrive WHERE Index=" & iDisk )
oLogging.CreateEntry "New ZTIDisk : " & oDisk.Path_ ,LogTypeInfo
set g_Win32_DiskDrive = oDisk
Exit Property
next
End if
End property
Property Set Disk ( oDisk )
TestAndFail isobject(oDisk), 7802, "Verify oDisk index is an object. " & varType(oDisk)
TestAndFail ucase(oDisk.CreationClassName) = "WIN32_DISKDRIVE", 7803, "Verify Disk is correct WMI Object." & oDisk.Path_
oLogging.CreateEntry "New ZTIDisk : " & oDisk.Path_ ,LogTypeInfo
set g_Win32_DiskDrive = oDisk
End Property
Function GetPartitionCount
If not isempty(g_Win32_DiskDrive) then GetPartitionCount = g_Win32_DiskDrive.Partitions
End function
Function GetPartitions
If not isempty(g_Win32_DiskDrive) then
set GetPartitions = objWMI.ExecQuery( "SELECT * FROM Win32_DiskPartition WHERE DiskIndex=" & Disk )
oLogging.CreateEntry "GetPartitions: " & GetPartitions.Count ,LogTypeInfo
End if
End function
Function GetDiskPartition( iPartition )
set GetDiskPartition = new ZTIDiskPartition
GetDiskPartition.SetDiskPart Disk,iPartition
End function
Function isOSReady( sOSBuild )
' Check to see if this disk is "capiable" of installing an OS
Dim oUSBDevice
Dim oUSBController
Dim oUSBPnPEnum
Dim sPnPID
If not isempty(g_Win32_DiskDrive) then
isOSReady = g_Win32_DiskDrive.InterfaceType <> "USB" and g_Win32_DiskDrive.InterfaceType <> "1394"
If not isOSReady Then
Exit Function
End if
oUtility.GetMajorMinorVersion(sOSBuild)
If len(trim(sOSBuild)) = 0 then
' Do nothing, OS Version not specified.
Elseif oUtility.VersionMajor > 6 then
For Each oUSBDevice in objWMI.ExecQuery("ASSOCIATORS OF {" & g_Win32_DiskDrive.Path_ & "} WHERE AssocClass = Win32_PnPDevice")
For Each oUSBController in objWMI.ExecQuery("ASSOCIATORS OF {" & oUSBDevice.Path_ & "} WHERE AssocClass = Win32_USBControllerDevice")
For Each oUSBPnPEnum in objWMI.ExecQuery("ASSOCIATORS OF {" & oUSBController.Path_ & "} WHERE AssocClass = Win32_PnPDevice")
For Each sPnPID in oUSBPnPEnum.CompatibleID
If sPnPID = "PCI\\CC_0C0330" then
oLogging.CreateEntry "Found USB 3.0 Ready Disk: " & g_Win32_DiskDrive.Path_ ,LogTypeInfo
isOSReady = True ' USB 3.0
Exit Function
End if
Next
Next
Next
Next
End if
End if
End function
Property Get Disk
If not isempty(g_Win32_DiskDrive) then Disk = cint(g_Win32_DiskDrive.Index)
End Property
Function IsRemovable
Dim cap
IsRemovable = False
If not isempty(g_Win32_DiskDrive) then
For each Cap in g_Win32_DiskDrive.Capabilities
If Cap = 7 then
IsRemovable = True
End if
next
End if
End Function
Function SizeAsString
If not isempty(g_Win32_DiskDrive) then SizeAsString = FormatLargeSize(g_Win32_DiskDrive.Size)
End function
Function oWMI
If not isempty(g_Win32_DiskDrive) then set oWMI = g_Win32_DiskDrive
End Function
' // instance of Win32_DiskDrive
' // {
' // BytesPerSector = 512;
' // Capabilities = {3, 4};
' // CapabilityDescriptions = {"Random Access", "Supports Writing"};
' // Caption = "XXXXXXXXX";
' // ConfigManagerErrorCode = 0;
' // ConfigManagerUserConfig = FALSE;
' // CreationClassName = "Win32_DiskDrive";
' // Description = "Disk drive";
' // DeviceID = "\\\\.\\PHYSICALDRIVE1";
' // FirmwareRevision = "0002";
' // Index = 1;
' // InterfaceType = "IDE";
' // Manufacturer = "(Standard disk drives)";
' // MediaLoaded = TRUE;
' // MediaType = "Fixed hard disk media";
' // Model = "XXXXXXXXX";
' // Name = "\\\\.\\PHYSICALDRIVE1";
' // Partitions = 1;
' // PNPDeviceID = "IDE\\XXXXXXXXX....";
' // SCSIBus = 0;
' // SCSILogicalUnit = 0;
' // SCSIPort = 0;
' // SCSITargetId = 1;
' // SectorsPerTrack = 63;
' // SerialNumber = "XXXXXXXXX";
' // Signature = 1234567890;
' // Size = "500105249280";
' // Status = "OK";
' // SystemCreationClassName = "Win32_ComputerSystem";
' // SystemName = "PICKETTK";
' // TotalCylinders = "60801";
' // TotalHeads = 255;
' // TotalSectors = "976768065";
' // TotalTracks = "15504255";
' // TracksPerCylinder = 255;
' // };
End Class
Class ZTIDiskPartition ' VBSCript Wrapper Class around the WMI Win32_DiskPartition class
Private g_Win32_DiskPartition
Private g_Win32_LogicalDisk
Private Function GetLogicalDiskToPartition ( oDiskType1 )
Dim oDisk
TestAndFail not isEmpty(oDiskType1), 7804, "Verify First object is set."
For Each oDisk in objWMI.ExecQuery("ASSOCIATORS OF {" & oDiskType1.Path_ & "} WHERE AssocClass = Win32_LogicalDiskToPartition")
set GetLogicalDiskToPartition = oDisk
oLogging.CreateEntry "New ZTIDiskPartition : " & oDiskType1.Path_ & " " & oDisk.Path_ , LogTypeInfo
Exit Function
Next
set GetLogicalDiskToPartition = nothing
End function
Property Let Drive ( sDrive )
Dim oLogicalDisk
Dim oDiskPart
If Drive <> left(sDrive,1) & ":" then
g_Win32_LogicalDisk = empty
g_Win32_DiskPartition = empty
For Each oLogicalDisk in objWMI.ExecQuery( "SELECT * FROM Win32_LogicalDisk WHERE DeviceId ='" & left(sDrive,1) & ":" & "'" )
set g_Win32_LogicalDisk = oLogicalDisk
set g_Win32_DiskPartition = GetLogicalDiskToPartition (g_Win32_LogicalDisk)
Exit Property
next
End if
End Property
Property Set Drive ( oDrive )
TestAndFail isobject(oDrive), 7805, "Verify oDisk index is an object. " & varType(oDisk)
TestAndFail ucase(oDrive.CreationClassName) = "WIN32_LOGICALDISK", 7806, "Verify Drive is correct WMI Object." & oDrive.Path_
set g_Win32_LogicalDisk = oDrive
set g_Win32_DiskPartition = GetLogicalDiskToPartition (g_Win32_LogicalDisk)
End Property
Property Get Drive
If IsValidObject(g_Win32_LogicalDisk) Then Drive = g_Win32_LogicalDisk.DeviceID
End Property
Property Get oWMIDrive( bForceMount )
Dim i
' It is possible that the partition is *not* assigned a drive letter.
If bForceMount and not IsValidObject(g_Win32_LogicalDisk) then
If IsValidObject(g_Win32_DiskPartition) Then
RunDiskPartSilent array("Select Disk " & Disk, "Select Partition " & Partition, "Assign", "Exit")
i = 1
While i < 120 and not IsValidObject(g_Win32_LogicalDisk)
oUtility.SafeSleep 500
set g_Win32_LogicalDisk = GetLogicalDiskToPartition (g_Win32_DiskPartition)
i = i + 1
WEnd
End if
TestAndFail not isempty(g_Win32_LogicalDisk), 7807, "Verify Disk has been mapped."
End if
If not isempty(g_Win32_LogicalDisk) then
set oWMIDrive = g_Win32_LogicalDisk
Else
set oWMIDrive = nothing
End if
End Property
Function SetDiskPart( iDisk, iPartition )
Dim oLogicalDisk
Dim oDiskPart
If iDisk <> Disk or iPartition <> Partition then
g_Win32_LogicalDisk = empty
g_Win32_DiskPartition = empty
For Each oDiskPart in objWMI.ExecQuery( "SELECT * FROM Win32_DiskPartition WHERE DiskIndex=" & iDisk & " and Index=" & ( iPartition - 1 ) )
set g_Win32_DiskPartition = oDiskPart
set g_Win32_LogicalDisk = GetLogicalDiskToPartition (g_Win32_DiskPartition)
Exit Function
next
End if
End function
Property Set DiskPart ( oDisk )
TestAndFail isobject(oDisk), 7808, "Verify oDisk index is an object. " & varType(oDisk)
TestAndFail ucase(oDisk.CreationClassName) = "WIN32_DISKPARTITION", 7809, "Verify DiskPart is correct WMI Object." & oDisk.Path_
set g_Win32_DiskPartition = oDisk
set g_Win32_LogicalDisk = GetLogicalDiskToPartition (g_Win32_DiskPartition)
End Property
Property Get oWMIDiskPart
If IsValidObject(g_Win32_DiskPartition) then
set oWMIDiskPart = g_Win32_DiskPartition
End if
End Property
Property Get Disk
If IsValidObject(g_Win32_DiskPartition) Then
Disk = cint(g_Win32_DiskPartition.DiskIndex)
End if
End Property
Property Get Partition
If IsValidObject(g_Win32_DiskPartition) Then
Partition = cint(g_Win32_DiskPartition.Index) + 1
End if
End Property
Function GetDiskObject
set GetDiskObject = new ZTIDisk
GetDiskObject.Disk = Disk
End function
Function isOSReady( sOSBuild, osFlags )
If IsValidObject(g_Win32_DiskPartition) Then
isOSReady = g_Win32_DiskPartition.Size / 1000 / 1000 >= GetMinimumDiskPartitionSizeMB
End if
End function
' Rule: It is possible for a Win32_DiskPartition Object to *not* have an associated win32_LogicalDisk object
' Rule: It is possible for a win32_LogicalDisk Object to *not* have an associated Win32_DiskPartition object
'instance of Win32_DiskPartition
'{
' BlockSize = "512";
' Bootable = FALSE;
' BootPartition = FALSE;
' Caption = "Disk #1, Partition #0";
' Description = "Installable File System";
' DeviceID = "Disk #1, Partition #0";
' DiskIndex = 1;
' Index = 0;
' Name = "Disk #1, Partition #0";
' NumberOfBlocks = "976766976";
' PrimaryPartition = TRUE;
' Size = "500104691712";
' StartingOffset = "1048576";
' Type = "Installable File System";
'};
'instance of Win32_LogicalDisk
'{
' Access = 0;
' Caption = "C:";
' Compressed = FALSE;
' Description = "Local Fixed Disk";
' DeviceID = "C:";
' DriveType = 3;
' FileSystem = "NTFS";
' FreeSpace = "6641623040";
' MediaType = 12;
' Size = "79698063360";
' SupportsDiskQuotas = FALSE;
' SupportsFileBasedCompression = TRUE;
' VolumeName = "OSDisk";
' VolumeSerialNumber = "XXXXXXXXX";
'};
End class
' -------------------------------------------------------------------------------------------------
'
' Wrapper routines for objects above, they all return WMI objects
'
Function AllDiskDrivesEx( sSelectionCriteria )
set AllDiskDrivesEx = objWMI.ExecQuery( "SELECT * FROM Win32_DiskDrive " & sSelectionCriteria )
End Function
Function AllDiskDrives
set AllDiskDrives = AllDiskDrivesEx(empty)
End Function
Function AllDiskPartEx ( sSelectionCriteria )
set AllDiskPartEx = objWMI.ExecQuery( "SELECT * FROM Win32_DiskPartition " & sSelectionCriteria )
End function
Function AllDiskPart
set AllDiskPart = AllDiskPartEx(empty)
End Function
Function AllLogicalDrivesEx ( sSelectionCriteria )
set AllLogicalDrivesEx = objWMI.ExecQuery( "SELECT * FROM Win32_LogicalDisk " & sSelectionCriteria )
End function
Function AllLogicalDrives
set AllLogicalDrives = AllLogicalDrivesEx(empty)
End Function
Function GetBootDriveEx ( bForced, sOSBuild, bBootFiles )
Dim oWMIDiskPart
Dim oDiskPart
Dim oDisk
Dim oLogical
Dim sCurrentARSetting
Dim iRetVal
set GetBootDriveEx = nothing
' Get current Autorun status
' HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoDriveTypeAutoRun
' 0xFF - Disables all drive types
If oEnv("SystemDrive") <> "X:" then
on error resume next
sCurrentARSetting = oShell.Regread( "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoDriveTypeAutoRun")
if not Err then
oLogging.CreateEntry "The current autorun setting is - " & sCurrentARSetting, logTypeInfo
End if
oLogging.CreateEntry "Disabling Autorun", logTypeInfo
iRetVal = oUtility.regwrite ( "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoDriveTypeAutoRun", 255 )
On Error Goto 0
End if
oLogging.CreateEntry "Find the boot drive (if any) [" & bForced & "] [" & sOSBuild & "] [" & bBootFiles & "]" , logTypeInfo
For each oWMIDiskPart in AllDiskPartEx ( " WHERE Bootable = TRUE or BootPartition = TRUE " )
oLogging.CreateEntry "Found bootable drive: " & oWMIDiskPart.Path_ , logTypeVerbose
set oDiskPart = new ZTIDiskPartition
set oDiskPart.DiskPart = oWMIDiskPart
set oDisk = oDiskPart.GetDiskObject
If oDisk.isOSReady( sOSBuild ) then
set oLogical = oDiskPart.oWMIDrive( bForced )
If isValidObject(oLogical) then
If not bBootFiles then
oLogging.CreateEntry "Found bootable drive (No Boot File Test) [ " & oLogical.DeviceID & " ]: " & oLogical.Path_ , logTypeInfo
set GetBootDriveEx = oDiskPart
ElseIf oFSO.FileExists( oLogical.DeviceID & "\ntldr" ) or oFSO.FileExists( oLogical.DeviceID & "\bootmgr" ) or oFSO.FileExists( oLogical.DeviceID & "\EFI\Microsoft\Boot\bootmgr.efi" ) then
oLogging.CreateEntry "Found bootable drive [ " & oLogical.DeviceID & " ]: " & oLogical.Path_ , logTypeInfo
set GetBootDriveEx = oDiskPart
Else
oLogging.CreateEntry "No boot files found: " & oLogical.Path_ , logTypeInfo
End if
End if
End if
next
If GetBootDriveEx is nothing then
oLogging.CreateEntry "No boot drives found. None.", logTypeInfo
End if
'Revert Autorun status to orginal setting
If oEnv("SystemDrive") <> "X:" then
if isempty(sCurrentARSetting) then
sCurrentARSetting = 0
End if
if not isNull(sCurrentARSetting) then
oLogging.CreateEntry "Reverting autorun setting to - " & sCurrentARSetting, logTypeInfo
iRetVal = oUtility.regwrite ( "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoDriveTypeAutoRun", sCurrentARSetting )
End if
End if
End Function
' -------------------------------------------------------------------------------------------------
'
' Support Routines
'
Function IsValidObject( oTest )
IsValidObject = False
If isObject ( oTest ) then
If not oTest is nothing then
IsValidObject = True
End if
End if
End function
Function RunDiskPartSilent( aCommands )
Dim sDiskPart
Dim sTempFile
Dim sCommand
sTempFile = oFileHandling.GetTempFile
With oFSO.CreateTextFile(sTempFile,true,false)
For each sCommand in aCommands
oLogging.CreateEntry "DISKPART + " & sCommand, LogTypeInfo
.WriteLine sCommand
next
.Close
End With
RunDiskPartSilent = oUtility.RunWithConsoleLoggingAndHidden("DiskPart.exe /s " & sTempFile)
End function
Function RunDiskPart( aCommands )
Dim sDiskPart
Dim sTempFile
Dim sCommand
sTempFile = oFileHandling.GetTempFile
With oFSO.CreateTextFile(sTempFile,true,false)
For each sCommand in aCommands
oLogging.CreateEntry "DISKPART + " & sCommand, LogTypeInfo
.WriteLine sCommand
next
.Close
End With
RunDiskPart = oUtility.RunWithConsoleLogging("DiskPart.exe /s " & sTempFile)
End function
Function FormatLargeSize( lSize )
Dim i
For i = 1 to len(" KMGTPEZY")
If cdbl(lSize) < 1000 ^ i then
FormatLargeSize = int(cdbl(lSize)/(1000^(i-1))) & " " & mid(" KMGTPEZY",i,1) & "B"
Exit function
End if
next
End function
' -------------------------------------------------------------------------------------------------
'
' BCD
'
Function RunBCDBoot()
If oEnv("SystemDrive") = "X:" then
RunBCDBoot = RunBCDBootEx( oUtility.GetOSTargetDriveLetter & "\windows", empty )
Else
RunBCDBoot = RunBCDBootEx( oFileHandling.GetWindowsFolder, empty )
End if
End function
Function RunBCDBootEx( sWindowsTarget, sParams )
Dim sProgram
Dim iRC
iRC = oUtility.FindFile("BCDBoot.exe",sProgram)
TestAndFail iRC, 7811, "FindFile: BCDBoot.exe"
sProgram = """" & sProgram & """"
If oLogging.Debug then
sProgram = sProgram & " /v"
End if
If OEnvironment.Item("UILanguage") = "" Then
OEnvironment.Item("UILanguage") = oUtility.RegReadEx("HKCU\Control Panel\International\LocaleName",False)
End If
TestAndFail OEnvironment.Item("UILanguage") <> "", 7810, "Verify UILanguage is set."
RunBCDBootEx = oUtility.RunWithConsoleLoggingAndHidden(sProgram & " " & sWindowsTarget & " /l " & oEnvironment.Item("UILanguage") & " " & sParams)
End function
' -------------------------------------------------------------------------------------------------
'
' Destination Disk/Partition/LogicalDrive routines
'
Function GetMinimumDiskPartitionSizeMB
GetMinimumDiskPartitionSizeMB = 15 * 1000 ' 15 GB
If oEnvironment.Item("ImageBuild") <> "" then
oUtility.GetMajorMinorVersion(oEnvironment.Item("ImageBuild"))
If (oUtility.VersionMajor = 5 and oUtility.VersionMinor = 1)then
GetMinimumDiskPartitionSizeMB = 1500 ' 1.5 GB
ElseIf (oUtility.VersionMajor = 5 and oUtility.VersionMinor = 2) then
GetMinimumDiskPartitionSizeMB = 3 * 1000 ' 3 GB
ElseIf oEnvironment.Item("ImageFlags") <> "" then
If inStr(1,oEnvironment.Item("ImageFlags"),"SERVER",vbTextCompare) <> 0 then
GetMinimumDiskPartitionSizeMB = 10 * 1000 ' 32 GB
End if
End if
End if
End function
Function GetFirstPossibleSystemDrive
Dim oWMIDisk
Dim oDisk
Dim oWMIDiskPart
Dim oDiskPart
If oEnv("SystemDrive") <> "X:" then
GetFirstPossibleSystemDrive = oEnv("SystemDrive")
oLogging.CreateEntry "Found OS Disk: " & oEnv("SystemDrive") , logTypeInfo
Else
for each oWMIDisk in AllDiskDrives
set oDisk = new ZTIDisk
set oDisk.Disk = oWMIDisk
TestAndFail not isempty(oDisk.oWMI), 7814, "Verify class created: " & oWMIDisk.Path_
If oDisk.isOSReady( oEnvironment.Item("ImageBuild") ) then
oLogging.CreateEntry "Found Possible OS TargetDisk: " & oWMIDisk.Path_ , logTypeInfo
for each oWMIDiskPart in oDisk.GetPartitions
oLogging.CreateEntry "Found Possible OS Target Partition: " & oWMIDiskPart.Path_ , logTypeInfo
set oDiskPart = new ZTIDiskPartition
set oDiskPart.DiskPart = oWMIDiskPart
TestAndFail not isempty(oDiskPart.oWMIDiskPart), 7815,"Verify WMI Object was accepted by ZTIDiskPartition"
If not oDiskPart.isOSReady( oenvironment.Item("ImageBuild"), oenvironment.Item("ImageFlags") ) then
oLogging.CreateEntry "Target Partition not big enough: " & oWMIDiskPart.Path_ , logTypeInfo
ElseIf not isEmpty(GetFirstPossibleSystemDrive) then
oLogging.CreateEntry "Found More than one candidate OS TargetDisk: " & oWMIDiskPart.Path_ , logTypeInfo
ElseIf not isEmpty(oDiskPart.Drive) then
oLogging.CreateEntry "Found Drive: " & oDiskPart.Drive , logTypeInfo
GetFirstPossibleSystemDrive = oDiskPart.Drive
Else
oLogging.CreateEntry "Partition was found, however no drive was associated (not formatted?) Skip: " & oWMIDiskPart.Path_ , logTypeInfo
End if
next
Else
oLogging.CreateEntry "Found Possible NonOS Disk: " & oWMIDisk.Path_ , logTypeInfo
End if
next
End if
If not isEmpty(GetFirstPossibleSystemDrive) then
oLogging.CreateEntry "Found FirstPossibleSystemDrive: " & GetFirstPossibleSystemDrive , logTypeInfo
Else
oLogging.CreateEntry "Did not find disk." , logTypeInfo
End if
End function
' -------------------------------------------------------------------------------------------------
'
' Legacy Routines
'
Function MarkActive(sDrive)
Dim oDrive
Set oDrive = new ZTIDiskPartition
oDrive.Drive = sDrive
If not isEmpty( oDrive.Drive ) then
MarkActive = RunDiskPartSilent ( array ( "List Vol", "Select Disk " & oDrive.Disk , "Select Partition " & oDrive.Partition , "Active", "Detail Part", "Exit" ) )
Else
MarkActive = RunDiskPartSilent ( array ( "List Vol", "Select Vol " & sDrive, "Active", "Detail Part", "Exit" ) )
End if
End Function
Function GetDiskPartitionCount (iDisk)
Dim oDisk
set oDisk = new ZTIDisk
oDisk.Disk = iDisk
GetDiskPartitionCount = oDisk.GetPartitionCount
End Function
Function GetNotActiveDrive
Dim oDrive
Dim oWMIDiskPart
For each oWMIDiskPart in AllDiskPartEx(" WHERE BootPartition = FALSE ")
Set oDrive = new ZTIDiskPartition
set oDrive.DiskPart = oWMIDiskPart
If not isEmpty(oDrive.Drive) then
GetNotActiveDrive = oDrive.Drive
exit Function
End If
next
GetNotActiveDrive = False
End Function
function GetDiskForDrive (sDriveLetter)
Dim oDrive
Set oDrive = new ZTIDiskPartition
oDrive.Drive = sDriveLetter
GetDiskForDrive = oDrive.Disk
If isEmpty(GetDiskFOrDrive) then GetDiskForDrive = -1 ' Backwards compatibility
End Function
Function GetPartitionSize (sDriveLetter)
Dim oDrive
GetPartitionSize = 0
Set oDrive = new ZTIDiskPartition
oDrive.Drive = sDriveLetter
If not isEmpty( oDrive.oWMIDrive(false) ) then
GetPartitionSize = oDrive.oWMIDrive(false).Size
End if
End Function
Function GetDiskSize (iDrive)
Dim oDisk
GetDiskSize = -1
set oDisk = new ZTIDisk
oDisk.Disk = iDrive
If not isempty(oDisk.Disk) then
GetDiskSize = cLng(Fix(oDisk.oWMI.Size / 1024 /1024))
End if
End Function
Function GetBootDrive
Dim oBootDrive
set oBootDrive = GetBootDriveEx( false, "0.0.0.0", false )
If not oBootDrive is nothing then
GetBootDrive = oBootDrive.Drive
Else
GetBootDrive = Failure
End if
End function
' -------------------------------------------------------------------------------------------------
'
' Routines that should be phased out.
'
Function GetDiskFreeSpace ( iDisk )
oLogging.CreateEntry "ZTIDiskUtility!GetDiskFreeSpace should be deprecated, does not handle avaible space for a new partition", LogTypeDeprecated
Dim oDisk
Dim oWMIDiskPart
Dim oDiskPart
Dim iSum
set oDisk = new ZTIDisk
oDisk.Disk = iDisk
For each oWMIDiskPart in oDisk.GetPartitions
set oDiskPart = new ZTIDiskPartition
set oDiskPart.DiskPart = oWMIDiskPart
iSum = iSum + clng(oDiskPart.oWMIDiskPart.Size / 1024 /1024)
Next
GetDiskFreeSpace = clng(oDisk.oWMI.Size / 1024 /1024) - iSum
End function
' Determine drive status as compared to the custom partition config
'
' Return:
' 0 = Partition exists and meets criteria
' 1 = Partition exists and does not meet the criteria
' -1= Partition does not exist.
Function MatchPartitionConfiguration (iDriveIndex, iPartitionIndex, sDriveLetter, iMinSizeMB)
Dim oDiskPart
Dim oWMIDrv
oLogging.CreateEntry "ZTIDiskUtility!MatchPartitionConfiguration should be deprecated. Legacy Solution.", LogTypeDeprecated
set oDiskPart = new ZTIDiskPartition
oDiskPart.SetDiskPart iDriveIndex, iPartitionIndex + 1
MatchPartitionConfiguration = -1
If not isEmpty(oDiskPart.Drive) then
MatchPartitionConfiguration = FAILURE
set oWMIDrv = oDiskPart.oWMIDrive(false)
If not oWMIDrv is nothing then
If UCase(oDiskPart.Drive) = UCase(sDriveLetter) And oWMIDrv.DriveType = 3 THen
If (oWMIDrv.FileSystem = "FAT" Or oWMIDrv.FileSystem = "FAT32" Or oWMIDrv.FileSystem = "NTFS") Then
If cLng(oWMIDrv.Size / 1024 / 1024) >= cLng(iMinSizeMB) Then
MatchPartitionConfiguration = SUCCESS
End if
End if
End if
End If
End if
End Function