Can I ask question about batch file not vbs?

Author Message
netxman

  • Total Posts : 127
  • Scores: 0
  • Reward points : 0
  • Joined: 8/1/2005
  • Status: offline
Can I ask question about batch file not vbs? Thursday, March 06, 2008 5:04 PM (permalink)
0
Moved to here.
 
It seems there is not a board about batch file.

But I have a batch file which is diffcult to understand. I post it here if administrators think it's not the suitable place so you can delete it, sorry for trouble.

The  purpose of the batch file is to replace a system file but I really want to know the process when I execute it and if I can do the same actions by manually.


Codz:




@echo off
title Replacer
:: Check operating system
ver | find "NT" >nul && (
echo/ ! Windows NT not supported.
pause >nul
goto:eof
)
setlocal disabledelayedexpansion enableextensions
:: Use components, if they exist
if exist "%~dp0Components\*.exe" (
set "path=%~dp0Components;%path%"
title Re *
) else (
set "path=%windir%\system32;%path%"
)
:: Temporary directory
set "dir=%~dp0.ReplacerTemp"
:: Use %tmp% for read-only media
if not exist "%dir%" md "%dir%" 2>nul || (
set "dir=%tmp%\.ReplacerTemp"
md "%tmp%\.ReplacerTemp" 2>nul
)
:: Flags used to communicate with other scripts
set flg="%dir%\..\.Flag_SafeToDel"
set fl2="%dir%\.Flag2_SafeToDel"
:: Files extracted
set vbs="%dir%\Clear_WFP_Message.vbs"
:: Stores rewritten script
set "scr=%dir%\.CurrentScript"
:: Stores undo commands, incase system doesn't boot
set und="%windir%\ReplacerUndo.txt"
:: Stores deleted file
set del="%dir%\DeletedFile_SafeToDel"
call:brk Purge
:: The additional VBScript is embedded at the bottom
findstr/rc:"^[ ]" "%~dpnx0" >%vbs% 2>nul || (
echo/ ! Embedded file could not be extracted. Try using the Components package from:
echo/   
echo/
echo/Press any key to quit.
pause >nul
call:brk Now
)
:: Check parameters
if '%1'=='' (
goto:sys
) else (
echo/"%*" | find "?" >nul && (
goto:hlp) || (if not '%2'=='' goto:hlp)
)
:scr Manage scripts
cls
title Replacer : %~n1
echo/Checking script...
echo/
call:chk "%~f1" || call:brk
pushd "%~dp1"
:: All scripts must contain a certain string to prevent binary files
:: from accidentally being specified and read as scripts
find/i ";; ReplacerScript" "%~f1" >nul 2>&1 || (
echo/ ! Invalid Replacer script. It does not contain ";; ReplacerScript".
echo/
call:brk
)
copy/v/y "%~f1" "%scr%" >nul
:: Get script format and prompt for each optional file
for /f "usebackq tokens=1,2,3,4 delims=, eol=;" %%a in (
"%scr%") do (
setlocal
call:idt "%%~b" "%%~c" "%%~d" "%%~a" && (
  call:exm "%%~a" && call:opt "%%~a"
)
endlocal
)
if not exist "%scr%-tmp%" (
type nul > "%scr%-tmp"
)
copy/v/y "%scr%-tmp" "%scr%" >nul
:: Count files that will be replaced
for /f "tokens=3 delims=:" %%* in (
'find/c /v "" "%scr%"') do (
if "%%*"==" 0" (
  echo/ ! No files to replace.
  echo/
  call:brk
) else (
  echo/
  echo/%%* file^(s^) will be replaced.
)
)
echo/
echo/Press any key to start the script.
pause >nul
cls
:: Print and replace each file
call:vbs
for /f "usebackq tokens=1,2,3,4 delims=, eol=;" %%a in (
"%scr%") do (
setlocal
echo/ * %%~a:
:: Tokens are: SysFile,Replacement,Ref#,Optional
call:seq "%%~a" "%%~b" "%%~c" "%%~d"
echo/
endlocal
)
type nul > %flg%
echo/
echo/Complete. Reboot to see changes.
echo/Press any key to quit.
pause >nul
del "%scr%"
del "%scr%-tmp"
call:brk Now
:sys Get system file
cls
set "sys="
echo/Drag the ORIGINAL system file to replace into this window.
echo/Then, press enter to continue.
echo/Or, type Q to quit.
call:get sys || goto:sys
call:quo sys
if /i %sys%=="Q" (
call:brk Now
)
:: If only filename provided, scan for closest match
if %sys:\=%==%sys% (
if not %sys:.=%==%sys% (
  call:scn %sys%
)
)
if defined pth (
for %%* in (%sys%) do (
  set sys="%pth%%%~nx*"
)
)
call:chk %sys% || (
echo/Press any key to continue.
pause >nul
goto:sys
)
:: Check if a script was given as system file
for %%* in (%sys%) do (
if /i "%%~x*"==".txt" (
  find/i ";; ReplacerScript" %%* >nul && (
   call:scr %%*
  )
)
)
call:ver %sys% || goto:sys
:mod Get replacement file
cls
set "mod="
echo/Drag the REPLACEMENT %nam% into this window.
if exist %bak% (
echo/Or, type RESTORE to restore the backup of %nam%.
)
echo/Then, press enter to continue.
echo/Or, type Q to quit.
call:get mod || goto:mod
call:quo mod
if /i %mod%=="Q" call:brk Now
if /i %mod%=="RESTORE" (call:rst || goto:mod)
call:chk %mod% || (
echo/Press any key to continue.
pause >nul
goto:mod
)
if /i %mod%==%sys% (
echo/ ! A file cannot replace itself.
echo/
echo/Press any key to continue.
pause >nul
) && goto:mod
:cnf Confirm operation
cls
if %mod%==%bak% (
echo/File will be restored.
) else (
if exist %bak% (
  echo/File will not be backed up, backup already exists.
) else (
  for %%* in (%sys%) do (
   echo/File will be backed up to:
   echo/"%%~dpn*.backup"
  )
)
)
echo/
echo/The current file:
echo/%sys%
echo/will be replaced with:
echo/%mod%
echo/
echo/Continue? ^(Y/N^)
call:get cnf || goto:cnf
call:quo cnf
if /i not "%cnf:~1,1%"=="Y" call:brk Now
cls
:vbs Start VBScript
:: A flag tells the VBScript when to exit, so WFP messages can still
:: be cleared after Replacer.cmd exits
if exist %flg% del %flg%
if not "%atr%"=="non" (
start "" /belownormal wscript //b %vbs% %flg% || (
  echo/VBScript failed:
  echo/%vbs%
  echo/
)
)
if exist "%scr%" exit/b
:rep Replace file
if exist %und% del/f %und%
if not exist "%scr%" (
echo/ * %nam%:
)
:: Overwrite system files with replacement
if /i not %mod%==%bak% (
if not exist %bak% (
  echo/   - Backing up...
  call:cpy %sys% %bak%
)
)
:: Not all files are protected
if not "%atr%"=="non" (
if exist %dll% (
  echo/   - Copying to DllCache...
  call:cpy %mod% %dll%
)
if exist %spf% (
  echo/   - Copying to ServicePackFiles...
  call:cpy %mod% %spf%
)
if exist %c86% (
  echo/   - Compressing to i386 folder...
  call:cpy %mod% %fil%
  call:cab %fil% %c86%
)
if exist %w86% (
  echo/   - Compressing to Windows i386 folder...
  call:cpy %mod% %fil%
  call:cab %fil% %w86%
)
if exist %d86% (
  echo/   - Copying to Driver Cache...
  call:cpy %mod% %d86%
)
)
if /i %mod%==%bak% (
echo/   - Restoring system file...
) else (
echo/   - Replacing system file...
)
:: Simply renaming files circumvents WFP:
:: http://virtualplastic.net/html/art_hack.html#winxp
if exist %dlp% del/f %dlp% 2>nul
ren %sys% %dln% 2>nul || (
echo/   ! Overwrite failed.
echo/
call:brk
)
del/f %dlp% 2>nul || (
echo/   ! Warning: Temporary file could not be removed:
echo/     %dlp%
)
call:cpy %mod% %sys%
if exist "%scr%" (
exit/b
) else (
type nul > %flg%
)
:fin Finished
echo/
echo/
echo/Complete. Reboot to see changes.
echo/Press any key to quit.
pause >nul
call:brk Now
goto:eof

