VBScript Error codes when trying to access the extended file properties ?

Hi,

I have a script that retrieves the file properties like product name,product version,Copyright etc.. information from a list of files under a folder.

I have used the Err object to get the errors if any, while getting the file information.So, if there is any error than I get the Err.Number, Err.Description,Err.Source with the file name and the folder.

I am usually getting 3 types of errors while doing this;

================================

Folder: C:\Documents and Settings
FileName: S.LOG
Error: 424
Source: Microsoft VBScript runtime error
Description: Object required

Folder: C:\MSOCache
FileName: LD.zip
Error: 70
Source: Microsoft VBScript runtime error
Description: Permission denied

Folder: C:\$Recycle.Bin\S-1-5-18\$RN0QZUM.Gadget
FileName: gadget.html
Error: -2147467259
Source:
Description:

================================

Now, for Error 424 & 70 as the description says its quite the opposite when i really look into the folders.

424 says object required, but I don't have access to the file.

70 says permission denied, but I am able to access the file.

Please throw some light on this ?

And also if someone can help me out with the "-2147467259" error please ?

August 31st, 2013 3:30am

The c:\MSOCache is protected by the operating system.  You are not allowed to play with it.

We cannot help with the rest of the errors without the script.  The errors, in most cases, are useless without being able to see what caused them.

Why would you want to get the properties of those files?

Free Windows Admin Tool Kit Click here and download it now
August 31st, 2013 3:52am

Hi,

The below script takes dir.txt having only directories by using the shell command "cmd /c  dir /s /b /ad C:\ > dir.txt" and than retrieves the file properties along with the errors;

========================================================

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Shell.Application")
Set winsh = CreateObject("WScript.Shell")
Set winenv = winsh.Environment("Process")
windir = winenv("WINDIR")
StrFNam = windir &"\temp\dir.txt"
StrFileName = windir &"\temp\Files.log"

