AutoIt Forums: Control Vista Master Volume - AutoIt Forums

Jump to content

  • (2 Pages)
  • +
  • 1
  • 2
  • You cannot start a new topic
  • You cannot reply to this topic

Control Vista Master Volume Plugin + OSD Volume Script Rate Topic: -----

#1 User is offline   wraithdu 

  • Mass Spammer!
  • PipPipPipPipPipPip
  • Group: Full Members
  • Posts: 1,016
  • Joined: 21-November 07

Posted 23 November 2008 - 07:55 AM

NOTE: This plugin requires the Microsoft VC++ 2008 SP1 Redistributable to be installed.

It's well known that the sound volume functions do not work for Vista's master volume because of Vista's new audio stream system. There's a way to do it, but it requires COM interfaces / objects that AutoIt cannot natively access**, so I wrote a plugin. Here's a collection of the useful interface methods, an example script, and an OSD Volume script. Enjoy!

[ code='text' ]    ( ExpandCollapse - Popup )
/**************************************************************************** * _GetMasterVolume_Vista() * * Returns master volume level in decibels. **************************************************************************** * _GetMasterVolumeScalar_Vista() * * Returns master volume level as a scalar value from 0 to 100. **************************************************************************** * _SetMasterVolume_Vista() * * Sets master volume in decibels. **************************************************************************** * _SetMasterVolumeScalar_Vista() * * Sets master volume level as a scalar value from 0 to 100. **************************************************************************** * _GetVolumeRange_Vista() * * Gets volume decibel range information: * LevelMinDB = minimum decibel value * LevelMaxDB = maximum decibel value * VolumeIncrementDB = decibel increment value **************************************************************************** * _IsMute_Vista() * * Gets the mute state. **************************************************************************** * _SetMute_Vista() * * Sets the mute state. **************************************************************************** * _GetVolumeStepInfo_Vista() * * Gets volume step information: * nStep = current volume step * nStepCount = step range; from 0 to nStepCount - 1 **************************************************************************** * _VolumeStepUp_Vista() * * Increases the volume by 1 step. **************************************************************************** * _VolumeStepDown_Vista() * * Decreases the volume by 1 step. ****************************************************************************/


** Well, it can using ProgAndy's solution with the MemoryDLL funcs. But it's a real pain, and it's unclear whether it will work with all DEP settings.