:get Get input (var)
echo/
set/p "%~1= > " || exit/b1
echo/
exit/b
:quo Quote variable (var)
:: An ugly yet reliable method of removing quotes
call set "quo=%%%1%%"
set "quo=###%quo%###"
set "quo=%quo:"###=%"
set "quo=%quo:###"=%"
set "quo=%quo:###=%"
set %1="%quo%"
set "quo="
exit/b
:chk Check file (file)
if not exist %1 (
echo/ ! File does not exist:
echo/   %1
echo/
exit/b1
)
if exist %1\ (
echo/ ! Folders not allowed:
echo/   %1
echo/
exit/b1
)
echo/%1 | find "*" >nul && (
echo/ ! Wildcards ^(*^) not allowed.
echo/
exit/b1
)
echo/%1 | find "?" >nul && (
echo/ ! Wildcards ^(?^) not allowed.
echo/
exit/b1
)
exit/b0
:ver Verify file (file)
for %%* in (nam atr bak dll spf
cab c86 w86 fln d86 dln) do set "%%*="
:: Filename
set "nam=%~nx1"
:: File path
set "pth=%~dp1"
call:\\%~n1 >nul 2>&1 || (
:: Whether the file is protected
set "atr=wfp"
)
:: Some files have special filenames when used by WFP
if not defined fln set "fln=%~nx1"
set "pth=%pth%%nam%"
:: Backup file
set bak="%~dpn1.backup"
:: Files to replace
set dll="%windir%\system32\dllcache\%fln%"
set spf="%windir%\servicepackfiles\i386\%fln%"
set "cab=%fln%"
set "cab=%cab:~0,-1%_"
set c86="%systemdrive%\i386\%cab%"
set w86="%windir%\i386\%cab%"
set d86="%windir%\Driver Cache\i386\%fln%"
:: Temporary copy used when compressing file
set fil="%dir%\%~nx1"
:: Temporary name given to system file
set dln="%~nx1_SafeToDel"
set dlp="%~f1_SafeToDel"
exit/b0
:rst Restore backup
if not exist %bak% (
echo/ ! Backup does not exist:
echo/   %bak%
echo/
echo/Press any key to continue.
pause >nul
exit/b1
) else (
set "mod=%bak%"
)
exit/b0
:cpy Copy file (source, target)
if not %2==%sys% (
attrib -h -r -s %1
if exist %2 (
  attrib -h -r -s %2
)
)
copy/v/y %1 %2 >nul 2>&1 || (
echo/ ! Copy failed.
echo/
call:brk
)
:: Write to undo file
if /i not %1==%bak% (
if /i not %2==%bak% (
  >>%und% echo/del %2
  >>%und% echo/copy %bak% %2
)
)
exit/b
:cab Compress file (source, target)
attrib -r -s -h %2
:: Overwrite compressed backup files (generally in i386 folders)
makecab/v1 %1 %2 >nul 2>&1 || (
echo/ ! Compress failed.
echo/
call:brk
)
del %fil% 2>nul
exit/b
:hlp Display help
echo/Replaces protected system files.
echo/
echo/ Usage:
echo/  %~n0 "ScriptFile"
echo/
echo/ Example:
echo/  %~n0 "C:\Replacer\Script.txt"
echo/
echo/ Script syntax:
echo/  ;; ReplacerScript
echo/  ; Comment
echo/  SystemFileName [,ReplacementFile] [,Reference#] [,Optional]
echo/
echo/ Script example:
echo/  ;; ReplacerScript
echo/  ; Replace Notepad, Calc, Paint
echo/  notepad.exe,notepad.new
echo/  calc.exe,files\calc.new
echo/  mspaint.exe,"C:\Files\paint.new"
echo/  ; Prompt to optionally restore Notepad from backup
echo/  notepad.exe,RESTORE,Optional
echo/
echo/ See readme.txt for ReferenceNumber details.
exit/b
:idt Identify script format (last 3 tokens, sys)
:: Ugly method of determining which tokens are which
set "sys=%~4"
if /i "%~1"=="Restore" (
if "%~2" LSS "9" (
  if "%~2"=="" (
   set "typ=R--"
  ) else (
   if "%~2" GEQ "0" (
    if /i "%~3"=="Optional" (
     set "typ=RNO"
    ) else (
     if /i "%~3"=="" (
      set "typ=RN-"
     )
    )
   )
  )
) else (
  if /i "%~2"=="Optional" (
   set "typ=R-O"
  )
)
) else (
if "%~1" LSS "9" (
  if "%~1"=="" (
   set "typ=---"
  ) else (
   if "%~1" GEQ "0" (
    if /i "%~2"=="Optional" (
     set "typ=-NO"
    ) else (
     if /i "%~2"=="" (
      set "typ=-N-"
     )
    )
   )
  )
) else (
  if /i "%~1"=="Optional" (
   set "typ=--O"
  ) else (
   if "%~2" LSS "9" (
    if "%~2"=="" (
     set "typ=M--"
    ) else (
     if "%~2" GEQ "0" (
      if "%~3"=="" (
       set "typ=MN-"
      ) else (
       if /i "%~3"=="Optional" (
        set "typ=MNO"
       )
      )
     )
    )
   ) else (
    if /i "%~2"=="Optional" (
     set "typ=M-O"
    )
   )
  )
)
)
if not defined typ (
echo/ ! Format of line unknown.
echo/
exit/b1
) else (
call:\%typ% "%~1" "%~2" "%~3"
)
exit/b0
:exm Examine script (sys)
call:scn "%~1"
if not exist "%pth%\%~nx1" (
echo/ ! System file not found:
echo/   "%~1"
echo/
exit/b1
)
if /i not "%mod%"=="Restore" (
if not exist "%mod%" (
  echo/ ! Replacement file not found:
  echo/   "%mod%"
  echo/
  exit/b1
)
)
if not "%num%"=="" (
find/i ":\\%~n1%num%" "%~f0" >nul 2>&1 || (
  echo/ ! Invalid reference number:
  echo/   "%~nx1,%num%"
  echo/
  exit/b1
)
)
exit/b0
:opt Handles optional lines in scripts (sys)
if /i "%opt%"=="Optional" (
echo: ? Replace optional file "%~1"? ^(Y/N^)
setlocal enabledelayedexpansion
call:get var
if /i "!var!"=="Y" (
  endlocal
  call:fmt "%sys%,%mod%,%num%,%opt%"
  exit/b
) else (
  endlocal
)
) else (
call:fmt "%sys%,%mod%,%num%,%opt%"
exit/b1
)
exit/b0
:fmt Format script
:: Fill in tokens if any are missing
set "var=%~1"
set "var=%var:,,=, ,%"
set "var=%var:,,=, ,%"
>>"%scr%-tmp" echo/%var%
exit/b0
:seq Run sequence (4 ordered tokens)
:: Used when replacing files from script
set "pth="
if not "%~3"==" " (
call:\\%~n1%~3
) else (
call:scn %1
)
set "sys=%pth%%~nx1"
if /i "%~2"=="Restore" (
set "mod=%pth%%~n1.backup"
) else (
set "mod=%~f2"
)
call:quo sys
call:quo mod
call:chk %sys% || exit/b
call:chk %mod% || exit/b
call:ver %sys% || exit/b
call:rep
exit/b0
:scn Scan Folders
:: Finds the most likely file match when only filename is given
:: (during scripts or system file input)
set "pth=%~1"
if not "%pth:\=%" == "%pth%" (
set "pth=%~dp1"
) else (
set "pth="
call:\\%~n10 2>nul && exit/b0
:: More common paths at top
for %%* in (
  "%windir%"
  "%windir%\system32"
  "%windir%\system32\drivers"
  "%windir%\system"
  "%programfiles%\Outlook Express"
  "%programfiles%\Windows Media Player"
  "%windir%\Resources\Themes\Luna"
  "%programfiles%\Movie Maker"
  "%programfiles%\Windows NT"
  "%windir%\PCHEALTH\HELPCTR\Binaries"
  "%windir%\Fonts"
  "%programfiles%\Internet Explorer"
  "%programfiles%\Internet Explorer\Connection Wizard"
  "%commonprogramfiles%\Microsoft Shared\MSInfo"
  "%programfiles%\Windows NT\Accessories"
  "%programfiles%\Windows NT\Pinball"
  "%commonprogramfiles%\System"
  "%windir%\system32\Restore"
  "%windir%\system32\srchasst"
  "%windir%\system32\usmt"
  "%commonprogramfiles%\Microsoft Shared\Speech"
  "%programfiles%\NetMeeting"
  "%commonprogramfiles%\System\Mapi\1033"
  "%commonprogramfiles%\Adobe\Calibration"
  "%programfiles%\Symantec\LiveUpdate"
  "%programfiles%\WildTangent\Apps\CDA"
  "%programfiles%\Stardock\Object Desktop\IconPackager"
) do (
  if not exist %fl2% (
   if exist "%%~*\%~nx1" (
    set "pth=%%~*\"
    type nul > %fl2%
   )
  )
)
if exist %fl2% del %fl2%
)
exit/b0
:brk Exit Replacer ([Purge] [Now])
:: Clean up and exit
if not "%~1"=="Purge" (
if not "%~1"=="Now" (
  echo/
  echo/Press any key to quit.
  pause >nul
)
)
if /i not "%~1"=="Purge" if exist "%scr%" popd
for %%* in (%vbs% %fil% %flg%
%fl2% "%scr%" %del% "%scr%-tmp" %dlp%
) do if exist %%* del/f %%* >nul 2>&1
if /i not "%~1"=="Purge" (
if exist "%dir%" rd "%dir%" 2>nul
endlocal
:: Use a hard exit to prevent other loops from continuing
exit
)
exit/b0
:: List of special files requiring more (or less) steps
:\\Luna
set "fln=luna.mst"
set "atr=wfp"
exit/b0
:\\Shellstyle
if /i not "%pth:Homestead=%"=="%pth%" (
set "fln=home_ss.dll"
)
if /i not "%pth:Metallic=%"=="%pth%" (
set "fln=metal_ss.dll"
)
if /i not "%pth:NormalColor=%"=="%pth%" (
set "fln=blue_ss.dll"
)
if /i not "%pth:\system32\=%"=="%pth%" (
set "fln=class_ss.dll"
)
set "atr=wfp"
exit/b0
:\\Marlett
set "atr=non"
exit/b
:\\Comctl32
if /i not "%pth%"=="%windir%\system32\" (
set "atr=non"
)
exit/b
:\\Commdlg
if /i not "%pth%"=="%windir%\system\" (
set "atr=non"
)
exit/b
:\\Notepad
if /i not "%pth%"=="%windir%\" (
set "atr=non"
)
exit/b
:\\Uxtheme.dll
set "atr=wfp"
:\\Comctl320
set "pth=%windir%\system32\"
exit/b
:\\Comctl321
set "pth=%windir%\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.0.0_x-ww_1382d70a\"
exit/b
:\\Comctl322
set "pth=%windir%\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.10.0_x-ww_f7fb5805\"
exit/b
:\\Comctl323
set "pth=%windir%\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.1331_x-ww_7abf6d02\"
exit/b
:\\Comctl324
set "pth=%windir%\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.1515_x-ww_7bb98b8a\"
exit/b
:\\Comctl325
set "pth=%windir%\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2180_x-ww_a84f1ff9\"
exit/b
:\\Commdlg0
set "pth=%windir%\system\"
exit/b
:\\Commdlg1
set "pth=%windir%\system32\"
exit/b
:\\Notepad0
set "pth=%windir%\"
exit/b
:\\Notepad1
set "pth=%windir%\system32\"
exit/b
:\\Shellstyle0
set "pth=%windir%\system32\"
exit/b
:\\Shellstyle1
set "pth=%windir%\Resources\Themes\Luna\Shell\NormalColor\"
exit/b
:\\Shellstyle2
set "pth="%windir%\Resources\Themes\Luna\Shell\Metallic\"
exit/b
:\\Shellstyle3
set "pth=%windir%\Resources\Themes\Luna\Shell\Homestead\"
exit/b
:: List of script line formats
:\RNO
set "mod=Restore"
set "num=%~2"
set "opt=%~3"
exit/b
:\R-O
set "mod=Restore"
set "num="
set "opt=%~2"
exit/b
:\RN-
set "mod=Restore"
set "num=%~2"
set "opt="
exit/b
:\R--
set "mod=Restore"
set "num="
set "opt="
exit/b
:\-N-
set "mod=%sys%"
set "num=%~1"
set "opt="
exit/b
:\-NO
set "mod=%sys%"
set "num=%~1"
set "opt=%~2"
exit/b
:\--O
set "mod=%sys%"
set "num="
set "opt=%~1"
exit/b
:\M--
set "mod=%~1"
set "num="
set "opt="
exit/b
:\MN-
set "mod=%~1"
set "num=%~2"
set "opt="
exit/b
:\M-O
set "mod=%~1"
set "num="
set "opt=%~2"
exit/b
:\MNO
set "mod=%~1"
set "num=%~2"
set "opt=%~3"
exit/b
:\---
set "mod=%sys%"
set "num="
set "opt="
exit/b
:: Clear_WFP_Message.vbs -- clears the WFP message
' Clears WFP message
const win="Windows File Protection"
const wi2="Unable To Locate Component"
set arg=wscript.arguments
if arg.count then
flg=arg.item(0)
else wscript.echo "Bad parameters."
  wscript.quit