Const ForWriting = 2, ForReading = 1, ForAppending = 8
On Error Resume Next
arrLines = Split(objFSO.OpenTextFile(StrFNam).ReadAll(), VbCrLf)
Set objTextFile = objFSO.OpenTextFile(StrFileName,ForWriting,TRUE)
Const n = 5
i = -1
count = 0
Set objFolder = objShell.Namespace("C:\")
Do
  i = i + 1
  attr = objFolder.GetDetailsOf(objFolder.Items, i)
  Select Case LCase(attr)
    Case "company"         : indexCompany = i
    Case "product name"    : indexName = i
    Case "product version" : indexVersion = i
  End Select
  If attr = "" Then
    count = count + 1
  Else
    count = 0
  End If
Loop Until count >= n
For i=0 To UBound(arrLines)

    strPath = arrLines(i)

    For Each f In objFSO.GetFolder(strPath).Files
      FileName = f.Name
      FileVersion = objFSO.GetFileVersion(f.Path)

      Set objFolder = objShell.Namespace(strPath)
      Set objFile = objFolder.ParseName(FileName)
      Company= objFolder.GetDetailsOf(objFile, indexCompany)
      ProductName= objFolder.GetDetailsOf(objFile, indexName)
      ProductVersion= objFolder.GetDetailsOf(objFile, indexVersion)

      StrText = "FileName: " &FileName & vbNewLine & "FileVersion: " &FileVersion & vbNewLine & "ProductName: " &ProductName & vbNewLine & "ProductVersion: " &ProductVersion & vbNewLine & "Company: " &Company & vbNewLine & "FileSize: " & f.Size & vbNewLine & "LastModifiedDate: " &f.DateLastModified & vbNewLine & "CreatedDate: " &f.DateCreated & vbNewLine & "ParentFolder: " &strPath
      If Err.Number <> 0 Or Err <> 0 Then
           objTextFile.WriteLine("Folder: " & strPath)
         objTextFile.WriteLine("FileName: " & FileName)
         objTextFile.WriteLine("Error: " & Err.Number)
         objTextFile.WriteLine("Source: " &  Err.Source)
         objTextFile.WriteLine("Description: " &  Err.Description)
      Else
         objTextFile.WriteLine(StrText)
      End If
      Err.Clear
      objTextFile.WriteLine("-------------------------------------------------------------")
    Next
Next
==========================================
Now, here I have 3 kinds of error coming up basically i.e. -2147467259, 70 and 424 like the following;

Folder: C:\Documents and Settings
FileName: S.LOG
Error: 424
Source: Microsoft VBScript runtime error
Description: Object required

Folder: C:\MSOCache
FileName: SW.zip
Error: 70
Source: Microsoft VBScript runtime error
Description: Permission denied

Folder: C:\Windows\SysWOW64\config\systemprofile\Documents\Visual Studio Projects\VSMacros71\Samples
FileName: Samples.vsmacros
Error: 70
Source: Microsoft VBScript runtime error
Description: Permission denied

Folder: C:\$Recycle.Bin\S-1-5-18\$RN0QZUM.Gadget
FileName: gadget.html
Error: -2147467259
Source:
Description:
==================
Please through some light on these errors, as I have a little knowledge on handling errors and understanding.
And for Error 424 & 70 as the description says its quite the opposite when I really look into the folders.
424 says object required, but I don't have access to the file.
70 says permission denied, but I am able to access the file.
-2147467259 no Idea ?

This reports would be used further.

Appreciate all the help!!!

       

August 31st, 2013 5:44am

Covering most of your code with a statement on error resume next is totally counterproductive because it hides every error unless you keep checking the error code. This makes it almost impossible to debug the code. If you are not sure in advance if a certain file exists then you should use the FileExist function instead of relying on error trapping.

In your code you use the statement

f.DateLastModified

but you never create an object "f". Without the on error statement the interpreter would have told you immediately which line contains the error and there would have been no need to ask this forum and wait for an answer.

Note also that operators such as & in

StrText = "FileName: " &FileName

should always be surrounded by at least one space. Not doing so can lead to ambiguities under certain circumstances.

Free Windows Admin Tool Kit Click here and download it now
August 31st, 2013 7:09am

Here is a partial fix to demo how you have to approach this problem.

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set winsh = CreateObject("WScript.Shell")
Set winenv = winsh.Environment("Process")
tempdir = winenv("temp")
strFNam = tempdir & "\dir.txt"
strFileName = tempdir & "\Files.log"


Set objTextFile = objFSO.CreateTextFile(strFileName,True)
Set folderNames=objFSO.OpenTextFile(strFNam)
Do While Not folderNames.AtEndOfStream

	strFolderPath = folderNames.ReadLine()
	if objFSO.FolderExists(strFolderPath) Then
		ProcessFolder strFolderPath
	Else
		WScript.Echo "Folder not found:" & strFolderPath
	End If
     
 Loop

Function ProcessFolder( sFolderPath )
    Const indexCompany = 33
	Const indexName = 34
	Const indexVersion = 35

    WScript.Echo "Processing folder:" & sFolderPath
	Set objShell = CreateObject("Shell.Application")
	Set shellFolder = objShell.Namespace(sFolderPath)

    On Error Resume Next
	For Each f In  objFSO.GetFolder(sFolderPath).Files
	
	 	If Err Then
			WScript.Echo vbTab & Err.Description
			Exit Function
		End If
		On Error GoTo 0
	
		Set shellFile = shellFolder.ParseName(f.Name)
		With objTextFile
			.WriteLine "ParentFolder: " & sFolderPath
			.WriteLine "FileName: " &  f.Name
			.WriteLine "FileVersion: " & objFSO.GetFileVersion(f.Path)
			.WriteLine "ProductName: " & shellFolder.GetDetailsOf(shellFile, indexName)
			.WriteLine "ProductVersion: " & shellFolder.GetDetailsOf(shellFile, indexVersion)
			.WriteLine "Company: " & shellFolder.GetDetailsOf(shellFile, indexCompany) 
			.WriteLine "FileSize: " & f.Size 
			.WriteLine "LastModifiedDate: " &  f.DateLastModified
			.WriteLine "CreatedDate: " &f.DateCreated 
			.WriteLine "-------------------------------------------------------------"
		End With
		
     Next
    
     WScript.Echo vbTab & "Processing Complete:" & sFolderPath

End Function

Notice how the error management is done. It is the only way you canmake this work reliably.

We need to use constants for the indexes of custom attributes.  They do not exisit on all folders or files so you must make them constants.  I used arbitrary numbers so look up the correct numbers by dumping all attribute names and index numbers to a file.

Her is the list of stock properties: http://msdn.microsoft.com/en-us/library/windows/desktop/aa380376(v=vs.85).aspx

Others are defined when products are installed. 

August 31st, 2013 1:36pm

Here are the correct indexes:

 Const indexCompany = 33
 Const indexName = 279
 Const indexVersion = 280

 

Here is a sample of the output:

ParentFolder: C:\Dolby PCEE4
FileName: audiodemo.cmd
FileVersion: 
ProductName: 
ProductVersion: 
Company: 
FileSize: 406
LastModifiedDate: 6/8/2011 10:44:30 PM
CreatedDate: 10/30/2012 9:24:12 PM
-------------------------------------------------------------
ParentFolder: C:\Dolby PCEE4
FileName: Dolby.Interop.dll
FileVersion: 7.2.8000.13
ProductName: Dolby.Interop
ProductVersion: 7.2.8000.13
Company: Dolby Laboratories Inc.
FileSize: 39776
LastModifiedDate: 4/23/2012 11:47:52 AM
CreatedDate: 4/23/2012 11:47:52 AM
-------------------------------------------------------------
ParentFolder: C:\Dolby PCEE4
FileName: Dolby.Pcee.MultimediaDevice.dll
FileVersion: 7.2.8000.13
ProductName: Pcee.MmDevApi
ProductVersion: 7.2.8000.13
Company: Microsoft
FileSize: 14688
LastModifiedDate: 4/23/2012 11:47:50 AM
CreatedDate: 4/23/2012 11:47:50 AM
-------------------------------------------------------------

 
Free Windows Admin Tool Kit Click here and download it now
August 31st, 2013 1:57pm

Thanks guys for spending sometime helping me and sharing the knowledge!!!!

Appreciate it!!!!


:-)
September 1st, 2013 2:30am