Example -
[ code='text' ]    ( ExpandCollapse - Popup )
#AutoIt3Wrapper_Plugin_Funcs=_GetMasterVolume_Vista,_GetMasterVolumeScalar_Vista, _ _SetMasterVolume_Vista,_SetMasterVolumeScalar_Vista,_GetVolumeRange_Vista,_IsMute_Vista, _ _SetMute_Vista,_GetVolumeStepInfo_Vista,_VolumeStepUp_Vista,_VolumeStepDown_Vista $hDLL = PluginOpen("vista_vol.dll") ; ## Get current volume levels $vol = _GetMasterVolume_Vista() ConsoleWrite("Get Vol Error: " & @error & @CRLF) ConsoleWrite("Volume: " & $vol & " (decibels)" & @CRLF) $vol = _GetMasterVolumeScalar_Vista() ConsoleWrite("Get Vol Error: " & @error & @CRLF) ConsoleWrite("Volume: " & $vol & " (scalar)" & @CRLF) ; ## Set new volume levels ConsoleWrite("Set vol to -20db..." & @CRLF) _SetMasterVolume_Vista(-20) ConsoleWrite("Set Vol Error: " & @error & @CRLF) $vol = _GetMasterVolume_Vista() ConsoleWrite("Get Vol Error: " & @error & @CRLF) ConsoleWrite("Volume: " & $vol & " (decibels)" & @CRLF) ConsoleWrite("Set vol to scalar 30..." & @CRLF) _SetMasterVolumeScalar_Vista(30) ConsoleWrite("Set Vol Error: " & @error & @CRLF) $vol = _GetMasterVolumeScalar_Vista() ConsoleWrite("Get Vol Error: " & @error & @CRLF) ConsoleWrite("Volume: " & $vol & " (scalar)" & @CRLF) ; ## Get volume range information $range = DllStructCreate("float LevelMinDB;float LevelMaxDB;float VolumeIncrementDB") ConsoleWrite("Get range info..." & @CRLF) _GetVolumeRange_Vista(DllStructGetPtr($range)) ConsoleWrite("Get Range Error: " & @error & @CRLF) ConsoleWrite("MinDB: " & DllStructGetData($range, "LevelMinDB") & @CRLF) ConsoleWrite("MaxDB: " & DllStructGetData($range, "LevelMaxDB") & @CRLF) ConsoleWrite("Increment: " & DllStructGetData($range, "VolumeIncrementDB") & @CRLF) ; ## Set mute states ConsoleWrite("Set mute true..." & @CRLF) _SetMute_Vista(True) ConsoleWrite("Set Mute Error: " & @error & @CRLF) $mute = _IsMute_Vista() ConsoleWrite("Get Mute Error: " & @error & @CRLF) ConsoleWrite("Muted: " & $mute & @CRLF) Sleep(2000) ConsoleWrite("Set mute false..." & @CRLF) _SetMute_Vista(False) ConsoleWrite("Set Mute Error: " & @error & @CRLF) $mute = _IsMute_Vista() ConsoleWrite("Get Mute Error: " & @error & @CRLF) ConsoleWrite("Muted: " & $mute & @CRLF) ; ## Get volume step info ; ## Steps range from 0 to nStepCount - 1 $step = DllStructCreate("uint nStep;uint nStepCount") ConsoleWrite("Get step info..." & @CRLF) _GetVolumeStepInfo_Vista(DllStructGetPtr($step)) ConsoleWrite("Get Step Error: " & @error & @CRLF) ConsoleWrite("Current step: " & DllStructGetData($step, "nStep") & @CRLF) ConsoleWrite("Total steps: 0 to " & DllStructGetData($step, "nStepCount") - 1 & @CRLF) ConsoleWrite("Increase 5 steps..." & @CRLF) For $i = 1 To 5     _VolumeStepUp_Vista() Next _GetVolumeStepInfo_Vista(DllStructGetPtr($step)) ConsoleWrite("Get Step Error: " & @error & @CRLF) ConsoleWrite("Current step: " & DllStructGetData($step, "nStep") & @CRLF) ConsoleWrite("Decrease 2 steps..." & @CRLF) For $i = 1 To 2     _VolumeStepDown_Vista() Next _GetVolumeStepInfo_Vista(DllStructGetPtr($step)) ConsoleWrite("Get Step Error: " & @error & @CRLF) ConsoleWrite("Current step: " & DllStructGetData($step, "nStep") & @CRLF) PluginClose($hDLL)


