[Win32/VB.Net] Register timestamp / rechten

Pagina: 1
Acties:

  • WoutF
  • Registratie: Maart 2000
  • Laatst online: 13:12

WoutF

Hoofdredacteur
Topicstarter
Hai,

Ik ben een tooltje voor de systray aan het schrijven om de default sound device aan te passen in Vista. (handig als je wil switchen van boxen naar USB headset bijv.). Dit is allemaal een stuk omslachtiger dan in XP, maar ik ben er na een paar uur zoeken en process sniffen grotendeels uit.

Het werkt allemaal via het setten van bepaalde registry waarden, en daar loop ik even vast.

Als ik de default sound device aanpas, worden er in de key
code:
1
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\{GUID}
({GUID} is dus van het betreffende audio device)
drie identieke hexadecimal waarde weggeschreven, onder de namen Role:0, Role:1 en Role:2
Raar genoeg lijkt die volledig random.

Als ik dus mijn USB headset default maak, veranderen die hex waarden binnen de {GUID} van mijn USB headset. Precies hetzelfde voor mijn geluidskaart.

Omdat het elke keer een andere waarde is, en geen flag (0/1, aan/uit) gok ik (en met hulp van google) dat het hier om een timestamp gaat. Windows zet gewoon een verse timestamp bij die audio device, en degene met de nieuwste timestamp is de default device.

Zover ben ik nu :P Alleen moet ik dus zelf zo'n hex stamp kunnen genereren.

D7 07 09 00 02 00 19 00 0B 00 33 00 36 00 95 01

Dit is zo'n timestamp. 07 zou het jaar kunnen zijn, en 09 de maand. De dag (25) kan ik zo snel niet terug vinden. Of het zou 02 moeten zijn (dinsdag).

Ik kan redelijk uit de voeten in VB.net maar dit is voor mij redelijke abacadabra. Ik zou niet goed weten hoe ik zelf zo'n timestamp moet genereren.
Als iemand mij op de goede weg zou kunnen helpen, of tips kunnen geven ben ik erg blij :)

Dit zijn een paar timestamps een paar seconden na elkaar genomen (rond 13:56 op 25-09-2007)
D7 07 09 00 02 00 19 00 0B 00 36 00 39 00 ED 02
D7 07 09 00 02 00 19 00 0B 00 37 00 2E 00 1A 00
D7 07 09 00 02 00 19 00 0B 00 37 00 38 00 7A 03

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
De drie waarden zijn allemaal incrementing.

Gokje, het aantal (milli)seconden / timerticks sinds 1 jan 1970?

Edit: eh, laat maar. Ik had niet eens de moeite genomen om naar de decimale vertaling van de bytes te kijken :X

[ Voor 34% gewijzigd door MrBucket op 25-09-2007 14:39 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 30-01 13:40

.oisyn

Moderator Devschuur®

Demotivational Speaker

Volgens mij is het gewoon een SYSTEMTIME struct
0x07D7 is het jaar (2007)
0x0009 is de maand (9, september)
0x0002 is de dag van de weeg (2, dinsdag)
0x0019 is de dag in de maand (25)
0x000b is het uur (11)
0x0036 is het aantal minuten (54)
0x0039 is het aantal seconden (57)
0x02ed is het aantal milliseconden (749)

Het is in UTC, vandaar de 11 ipv 13 bij het uur (wij zitten in de tijdzone GMT+1 en hebben bovendien DST, dus dat wordt +2)


De huidige tijd kun je overigens gewoon opvragen met GetSystemTime(), dus je hoeft ook niet moeilijk te doen om zelf die struct te vullen :)

[ Voor 24% gewijzigd door .oisyn op 25-09-2007 14:41 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Xtremelead
  • Registratie: Februari 2001
  • Laatst online: 09:25

Xtremelead

powered by E-MU

D7 07 09 00 02 00 19 00 0B 00 36 00 39 00 ED 02
D7 07 = 2007
09 = september
02 = dinsdag
19 = 25
0b = 11 (11 uur gmt waarschijnlijk, dus 13 in NL)
36 = 54 (minuut)
39 = 57 (seconden)

dan blijven de laatste twee over
de ed en 02 dus
misschien is dat een verwijzing naar het device zelf?

[ Voor 1% gewijzigd door Xtremelead op 25-09-2007 14:41 . Reden: too slow :) ]

Jij bent degene die me opfokt!
JA JIJ!!!


  • WoutF
  • Registratie: Maart 2000
  • Laatst online: 13:12

WoutF