Here is a partial fix to demo how you have to approach this problem.

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set winsh = CreateObject("WScript.Shell")
Set winenv = winsh.Environment("Process")
tempdir = winenv("temp")
strFNam = tempdir & "\dir.txt"
strFileName = tempdir & "\Files.log"


Set objTextFile = objFSO.CreateTextFile(strFileName,True)
Set folderNames=objFSO.OpenTextFile(strFNam)
Do While Not folderNames.AtEndOfStream

	strFolderPath = folderNames.ReadLine()
	if objFSO.FolderExists(strFolderPath) Then
		ProcessFolder strFolderPath
	Else
		WScript.Echo "Folder not found:" & strFolderPath
	End If
     
 Loop

Function ProcessFolder( sFolderPath )
    Const indexCompany = 33
	Const indexName = 34
	Const indexVersion = 35

    WScript.Echo "Processing folder:" & sFolderPath
	Set objShell = CreateObject("Shell.Application")
	Set shellFolder = objShell.Namespace(sFolderPath)

    On Error Resume Next
	For Each f In  objFSO.GetFolder(sFolderPath).Files
	
	 	If Err Then
			WScript.Echo vbTab & Err.Description
			Exit Function
		End If
		On Error GoTo 0
	
		Set shellFile = shellFolder.ParseName(f.Name)
		With objTextFile
			.WriteLine "ParentFolder: " & sFolderPath
			.WriteLine "FileName: " &  f.Name
			.WriteLine "FileVersion: " & objFSO.GetFileVersion(f.Path)
			.WriteLine "ProductName: " & shellFolder.GetDetailsOf(shellFile, indexName)
			.WriteLine "ProductVersion: " & shellFolder.GetDetailsOf(shellFile, indexVersion)
			.WriteLine "Company: " & shellFolder.GetDetailsOf(shellFile, indexCompany) 
			.WriteLine "FileSize: " & f.Size 
			.WriteLine "LastModifiedDate: " &  f.DateLastModified
			.WriteLine "CreatedDate: " &f.DateCreated 
			.WriteLine "-------------------------------------------------------------"
		End With
		
     Next
    
     WScript.Echo vbTab & "Processing Complete:" & sFolderPath

End Function

Notice how the error management is done. It is the only way you canmake this work reliably.