Volume OSD Script -
[ autoIt ]    ( ExpandCollapse - Popup )
#NoTrayIcon #Region;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Plugin_Funcs=_GetMasterVolumeScalar_Vista,_SetMasterVolumeScalar_Vista #AutoIt3Wrapper_Compression=4 #AutoIt3Wrapper_Res_Comment=OSD Volume Control #AutoIt3Wrapper_Res_Description=VolumeOSD #AutoIt3Wrapper_Res_Fileversion=1.0.1.1 #AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker #AutoIt3Wrapper_Run_Obfuscator=y #Obfuscator_Parameters=/striponly #EndRegion;**** Directives created by AutoIt3Wrapper_GUI **** #include <GuiConstantsEx.au3> #include <ProgressConstants.au3> #include <WindowsConstants.au3> #include <Timers.au3> #include <Misc.au3> #include <WinAPI.au3> #include <StaticConstants.au3> Opt("GUIOnEventMode", 1) Opt("MustDeclareVars", 1) Global $Volume_OSD_MSG = _WinAPI_RegisterWindowMessage("Volume_OSD_MSG") If _Singleton("VolumeOSD_Mutex", 1) == 0 Then; another instance     If $CmdLine[0] == 0 Then Exit; exit if no cmd args     If $CmdLine[1] == "exit" Then _SendMessage(WinGetHandle("VolumeOSD_GUI"), $Volume_OSD_MSG, 1, 0); exit remote prog     Exit EndIf HotKeySet("{VOLUME_UP}", "_vol_up") HotKeySet("{VOLUME_DOWN}", "_vol_down") Global $gui, $prog, $label, $th, $show, $timer = "" Global $hDLL = PluginOpen("vista_vol.dll") Global $hUserDLL = DllOpen("user32.dll") Global $transColor = 0x232323 $th = WinGetPos("[CLASS:Shell_TrayWnd]") $th = $th[3] $gui = GUICreate("VolumeOSD_GUI", 40, 150, @DesktopWidth - 8 - 40, @DesktopHeight - $th - 8 - 150, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_LAYERED)) GUISetBkColor($transColor) $prog = GUICtrlCreateProgress(28, 0, 12, 150, BitOR($PBS_SMOOTH, $PBS_VERTICAL)) $label = GUICtrlCreateLabel("", 0, 135, 25, 20, $SS_RIGHT) GUICtrlSetFont(-1, 10, 600) GUICtrlSetColor(-1, 0xDDDDDD) WinSetOnTop($gui, "", 1) _WinAPI_SetLayeredWindowAttributes($gui, $transColor, 0, 0x03, True) GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit") GUIRegisterMsg($WM_TIMER, "_MY_WM_TIMER") GUIRegisterMsg($Volume_OSD_MSG, "_MY_CUSTOM_MSG") GUISetState() While 1     Sleep(1000) WEnd Func _MY_WM_TIMER($hWnd, $iMsg, $iwParam, $ilParam)     Switch $hWnd         Case $gui             Switch _Timer_GetTimerID($iwParam)                 Case $timer                     _ProgHide()             EndSwitch     EndSwitch     Return $GUI_RUNDEFMSG EndFunc Func _vol_up()     Local $vol         $vol = _GetMasterVolumeScalar_Vista() + 1     If $vol > 100 Then $vol = 100     _SetVolume($vol) EndFunc Func _vol_down()     Local $vol         $vol = _GetMasterVolumeScalar_Vista() - 1     If $vol < 0 Then $vol = 0     _SetVolume($vol) EndFunc Func _SetVolume($vol)     Local $rvol = Round($vol)     _SetMasterVolumeScalar_Vista($vol)     GUICtrlSetData($prog, $rvol)     GUICtrlSetData($label, $rvol)     If Not $show Then _ProgShow()     If $timer = "" Then         $timer = _Timer_SetTimer($gui, 3000)     Else         $timer = _Timer_SetTimer($gui, 3000, "", $timer)     EndIf EndFunc Func _ProgShow()     $show = True     For $i = 0 To 255 Step 20         _WinAPI_SetLayeredWindowAttributes($gui, $transColor, $i, 0x03, True)         Sleep(10)     Next     _WinAPI_SetLayeredWindowAttributes($gui, $transColor, 255, 0x03, True) EndFunc Func _ProgHide()     $show = False     For $i = 255 To 0 Step -10         _WinAPI_SetLayeredWindowAttributes($gui, $transColor, $i, 0x03, True)         Sleep(10)     Next     _WinAPI_SetLayeredWindowAttributes($gui, $transColor, 0, 0x03, True)     _Timer_KillAllTimers($gui)     $timer = "" EndFunc Func _MY_CUSTOM_MSG($hwnd, $msg, $wparam, $lparam)     Switch $hwnd         Case $gui             Switch $wparam                 Case 1                     _Exit()             EndSwitch     EndSwitch EndFunc ;=============================================================================== ; ; Function Name: _WinAPI_SetLayeredWindowAttributes ; Description:: Sets Layered Window Attributes:) See MSDN for more informaion ; Parameter(s): ; $hwnd - Handle of GUI to work on ; $i_transcolor - Transparent color ; $Transparency - Set Transparancy of GUI ; $isColorRef - If True, $i_transcolor is a COLORREF( 0x00bbggrr ), else an RGB-Color ; Requirement(s): Layered Windows ; Return Value(s): Success: 1 ; Error: 0 ; @error: 1 to 3 - Error from DllCall ; @error: 4 - Function did not succeed - use ; _WinAPI_GetLastErrorMessage or _WinAPI_GetLastError to get more information ; Author(s): Prog@ndy ; ; Link : @@MsdnLink@@ SetLayeredWindowAttributes ; Example : Yes ;=============================================================================== Func _WinAPI_SetLayeredWindowAttributes($hwnd, $i_transcolor, $Transparency = 255, $dwFlages = 0x03, $isColorRef = False)     If $dwFlages = Default Or $dwFlages = "" Or $dwFlages < 0 Then $dwFlages = 0x03     If Not $isColorRef Then         $i_transcolor = Hex(String($i_transcolor), 6)         $i_transcolor = Execute('0x00' & StringMid($i_transcolor, 5, 2) & StringMid($i_transcolor, 3, 2) & StringMid($i_transcolor, 1, 2))     EndIf     Local $Ret = DllCall($hUserDLL, "int", "SetLayeredWindowAttributes", "hwnd", $hwnd, "long", $i_transcolor, "byte", $Transparency, "long", $dwFlages)     Select         Case @error             Return SetError(@error, 0, 0)         Case $Ret[0] = 0             Return SetError(4, _WinAPI_GetLastError(), 0)         Case Else             Return 1     EndSelect EndFunc;==>_WinAPI_SetLayeredWindowAttributes Func _Exit()     PluginClose($hDLL)     DllClose($hUserDLL)     Exit EndFunc

