Archive for July, 2006

Using VBScript to Mount/Dismount SDI File

To mount an SDI file so that you can work with it you usually use the utility called sdiloader.exe that comes with the Windows XP Embedded Tools. Where’s the fun in that I say!!

Create on of these guys:

Set oSDIMount = CreateObject(“SDIAUT.SDIMountedDisks”)

And then you can use:
oSDIMount.Add sTempImage
oSDIMount.Remove index1

I’ve provided an example script so you don’t have to do any real coding: MountSDI.vbs (2.22 KB)

Read more

Creating SDI Images using VBScript Part 2

Continuing on from my first post Creating SDI Images using VBScript I am going to look at a more complete example here. I’ve also attached a working script.MakeSDI.vbs (4.76 KB)

Previously we saw that you can create a new SDI image doing the following:
Set oSDIFile = oSDI.CreateImage(sImageSDICREATENEW)
Now this isn’t really all that useful because without a disk blob inside the SDI file you cannot partition and format the SDI file.

Now I’ll leave it to someone more knowledgable than myself to explain exactly what a DISK blog is but you create one by using oSDIFile.Blobs.Allocate DISKnLonHi. The signature for Allocate is:

Sub Allocate(ByVal ldwType As Long, ByVal ldwSizeLowPart As Long, [ByVal ldwSizeHighPart As Long])

Confused?? I was but if you take a look in SDIMgr.swf from the Windows XP Embedded Tools you’ll be able to extract just the bits you need. I’ve provided them below and don’t forget the example script that is attached.

Sub CreateDisk(sSize)
Dim nSize ‘size in MB
Dim sHex ‘size as Hex
   Dim nLo ‘Low DWORD
Dim nHi ‘High DWORD
Dim oBlob ‘DISK Blob

   ’Get the size in MB
nSize = GetSizeInMB(sSize)

   ’Convert to hex
sHex = Right(“00000000″ & Hex(nSize), 8)

   ’Form the Low DWORD
nLo = CLng(“&h” & Right(sHex3) & “00000″)
nHi = CLng(“&h” & Left(sHex5))

   ’Create a DISK Blog
oSDIFile.Blobs.Allocate DISKnLonHi

   Set oBlob = FindBlob(oSDIFile)
   oBlob.Attribute = 0

End Sub

Function GetSizeInMB(sData)
Dim sTemp : sTemp = Trim(sData)
Dim lTemp : lTemp = CLng(sTemp)

   GetSizeInMB = lTemp \ 1048576
End Function

Function FindBlob(oSDIFile)
Dim oBlob
Set FindBlob = Nothing

   For Each oBlob In oSDIFile.Blobs
If oBlob.Type = DISK Then Set FindBlob = oBlob : Exit Function
End Function


Read more

Finding SDI Disks Using WMI

When you create an SDI image with the view of using it to create a bootable Windows PE or Bart PE disk one of the steps is to use diskpart or Device Manager to partition and format the image. Recently I tried to automate this process to my own demise. In the diskpart script that I used I had the line select disk 1, which was a terrible idea because when I ran it on another machine it formatted the HDD. Oops!

To get around this I thought I’d ask WMI what the index of my SDI Disk is before running diskpart, the result:

strComputer = “.”
Set objWMIService = GetObject(winmgmts:\\” & strComputer & “\root\CIMV2″)
Set colItems = objWMIService.ExecQuery( _
“SELECT * FROM Win32_DiskDrive WHERE Caption = ‘SDIDisk’”,,48)

For Each objItem In colItems
   WScript.Echo “———————————–”
   WScript.Echo Win32_DiskDrive instance”
   WScript.Echo “———————————–”
   WScript.Echo “Index: “ & objItem.Index
   WScript.Echo “Name: “ & objItem.Name
   WScript.Echo “Partitions: “ & objItem.Partitions
   WScript.Echo “Size: “ & objItem.Size

Index is the Property that matches up with the Disk# you see in Device Manager. Keep in mind that if you have a couple of SDI images loaded you’ll get them all back. In my script I’ve used the Partition Property to distinguish between an SDI I have just created and one that I left mounted previously.

Read more

Creating SDI Images using VBScript

I have been using SDI Images to make fast-loading Windows PE and BartPE boot disk using a technique I found over here:

Typically you need to use SDIMgr.wsf and SDILoader.exe that come with Windows XP Embedded to create SDI file and mount them. This however is not the only way. All you need is a file called sdiaut.dll and of course the SDI driver. If you’ve installed the Windows XP Embedded tools as per the article above you’ll have both of these.

sdiaut.dll is the SDI Automation dll and can be instantiated by like so:

Dim oSDI : Set oSDI = CreateObject(“SDIAUT.SDI”)

To Create an SDI Image it is as simple as:

Dim oSDI : Set oSDI = CreateObject(“SDIAUT.SDI”)
Dim fs : Set fs = CreateObject(“Scripting.FileSystemObject”)

‘Create the SDI File
If fs.FileExists(sImageThen
   WScript.Echo “File Already Exists deleting…”
fs.DeleteFile sImageTrue
End If

Dim oSDIFile : Set oSDIFile = oSDI.CreateImage(sImageSDICREATENEW)

WScript.Echo “BootCodeOffset: “ & oSDIFile.BootCodeOffset
.Echo “BootCodeSize: “ & oSDIFile.BootCodeSize
.Echo “DeviceID: “ & oSDIFile.DeviceId
.Echo “DeviceModel: “ & oSDIFile.DeviceModel
.Echo “DeviceRole: “ & oSDIFile.DeviceRole
.Echo “FilePath: “ & oSDIFile.FilePath
.Echo “MDBType: “ & oSDIFile.MDBType
.Echo “RuntimeGUID: “ & oSDIFile.RuntimeGUID

Set oSDIFile = Nothing ‘ Close the file

Pretty cool hey!

Read more


Spotted this little utility the other day called ShinyPower and it is definately a must have for anyone learning PowerShell. It’s over at secretGeek:

From the site: “ShinyPower is a little C# app i wrote to automate browsing PowerShell’s help files.”


Read more