We need to use constants for the indexes of custom attributes.  They do not exisit on all folders or files so you must make them constants.  I used arbitrary numbers so look up the correct numbers by dumping all attribute names and index numbers to a file.

Her is the list of stock properties: http://msdn.microsoft.com/en-us/library/windows/desktop/aa380376(v=vs.85).aspx

Others are defined when products are installed.&

Free Windows Admin Tool Kit Click here and download it now
September 1st, 2013 2:50am

The constants should not change. Only the availability changes.  It depends on the products installed.  If a product is not installed the index will not exist.

Read the SDK documentation.

September 1st, 2013 3:45am

I scanned through many files on multiple platforms.  99% do not support Product or Product Version.  On platforms (XP) with Oracle installed we have those properties but on XP with no Oracle they do not exist.
Free Windows Admin Tool Kit Click here and download it now
September 1st, 2013 3:50am

Getting the constants by retrieving the indexes  or hardcoding it, either ways it seems to be same.If available we will get it orelse not.

And, I just found out that the script is not able to handle properly the folders containing special characters.That's the reason I am not able to open up many folders which have actually some files.

Is there any way we can check the presence of special characters if any, in a folderName or fileName retrieved and change into some format to open up and be able to read ?



Thanks for your time!!

September 1st, 2013 4:22am

Getting the constants by retrieving the indexes  or hardcoding it, either ways it seems to be same.If available we will get it orelse not.

And, I just found out that the script is not able to handle properly the folders containing special characters.That's the reason I am not able to open up many folders which have actually some files.

Is there any way we can check the presence of special characters if any, in a folderName or fileName retrieved and change into some format to open up and be able to read ?



Thanks for your time!!

That can only happen if your file system is corrupted. Folder names do not allow special characters. If something has damaged this then you need to fix that first. There is no way around that.

What makes you think you have illegal characters?  Are you getting an error message?

The ordinal for  property is the same on al systems. What is different is that it will not exist on some systems.  IF it doesn't exist the value will be null.

Your original issue is that you are assuming that you will always get an index value.  Most of the time the value will be null causing an error.  That is why you put in On Error Resume Next which then caused the remainder of your problems.

There is no substitute for understanding of what is happening.  Guessing will only create worse problems.

Free Windows Admin Tool Kit Click here and download it now
September 1st, 2013 4:59am

In one of the systems there is a folder like this;

"C:\Program Files (x86)\Megacubo\data\Meus Canais\Rdios" which have some files under it.

The script is unable to get under this file as the output of the dir command which puts the folder names in the dir.txt file which in turn is the input for getting the files is changing the characters, thereby the dir.txt has "C:\Program Files (x86)\Megacubo\data\Meus Canais\R dios".

Similarly, for other folder names, its changing the special characters.Hence, the script is unable to get those folders.However, the presence of such special characters in folder/file name is quite rare and I am seeing this for the first time.Some more like this;

"C:\Program Files (x86)\Megacubo\data\Meus Canais\Notcias" to "C:\Program Files (x86)\Megacubo\data\Meus Canais\Notcias" (in dir.txt)

"C:\Program Files (x86)\Megacubo\data\Meus Canais\Msica" to "C:\Program Files (x86)\Megacubo\data\Meus Canais\Msica" (in dir.txt)

And yes, I am getting an error like "Object required" from Err.Description which is obvious as due to the anomalies created by special characters.

About the existence of ordinal for property, may be I can use an If Not IsNull(indexvalue) for every index value use as below;

----------------------------

If Not IsNull(indexCompany) Then Company= objFolder.GetDetailsOf(objFile, indexCompany)
If Not IsNull(indexCompany) Then ProductName= objFolder.GetDetailsOf(objFile, indexName)
If Not IsNull(indexCompany) Then ProductVersion= objFolder.GetDetailsOf(objFile, indexVersion)

-----------------------------

Thanks jrv for your active and valuable inputs as always!! :-)



September 1st, 2013 6:13am

You cannot use those characters in a file or folder name. YO need to fix the names first.

I can create names like that easily but Windows Vista and later warn that the name is illegal.

Free Windows Admin Tool Kit Click here and download it now
September 1st, 2013 7:37am

In one of the systems there is a folder like this;

"C:\Program Files (x86)\Megacubo\data\Meus Canais\Rdios" which have some files under it.