Attached File(s)


This post has been edited by wraithdu: 27 April 2009 - 04:26 AM


#2 User is offline   wraithdu 

  • Mass Spammer!
  • PipPipPipPipPipPip
  • Group: Full Members
  • Posts: 1,016
  • Joined: 21-November 07

Posted 23 November 2008 - 05:01 PM

Fixed a few things in the OSD Volume script.

#3 User is offline   raazy 

  • Newbie
  • Group: Members
  • Posts: 2
  • Joined: 20-March 09

Posted 20 March 2009 - 12:18 AM

It works great !!! Many thanks for this.
Tested on Vista x64

#4 User is online   Yashied 

  • Happy in Moscow
  • Icon
  • Group: AutoIt MVPs(MVP)
  • Posts: 1,562
  • Joined: 01-November 08
  • Gender:Male
  • Location:The dark spiral galaxy

Posted 25 April 2009 - 02:30 PM

$hDLL = PluginOpen("vista_vol.dll")

ConsoleWrite($hDLL), $hDLL = 0 - ??? Why?

:huh:

Vista x32 SP1

#5 User is offline   ProgAndy 

  • AutoIt user
  • Icon
  • Group: AutoIt MVPs(MVP)
  • Posts: 1,539
  • Joined: 04-February 08
  • Gender:Male
  • Location:Germany

Posted 25 April 2009 - 04:40 PM