Hoofdredacteur
Topicstarter
Heel erg bedankt! _/-\o_
Nu nog uitzoeken hoe ik registry keys kan lezen en schrijven vanuit VB.net (jaja, noob hier). Maar daar kom ik met google+help file zeker achter :)

  • WoutF
  • Registratie: Maart 2000
  • Laatst online: 13:12

WoutF

Hoofdredacteur
Topicstarter
Ik heb de rest van het programma af (keys uitlezen, lijst van audio devices maken, systemtray selection menu, etc...) alleen heb ik die systemtime struct niet werkend.

Als ik heel eerlijk ben snap ik het gewoon niet. Ik heb een beetje gegoogled en dit zou goede syntax moeten zijn.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    Public Structure SYSTEMTIME
        Public wYear As UInt16
        Public wMonth As UInt16
        Public wDayOfWeek As UInt16
        Public wDay As UInt16
        Public wHour As UInt16
        Public wMinute As UInt16
        Public wSecond As UInt16
        Public wMilliseconds As UInt16
    End Structure
    Dim systime As New SYSTEMTIME

systime.wDay = Date.Now.Day
        systime.wMonth = Date.Now.Month
        systime.wDayOfWeek = Date.Now.DayOfWeek
        systime.wHour = Date.Now.Hour
        systime.wMinute = Date.Now.Minute
        systime.wSecond = Date.Now.Second
        systime.wMilliseconds = Date.Now.Millisecond
        Console.Write(systime)

Dit geeft als output
code:
1
AudioSwitcher.Form1+SYSTEMTIME

Het moet dus uiteindelijk als zo'n HEX getal in een REG_BINARY komen te staan.

Het wegschrijven naar het register lukt wel, maar ik snap echt niet hoe ik zo'n timestamp in zo'n systemtime HEX vorm krijg.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 30-01 13:40

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zoals gezegd, waarom gebruik je niet gewoon de win32 functie GetSystemTime()? Die geeft je gewoon meteen de goede struct terug. En als je 'm al zelf wilt vullen zul je eerst Date.Now op moeten slaan in een losse variabele. Date.Now verandert namelijk constant, waardoor het dus kan gebeuren dat je om 13:59 het uur uitleest (13 dus), en om 14:00 de minuten (0), met als resultaat 13:00.

En het heeft niets met hex te maken, REG_BINARY is binaire data. Oftewel, letterlijk de data dat in die struct staat. Je moet dus het geheugen van die struct gebruiken als data. Dat regedit hex gebruikt als representatie van die data in die key doet er verder niet toe.