The script is unable to get under this file as the output of the dir command which puts the folder names in the dir.txt file which in turn is the input for getting the files is changing the characters, thereby the dir.txt has "C:\Program Files (x86)\Megacubo\data\Meus Canais\R dios".



Why ae you even bothering with teh file when you are using a dir command. Jsut use the command to get teh folders directly. YOu will not have conversion problems.

Here is what we get with the DIR command in PowerShell

S C:\scripts> dir -dir


   Directory: C:\scripts


ode                LastWriteTime     Length Name
---                -------------     ------ ----
----         7/22/2013   2:20 PM            csvtest
----         6/17/2013  11:56 AM            Demo-MFP
----         8/10/2013   5:25 PM            EventViewer
----         7/27/2013  12:12 PM            Excel
----         7/24/2013  12:22 PM            FormsDemos
----         8/25/2013   5:11 PM            HTAXSLT
----         7/10/2013   5:27 PM            ListViewDemo
----         8/27/2013   3:40 PM            LocaleMetaData
----          7/9/2013  10:46 AM            PortQryV2
----         8/17/2013   3:02 PM            PSTemplate
----          9/1/2013   7:34 AM            Rdios
----         8/13/2013   4:31 PM            test44
----         7/26/2013  11:23 AM            testb_files
----          8/5/2013   1:16 PM            Workforce Calculator
----         8/29/2013   1:44 PM            XML
----         6/16/2013   4:22 PM            xxxx
----         8/13/2013   2:00 PM            xxxxx

Note that Rdios is intact.  Saving it to teh wrong kind of file will cause you to lose characters or convert them incorrectly.

Try to avoid too many steps when processing.  This is not an old copy od DOS 5.1 that cannot process except from a file.  We are using WIndows and we are using PowerShell.  All of these things were fixed years ago.  Just use the data as you get it.

September 1st, 2013 7:43am

Listing of files in folder using dir command:

PS>dir -dir|%{dir $_}

    Directory: C:\scripts\Rdios


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---          7/1/2013  10:49 AM        132 inv.ps1
-a---         6/25/2013   5:49 PM        245 o365test.csv
-a---         7/10/2013   1:27 PM        732 testv.txt
-a---         6/27/2013   5:33 PM        495 try_cat

Free Windows Admin Tool Kit Click here and download it now
September 1st, 2013 7:44am

When you save to a file you will likely get an ascii file.  Try to save the file as Unicode and open it in VBScript as a Unicode file.

I still think you should fix the folder and file names.

September 1st, 2013 7:47am

If Not IsNull(indexCompany) Then Company= objFolder.GetDetailsOf(objFile, indexCompany)
If Not IsNull(indexCompany) Then ProductName= objFolder.GetDetailsOf(objFile, indexName)
If Not IsNull(indexCompany) Then ProductVersion= objFolder.GetDetailsOf(objFile, indexVersion)


What is wrong with just using the numbers.  If the property doesn't exist it will return a blank.  If the property exists the value will be displayed.

These are the constants.  They are the same on all systems.  TO use a Constant a company has to have it registered with Microsoft.

 Const indexCompany = 33
 Const indexName = 279
 Const indexVersion = 280

I have checked on many systems now.  I have found that it either is that number or it does not exist.