PluinOpen returns a "handle" to the opende plugin which you can use in PluinClose. The first loaded plugin is assigned to index 0, but also 0 is returned for an error.
This wrapper-func should return -1 if the plugin can't be loaded.
[ autoIt ]    ( Popup )
Func _PluginOpen($DLL)     ; Prog@ndy     Local $handle = PluginOpen($DLL)     If $handle > 0 Then Return $handle     Local $aResult = DLLCall("Kernel32.dll", "ptr", "GetModuleHandleW", "wstr", StringReplace($DLL,"/","\"))     If @error Or $aResult[0]=Ptr(0) Then Return SetError(1,0,-1)     Return $handle EndFunc

This post has been edited by ProgAndy: 25 April 2009 - 04:41 PM


#6 User is online   Yashied 

  • Happy in Moscow
  • Icon
  • Group: AutoIt MVPs(MVP)
  • Posts: 1,562
  • Joined: 01-November 08
  • Gender:Male
  • Location:The dark spiral galaxy

Posted 25 April 2009 - 05:16 PM

View PostProgAndy, on Apr 25 2009, 07:40 PM, said:

PluinOpen returns a "handle" to the opende plugin which you can use in PluinClose. The first loaded plugin is assigned to index 0, but also 0 is returned for an error.
This wrapper-func should return -1 if the plugin can't be loaded.
[ autoIt ]    ( Popup )
Func _PluginOpen($DLL)     ; Prog@ndy     Local $handle = PluginOpen($DLL)     If $handle > 0 Then Return $handle     Local $aResult = DLLCall("Kernel32.dll", "ptr", "GetModuleHandleW", "wstr", StringReplace($DLL,"/","\"))     If @error Or $aResult[0]=Ptr(0) Then Return SetError(1,0,-1)     Return $handle EndFunc

Returns (-1). Plugin does not work.

#7 User is offline   ProgAndy 

  • AutoIt user
  • Icon
  • Group: AutoIt MVPs(MVP)
  • Posts: 1,539
  • Joined: 04-February 08
  • Gender:Male
  • Location:Germany

Posted 25 April 2009 - 05:45 PM

I think the plugin needs VC 2008 redistributables. Try to install them:
http://www.microsoft.com/downloads/en/resu...p;stype=s_basic

#8 User is online   Yashied 

  • Happy in Moscow
  • Icon
  • Group: AutoIt MVPs(MVP)
  • Posts: 1,562
  • Joined: 01-November 08
  • Gender:Male
  • Location:The dark spiral galaxy

Posted 25 April 2009 - 06:39 PM

View PostProgAndy, on Apr 25 2009, 08:45 PM, said:

I think the plugin needs VC 2008 redistributables. Try to install them:
http://www.microsoft.com/downloads/en/resu...p;stype=s_basic

ProgAndy, many thanks to you!

:) :) :)

#9 User is offline   bgcngm 

  • Newbie
  • Group: Members
  • Posts: 3
  • Joined: 27-June 09

Posted 27 June 2009 - 12:34 PM

Hello, wraithdu.

I found out your work while searching for a way to give a particular application the control of Vista/Win7 master volume.

The thing is that I have an old Sony Vaio laptop (VGN S2XP) that needs a special application (Sony Hotkey Utility) to control the laptop FN keys. The problem is that this program was designed for Windows XP and Sony doesn't support Vista on this laptop. As Vista/Win7 has per-application volume control, this program doesn't work anymore. It detects the VOL + and VOL -, but instead of changing master volume it only changes the volume associated with the app.

Here's a screenshot:

http://i326.photobucket.com/albums/k432/bgcngm/screenshot1.jpg

My hope was to "modify" this application so it could control directly Vista master volume. This utility consists of two .exe and two .dll files. I was thinking if there was some way to decompile this app and to adapt it using your plugin, but my programming skills aren't good enough. Do you think you can help me? Is this possible or is it an impossible mission?

The program can be downloaded here: Sony HotKey Utility.

Thanks in advance.

#10 User is online   Yashied 

  • Happy in Moscow
  • Icon
  • Group: AutoIt MVPs(MVP)
  • Posts: 1,562
  • Joined: 01-November 08
  • Gender:Male
  • Location:The dark spiral galaxy

Posted 27 June 2009 - 12:58 PM

I am curious that Sony had written in the license agreement for this program? Do you think? :)

Maybe you like this.

This post has been edited by Yashied: 07 November 2009 - 01:58 PM


#11 User is offline   bgcngm 

  • Newbie
  • Group: Members
  • Posts: 3
  • Joined: 27-June 09

Posted 27 June 2009 - 01:14 PM

View PostYashied, on Jun 27 2009, 11:58 AM, said:

I am curious that Sony had written in the license agreement for this program? Do you think? :)

Maybe you like this.


Hmmm... That program is nice, although it doesn't detect my FN+VOL+ and FN+VOL- keys.

Regarding my previous questions... Do you think it is possible?

#12 User is offline   wraithdu 

  • Mass Spammer!
  • PipPipPipPipPipPip
  • Group: Full Members
  • Posts: 1,016
  • Joined: 21-November 07

Posted 27 June 2009 - 06:01 PM

No, not possible. No way can I hack Sony's program to change how it works. Your best bet is to try and find out how to detect your volume hot keys. Maybe write a keyboard hook and integrate it into my volume OSD script? Or try to find out what those hotkeys are exactly, and set them using AutoIt or a direct call to the RegisterHotKey API. You'll need to figure out what the virtual key code is for the FN key on a laptop though.

This post has been edited by wraithdu: 27 June 2009 - 06:22 PM


#13 User is offline   monoceres 

  • Do you want my avatar to go American all over your ass?
  • Icon
  • Group: AutoIt MVPs(MVP)
  • Posts: 3,311
  • Joined: 04-June 07
  • Gender:Male
  • Location:Linköping, Sweden

Posted 27 June 2009 - 06:13 PM

View Postbgcngm, on Jun 27 2009, 01:34 PM, said:

Hello, wraithdu.

I found out your work while searching for a way to give a particular application the control of Vista/Win7 master volume.