end if
set w=wscript.createobject("wscript.shell")
set f=wscript.createobject("scripting.filesystemobject")
x=999
while x > 0
if w.appactivate(win) then
  w.sendkeys "{ESC}"
  w.sendkeys "{TAB}{ENTER}"
end if
if w.appactivate(wi2) then
  w.sendkeys "{ESC}{TAB}{ENTER}"
end if
if f.fileexists(flg) then
  x=45
  f.deletefile(flg)
end if
wscript.sleep 333
x=x-1
wend
<message edited by netxman on Thursday, March 06, 2008 7:58 PM>
 
#1
    DiGiTAL.SkReAM

    • Total Posts : 1259
    • Scores: 7
    • Reward points : 0
    • Joined: 9/7/2005
    • Location: Clearwater, FL, USA
    • Status: offline
    RE: Can I ask question about batch file not vbs? Saturday, March 08, 2008 10:51 AM (permalink)
    0
    It looks pretty straightforward.
    Don't misunderstand... there are some advanced methods of batch language programming performed in the bat, and honestly, I might only have seen one or maybe two .BAT files that were this complex.
    Were there any specific commands that you were unfamiliar with and wanted clarification on?
    maybe i am just lazy, but since the file is already somewhat commented, I REALLY don't feel like doing a line-by-line analysis.
     
    Some things that are done in the batch file that might be confusing:
    && and || are used.
    These two operators allow multiple commands to be entered on one "line". 
    && means "if the first command was successfull, then do the next"
    || means "if the first command had an error, then do the next"
    & means "do the next command regardless of the success of the first.
    For example:
    Say that there is a file named testing.txt in a directory and that it is the ONLY file in that directory.
     dir testing.txt || echo Hello
     =========
     the result of the above would be to give the file details and NOT echo Hello.  Because the file exists, the dir command would not fail.  Therefore, since the dir command did not fail, the echo command would never 'fire'.
     

     
    "Would you like to touch my monkey?" - Dieter (Mike Meyers)

    "It is better to die like a tiger, than to live like a pussy."
    -Master Wong, from Balls of Fury
     
    #2
      netxman

      • Total Posts : 127
      • Scores: 0
      • Reward points : 0
      • Joined: 8/1/2005
      • Status: offline
      RE: Can I ask question about batch file not vbs? Sunday, March 09, 2008 2:56 PM (permalink)
      0
       
      Thank you so much..
       
      I understand much more now about the batch file under your direction.
       
       
       
      The batch is used to replace an in-use system file which under the protection of WFP.  It's very useful.
       
       
       
       
      #3

        Online Bookmarks Sharing: Share/Bookmark

        Jump to:

        Current active users

        There are 0 members and 1 guests.

        Icon Legend and Permission

        • New Messages
        • No New Messages
        • Hot Topic w/ New Messages
        • Hot Topic w/o New Messages
        • Locked w/ New Messages
        • Locked w/o New Messages
        • Read Message
        • Post New Thread
        • Reply to message
        • Post New Poll
        • Submit Vote
        • Post reward post
        • Delete my own posts
        • Delete my own threads
        • Rate post

        2000-2012 ASPPlayground.NET Forum Version 3.9