[ Voor 25% gewijzigd door .oisyn op 25-09-2007 22:05 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • WoutF
  • Registratie: Maart 2000
  • Laatst online: 13:12

WoutF

Hoofdredacteur
Topicstarter
.oisyn schreef op dinsdag 25 september 2007 @ 22:04:
Zoals gezegd, waarom gebruik je niet gewoon de win32 functie GetSystemTime()? Die geeft je gewoon meteen de goede struct terug. En als je 'm al zelf wilt vullen zul je eerst Date.Now op moeten slaan in een losse variabele. Date.Now verandert namelijk constant, waardoor het dus kan gebeuren dat je om 13:59 het uur uitleest (13 dus), en om 14:00 de minuten (0), met als resultaat 13:00.

En het heeft niets met hex te maken, REG_BINARY is binaire data. Oftewel, letterlijk de data dat in die struct staat. Je moet dus het geheugen van die struct gebruiken als data. Dat regedit hex gebruikt als representatie van die data in die key doet er verder niet toe.
Ok, gebruik nu GetSystemTime, maar waarom krijg ik zo'n rare output in mijn debug window als ik de inhoud van die struct er naar wegschrijf? Ik heb al geprobeerd om systime weg te schrijven naar een registrykey, maar dan komt er dus letterlijk 'AudioSwitcher.Form1+SYSTEMTIME' in die key te staan.

Ik begrijp denk ik het idee van die struct niet, dat is toch gewoon een data container? net als een string/integer/array/etc ?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 30-01 13:40

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik heb net even de documentatie van Microsoft.Win32.RegistryKey door zitten lezen, en blijkbaar verwacht een REG_BINARY value een byte[] als object type in de SetValue() functie. Je moet de struct dus serializen naar een byte array.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • WoutF
  • Registratie: Maart 2000
  • Laatst online: 13:12

WoutF

Hoofdredacteur
Topicstarter
.oisyn schreef op dinsdag 25 september 2007 @ 22:27:
Ik heb net even de documentatie van Microsoft.Win32.RegistryKey door zitten lezen, en blijkbaar verwacht een REG_BINARY value een byte[] als object type in de SetValue() functie. Je moet de struct dus serializen naar een byte array.
_/-\o_ dank dank dank
Ik ben niet zo'n progger, meer iemand die met veel sleur en pleur en voorbeeld code dingen in elkaar weet te prutsen. Maar met de hulp uit dit topic werkt het nu allemaal d:)b

  • WoutF
  • Registratie: Maart 2000
  • Laatst online: 13:12

WoutF

Hoofdredacteur
Topicstarter
Dit topic is gemerged

In navolging van mijn vorige topic zit ik met nog een probleempje.

Ik wil met mijn programma 3 register keys aanpassen die door Windows zelf zijn aangemaakt.
code:
1
2
3
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\{GUID}\Role:0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\{GUID}\Role:1
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\{GUID}\Role:2


Het probleem is, dat Windows de ownership op Read en heeft gezet, niet op Full.
Als ik via regedit naar die sleutel navigeer, kan ik wel wijzigen, maar bijvoorbeeld geen nieuwe key aanmaken.

Daarom crashed mijn programma ook, als ik die sleutel wil gaan aanpassen. Ik moet om de value van bijv Role:0 te wijzigen de parent key namelijk openen for writing.
code:
1
Dim key As RegistryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\" + Data.Item(2, Row.Index).Value.ToString, True)

Die 'True' value aan het eind duidt op het feit dat ik wil gaan schrijven (MSDN). Het probleem is dus, dat het programma op deze regel crashed met een
A first chance exception of type 'System.Security.SecurityException' occurred in mscorlib.dll
Ik heb al in MSDN rondgekeken naar allerlei security settings, maar zover ik het begrijp zijn deze alleen van toepassing op keys die je ZELF maakt, aangezien je daar volledige owner van bent. Volgens mij kan ik niet via een stuk code mezelf Full access tot een key geven die door het OS beheerd wordt.

Maar aangezien ik via regedit die Role:0, Role:1 en Role:2 wel kan editten vraag ik het me af of het mogelijk is om in VB.NET aan te geven dat je niet in die subkey een nieuwe key wil gaan schrijven, maar alleen een bestaande aan wil passen.

[ Voor 0% gewijzigd door een moderator op 26-09-2007 12:30 . Reden: Merge notice toegevoegd ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 30-01 13:40

.oisyn

Moderator Devschuur®

Demotivational Speaker

Euh, waarom gebruik je dan niet gewoon die andere overload van OpenSubKey, waarbij je gewoon specifieke rechten op kunt geven?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • WoutF
  • Registratie: Maart 2000
  • Laatst online: 13:12

WoutF

Hoofdredacteur
Topicstarter
.oisyn schreef op woensdag 26 september 2007 @ 14:42:
Euh, waarom gebruik je dan niet gewoon die andere overload van OpenSubKey, waarbij je gewoon specifieke rechten op kunt geven?
Ik neem aan dat je deze bedoelt?
code:
1
RegistryKey.OpenSubKey Method (String, RegistryKeyPermissionCheck, RegistryRights)


Die had ik ook geprobeerd en geeft dezelfde 'System.Security.SecurityException'. Althans, als ik het goed gebruik (denk het wel)
code:
1
Dim key As RegistryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\" + Data.Item(2, Row.Index).Value.ToString, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl)

Verwijderd

Is er geen api om het default audio device te wijzigen... Kan me nl. niet voorstellen dat dit niet zo is... Dat zou trouwens ook wel de manier zijn... en niet deze registry methode, er staan niet voor niets alleen read rechten op.

  • WoutF
  • Registratie: Maart 2000
  • Laatst online: 13:12

WoutF

Hoofdredacteur
Topicstarter
Verwijderd schreef op woensdag 26 september 2007 @ 15:21:
Is er geen api om het default audio device te wijzigen... Kan me nl. niet voorstellen dat dit niet zo is... Dat zou trouwens ook wel de manier zijn... en niet deze registry methode, er staan niet voor niets alleen read rechten op.
Volgens de MSDN forums is er iig geen gedocumenteerde ondersteunde API call voor.

En het probleem is niet zozeer de rechten, want vanuit regedit kan ik de key wel aanpassen. Het gaat er om dat ik in de code aangeef dat ik alleen een Value wil aanpassen, ipv een nieuwe Key wil schrijven. Voor het eerste heb ik wel rechten, het tweede niet.

*krijgt idee*
*gaat even checken*

found it :D :$
RegistryRights.FullControl mocht niet, maar als ik RegistryRights.SetValue gebruik (en dus dat onderscheid maak) werkt het wel *O*

Bedankt voor de hulp!
AudioSwitcher.exe voor de mensen met Vista die 't willen gebruiken
Maak voor de zekerheid een backup van 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\'

[ Voor 12% gewijzigd door WoutF op 26-09-2007 15:38 ]

Pagina: 1