You can use this code to check.

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace("C:\")
For i = 0 To 1000
    attr = objFolder.GetDetailsOf(objFolder.Items, i)
    If attr <> "" Then
        WScript.Echo i & vbTab &  attr
   End If
Next

IDs have been allocated for over 1500 properties but most systems wil only have up to about number 300. The dumper dumps all non-blank values from 0 to 1000.  0 - 6 are guaranteed to exist in al systems because they are the file properties.

Free Windows Admin Tool Kit Click here and download it now
September 1st, 2013 8:13am

If Not IsNull(indexCompany) Then Company= objFolder.GetDetailsOf(objFile, indexCompany)
If Not IsNull(indexCompany) Then ProductName= objFolder.GetDetailsOf(objFile, indexName)
If Not IsNull(indexCompany) Then ProductVersion= objFolder.GetDetailsOf(objFile, indexVersion)


What is wrong with just using the numbers.  If the property doesn't exist it will return a blank.  If the property exists the value will be displayed.

These are the constants.  They are the same on all systems.  TO use a Constant a company has to have it registered with Microsoft.

 Const indexCompany = 33
 Const indexName = 279
 Const indexVersion = 280

I have checked on many systems now.  I have found that it either is that number or it does not exist.

You can use this code to check.

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace("C:\")
For i = 0 To 1000
    attr = objFolder.GetDetailsOf(objFolder.Items, i)
    If attr <> "" Then
        WScript.Echo i & vbTab &  attr
   End If
Next

IDs have been allocated for over 1500 properties but most systems wil only have up to about number 300. The dumper dumps all non-blank values from 0 to 1000.  0 - 6 are guaranteed to exist in al systems because they are the file properties.

September 1st, 2013 9:39am

In one of the systems there is a folder like this;

"C:\Program Files (x86)\Megacubo\data\Meus Canais\Rdios" which have some files under it.

The script is unable to get under this file as the output of the dir command which puts the folder names in the dir.txt file which in turn is the input for getting the files is changing the characters, thereby the dir.txt has "C:\Program Files (x86)\Megacubo\data\Meus Canais\R dios".

Similarly, for other folder names, its changing the special characters.Hence, the script is unable to get those folders.However, the presence of such special characters in folder/file name is quite rare and I am seeing this for the first time.Some more like this;

"C:\Program Files (x86)\Megacubo\data\Meus Canais\Notcias" to "C:\Program Files (x86)\Megacubo\data\Meus Canais\Notcias" (in dir.txt)

"C:\Program Files (x86)\Megacubo\data\Meus Canais\Msica" to "C:\Program Files (x86)\Megacubo\data\Meus Canais\Msica" (in dir.txt)

And yes, I am getting an error like "Path Not Found" from Err.Description which is obvious as due to the anomalies created by special characters.

About the existence of ordinal for property, may be I can use an If Not IsNull(indexvalue) for every index value use as below;

----------------------------

If Not IsNull(indexCompany) Then Company= objFolder.GetDetailsOf(objFile, indexCompany)
If Not IsNull(indexCompany) Then ProductName= objFolder.GetDetailsOf(objFile, indexName)
If Not IsNull(indexCompany) Then ProductVersion= objFolder.GetDetailsOf(objFile, indexVersion)

-----------------------------

Thanks jrv for your active and valuable inputs as always!! :-)




Free Windows Admin Tool Kit Click here and download it now
September 1st, 2013 1:11pm

I was handling errors in a wrong way and now after reading from you guys, I know the approach to take for that.But, I need to get to resolve the special character problem that exists in the code.

As proposed here earlier to save the dir.txt file in Unicode format and open as well in Unicode format for reading, using below command;

cmd /c  dir /s /b /ad C:\ > dir.txt, -1, True

And while opening to read using the below;(referring to the earlier code)

StrFNam = windir &"\temp\dir.txt"                                                                                                          arrLines = Split(objFSO.OpenTextFile(StrFNam,ForReading,TristateTrue).ReadAll(), VbCrLf)

But still the same problem while reading special characters.

Am I missing something to change for unicode format reading and writing ?


September 2nd, 2013 2:46am

You need to fix the files system.

Switch t PowerShell and your problems will be over assuming you do not have the wrong illegal characters.  I recommend fixing the problem.

Why are you putting this into a file anyway.  it is not nece

Free Windows Admin Tool Kit Click here and download it now
September 2nd, 2013 9:11am

Just for proof here is my output when not trying to us a file:

ParentFolder: C:\Scripts\Rdios
FileName: ADtools.png
FileVersion: 
ProductName: 
ProductVersion: 
Company: 
FileSize: 12711
LastModifiedDate: 6/23/2013 10:38:20 AM
CreatedDate: 9/2/2013 9:21:47 AM
-----------------------------------------

Here is the driver code:

For Each subfolder In folder.SubFolders
     ProcessFolder subfolder.Path     
Next

You can add recursion to this if it is necessary.

Since the original question has been answered fr sometime I have to ask you to open a new question with any further issues.

September 2nd, 2013 9:30am

Thanks!
Free Windows Admin Tool Kit Click here and download it now
September 2nd, 2013 9:56am

This topic is archived. No further replies will be accepted.

Other recent topics Other recent topics