The thing is that I have an old Sony Vaio laptop (VGN S2XP) that needs a special application (Sony Hotkey Utility) to control the laptop FN keys. The problem is that this program was designed for Windows XP and Sony doesn't support Vista on this laptop. As Vista/Win7 has per-application volume control, this program doesn't work anymore. It detects the VOL + and VOL -, but instead of changing master volume it only changes the volume associated with the app.

Here's a screenshot:



My hope was to "modify" this application so it could control directly Vista master volume. This utility consists of two .exe and two .dll files. I was thinking if there was some way to decompile this app and to adapt it using your plugin, but my programming skills aren't good enough. Do you think you can help me? Is this possible or is it an impossible mission?

The program can be downloaded here: Sony HotKey Utility.

Thanks in advance.


How skilled are you when it comes to more low-level winapi stuff? I would simply inject a dll that hooks the winapi function that handles setting the sound level (my guess: waveOutSetVolume) and then call a function that changes vista's sound level instead.

Some info on api hooking in my sig, if you still don't get it, hit me a pm and we'll see if we can work something out :)

This post has been edited by monoceres: 27 June 2009 - 06:25 PM


#14 User is online   Yashied 

  • Happy in Moscow
  • Icon
  • Group: AutoIt MVPs(MVP)
  • Posts: 1,562
  • Joined: 01-November 08
  • Gender:Male
  • Location:The dark spiral galaxy

Posted 27 June 2009 - 06:16 PM

Fn key on your laptop does not generate a scancode (99%).

EDIT:

I think this can be realized only through the keyboard driver.

This post has been edited by Yashied: 07 November 2009 - 01:58 PM


#15 User is offline   wraithdu 

  • Mass Spammer!
  • PipPipPipPipPipPip
  • Group: Full Members
  • Posts: 1,016
  • Joined: 21-November 07

Posted 27 June 2009 - 06:21 PM

Iteresting info on the Fn key, and good idea monoceres. Looks like it might be possible though to find out what virtual key code is being sent by the *combination* of the Fn+Vol keys. Then you can hook that, either with a global keyboard hook or with the RegisterHotKey api.

#16 User is offline   wraithdu 

  • Mass Spammer!
  • PipPipPipPipPipPip
  • Group: Full Members
  • Posts: 1,016
  • Joined: 21-November 07

Posted 27 June 2009 - 06:27 PM

Here's a good place to start -

http://www.autoitscript.com/forum/index.php?showtopic=90492

#17 User is offline   bgcngm 

  • Newbie
  • Group: Members
  • Posts: 3
  • Joined: 27-June 09

Posted 27 June 2009 - 06:45 PM

View Postmonoceres, on Jun 27 2009, 05:13 PM, said:

How skilled are you when it comes to more low-level winapi stuff? I would simply inject a dll that hooks the winapi function that handles setting the sound level (my guess: waveOutSetVolume) and then call a function that changes vista's sound level instead.

Some info on api hooking in my sig, if you still don't get it, hit me a pm and we'll see if we can work something out :)


As I told before, my programing skills aren't good enough to make this on my own. I've only learned C in the university, but didn't practice anymore.

Could you help me getting this to work?

#18 User is offline   Roadhog 

  • Newbie
  • Group: Members
  • Posts: 2
  • Joined: 03-July 09

Post icon  Posted 04 July 2009 - 12:18 AM

having trouble installing Control Vista Master Volume, Plugin + OSD Volume Script, could i get some help please. :wacko:

#19 User is offline   wraithdu 

  • Mass Spammer!
  • PipPipPipPipPipPip
  • Group: Full Members
  • Posts: 1,016
  • Joined: 21-November 07

Posted 04 July 2009 - 12:24 AM

I replied to your PM. Try to keep your communication to one avenue. Spamming forum posts and PMs is a good way to anger the forum gods.

#20 User is offline   Roadhog 

  • Newbie
  • Group: Members
  • Posts: 2
  • Joined: 03-July 09

Posted 04 July 2009 - 12:30 AM

Thanks for your quick reply, misunderstood purpose of script. I thought it was a script that actually affected vistaX64 OS software volume control. Having trouble with low volume output on my new systems onboard sound card. :huh:

  • (2 Pages)
  • +
  • 1
  • 2
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users