OEM-Informationen ändern

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

OEM-Informationen ändern

Beitrag von a14xerus »

Windows 7 and Windows Vista:

Download: http://upload.alexander-n.de/=MzQuMTI2OTM2NjA2OA==
Code:

Code: Alles auswählen

; gPreferences[460-5-1-1-1050-170-0-432-281]

; a14xerus
; http://alexander-n.de/ 
; 23.03.2010

EnableExplicit

UsePNGImageDecoder()
UseJPEGImageDecoder()


;registry.pbi (jaPBe)
Procedure.i Reg_SetValue(topKey.i, sKeyName.s, sValueName.s, vValue.s, lType.i, ComputerName.s = "")
  Protected lpData.s=Space(255)
  Protected *GetHandle, hKey.i, lReturnCode.i, lhRemoteRegistry.i, lpcbData, lValue.i, ergebnis.i
  
  If Left(sKeyName, 1) = "\"
    sKeyName = Right(sKeyName, Len(sKeyName) - 1)
  EndIf
  
  If ComputerName = ""
    *GetHandle = RegOpenKeyEx_(topKey, sKeyName, 0, #KEY_ALL_ACCESS, @hKey)
  Else
    lReturnCode = RegConnectRegistry_(ComputerName, topKey, @lhRemoteRegistry)
    *GetHandle = RegOpenKeyEx_(lhRemoteRegistry, sKeyName, 0, #KEY_ALL_ACCESS, @hKey)
  EndIf
  
  If *GetHandle = #ERROR_SUCCESS
    lpcbData = 255
    
    Select lType
      Case #REG_SZ
        *GetHandle = RegSetValueEx_(hKey, sValueName, 0, #REG_SZ, @vValue, Len(vValue) + 1)
      Case #REG_DWORD
        lValue = Val(vValue)
        *GetHandle = RegSetValueEx_(hKey, sValueName, 0, #REG_DWORD, @lValue, 4)
    EndSelect
    
    RegCloseKey_(hKey)
    ergebnis = 1
    ProcedureReturn ergebnis
  Else
    RegCloseKey_(hKey)
    ergebnis = 0
    ProcedureReturn ergebnis
  EndIf
EndProcedure
Procedure.s Reg_GetValue(topKey.i, sKeyName.s, sValueName.s, ComputerName.s = "")
  Protected lpData.s=Space(255), GetValue.s
  Protected *GetHandle, hKey.i, lReturnCode.i, lhRemoteRegistry.i, lpcbData.i, lType.i, lpType.i
  Protected lpDataDWORD.i
  
  If Left(sKeyName, 1) = "\"
    sKeyName = Right(sKeyName, Len(sKeyName) - 1)
  EndIf
  
  If ComputerName = ""
    *GetHandle = RegOpenKeyEx_(topKey, sKeyName, 0, #KEY_ALL_ACCESS, @hKey)
  Else
    lReturnCode = RegConnectRegistry_(ComputerName, topKey, @lhRemoteRegistry)
    *GetHandle = RegOpenKeyEx_(lhRemoteRegistry, sKeyName, 0, #KEY_ALL_ACCESS, @hKey)
  EndIf
  
  If *GetHandle = #ERROR_SUCCESS
    lpcbData = 255
    
    
    *GetHandle = RegQueryValueEx_(hKey, sValueName, 0, @lType, @lpData, @lpcbData)
    
    If *GetHandle = #ERROR_SUCCESS
      Select lType
        Case #REG_SZ
          *GetHandle = RegQueryValueEx_(hKey, sValueName, 0, @lType, @lpData, @lpcbData)
          
          If *GetHandle = 0
            GetValue = Left(lpData, lpcbData - 1)
          Else
            GetValue = ""
          EndIf
          
        Case #REG_DWORD
          *GetHandle = RegQueryValueEx_(hKey, sValueName, 0, @lpType, @lpDataDWORD, @lpcbData)
          
          If *GetHandle = 0
            GetValue = Str(lpDataDWORD)
          Else
            GetValue = "0"
          EndIf
          
      EndSelect
    EndIf
  EndIf
  RegCloseKey_(hKey)
  ProcedureReturn GetValue
EndProcedure

Procedure.i WriteOEM(Manufacturer.s, Model.s="", SupportURL.s="", SupportHours.s="", SupportPhone.s="", Logo.s="")
  Protected Ret.i = #True
  Ret * Reg_SetValue(#HKEY_LOCAL_MACHINE, "\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation", "Manufacturer", Manufacturer, #REG_SZ)
  Ret * Reg_SetValue(#HKEY_LOCAL_MACHINE, "\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation", "Model", Model, #REG_SZ)
  Ret * Reg_SetValue(#HKEY_LOCAL_MACHINE, "\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation", "SupportHours", SupportHours, #REG_SZ)
  Ret * Reg_SetValue(#HKEY_LOCAL_MACHINE, "\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation", "SupportPhone", SupportPhone, #REG_SZ)
  Ret * Reg_SetValue(#HKEY_LOCAL_MACHINE, "\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation", "SupportURL", SupportURL, #REG_SZ)
  Ret * Reg_SetValue(#HKEY_LOCAL_MACHINE, "\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation", "Logo",Logo, #REG_SZ)
  ProcedureReturn Ret
EndProcedure


Global Window.l, image.l
Enumeration
  #G_Manu
  #G_Model
  #G_SupportHours
  #G_SupportPhone
  #G_SupportURL
  #G_Logo
  #G_LogoBrowse
  #G_Image
  #G_Save
EndEnumeration

Procedure.d Min(Value1.d,Value2.d); Return the lower value
  If Value1>Value2
    ProcedureReturn Value2
  Else
    ProcedureReturn Value1
  EndIf
EndProcedure
Procedure.s GetSpecialFolderPath(CSIDL.l)
  Protected LibraryID
  Protected Path.s = Space(#MAX_PATH)
  
  LibraryID = OpenLibrary(#PB_Any, "shell32.dll")
  If LibraryID
    CallFunction(LibraryID, "SHGetSpecialFolderPathA", 0, @Path, CSIDL, 0)
    CloseLibrary(LibraryID)
  EndIf
  
  ProcedureReturn Path
EndProcedure

Procedure OpenWindows()
  Window = OpenWindow(#PB_Any, #PB_Ignore, #PB_Ignore, 416, 204, "OEM-Branding for Windows 7 and Vista", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  If Window
    ;If CreateGadgetList(WindowID(Window))
      Frame3DGadget(-1, 5, 5, 270, 165, "OEM-Informations")
      TextGadget(-1, 15, 20, 100, 20, "Manufacturer")
      StringGadget(#G_Manu, 115, 20, 150, 20, "")
      TextGadget(-1, 15, 40, 100, 20, "Model")
      StringGadget(#G_Model, 115, 40, 150, 20, "")
      TextGadget(-1, 15, 60, 100, 20, "SupportURL")
      StringGadget(#G_SupportURL, 115, 60, 150, 20, "")
      TextGadget(-1, 15, 80, 100, 20, "SupportHours")
      StringGadget(#G_SupportHours, 115, 80, 150, 20, "")
      TextGadget(-1, 15, 100, 100, 20, "SupportPhone")
      StringGadget(#G_SupportPhone, 115, 100, 150, 20, "")
      TextGadget(-1, 15, 120, 100, 20, "Logo")
      StringGadget(#G_Logo, 115, 120, 150, 20, "")
      ButtonGadget(#G_LogoBrowse, 115, 140, 150, 20, "Browse")
      Frame3DGadget(-1, 280, 5, 130, 165, "Logo")
      ImageGadget(#G_Image, 285, 20, 120, 120, 0)
      ButtonGadget(#G_Save, 330, 175, 80, 25, "Save")
      ProcedureReturn #True
    ;EndIf
  EndIf
  ProcedureReturn #False
EndProcedure
Procedure LoadOEM(*dummy)
  SetGadgetText(#G_Manu,Reg_GetValue(#HKEY_LOCAL_MACHINE, "\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation", "Manufacturer"))
  SetGadgetText(#G_Model,Reg_GetValue(#HKEY_LOCAL_MACHINE, "\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation", "Model"))
  SetGadgetText(#G_SupportHours,Reg_GetValue(#HKEY_LOCAL_MACHINE, "\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation", "SupportHours"))
  SetGadgetText(#G_SupportPhone,Reg_GetValue(#HKEY_LOCAL_MACHINE, "\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation", "SupportPhone"))
  SetGadgetText(#G_SupportURL,Reg_GetValue(#HKEY_LOCAL_MACHINE, "\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation", "SupportURL"))
  Protected Logo.s
  Logo = Reg_GetValue(#HKEY_LOCAL_MACHINE, "\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation", "Logo")
  SetGadgetText(#G_Logo,Logo)
  If Logo
    image = LoadImage(-1,Logo,#PB_Image_DisplayFormat)
    SetGadgetState(#G_Image,ImageID(image))
  EndIf
EndProcedure

Procedure browse(*Logo)
  Protected factor.d, Logo.s = PeekS(*Logo)
  Logo = OpenFileRequester("Choose OEM-Logo",Logo,"Supported images|*.jpg;*.jpeg;*.png;*.bmp",0)
  If Logo
    If image
      If IsImage(image)
        FreeImage(image)
        image = 0
      EndIf
    EndIf
    image = LoadImage(-1,Logo,#PB_Image_DisplayFormat)
    If image
      If ImageHeight(image) > 120 Or ImageWidth(image) > 120
        factor = Min(120/ImageWidth(image), 120/ImageHeight(image))
        ResizeImage(image,Round(factor * ImageWidth(image),0),Round(factor * ImageHeight(image),0))
      EndIf
      SetGadgetState(#G_Image,ImageID(image))
      SetGadgetText(#G_Logo,Logo)
    Else
      MessageRequester("Error","Unable to load image "+Logo,#MB_ICONERROR)
      SetGadgetText(#G_Logo,"")
    EndIf
  Else
    Debug "no image selected"
  EndIf
EndProcedure
Procedure save(*dummy)
  Protected Logo.s = "", ok.i = #False
  If image And GetGadgetText(#G_Logo)
    If IsImage(image)
      Logo = GetSpecialFolderPath(#CSIDL_WINDOWS)+"\oem-logo.bmp"
      If Not SaveImage(image,Logo,#PB_ImagePlugin_BMP)
        Logo = ""
      EndIf
    EndIf
  EndIf
  SetGadgetText(#G_Logo,Logo)
  ok = #False
  If WriteOEM(GetGadgetText(#G_Manu),GetGadgetText(#G_Model),GetGadgetText(#G_SupportURL),GetGadgetText(#G_SupportHours),GetGadgetText(#G_SupportPhone),GetGadgetText(#G_Logo))
    ; test manu-entry for validation (not safe, but more than nothing :D )
    If GetGadgetText(#G_Manu) = Reg_GetValue(#HKEY_LOCAL_MACHINE, "\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation", "Manufacturer")
      ok = #True
    EndIf
  EndIf
  If ok
    MessageRequester("Success","OEM-Information saved!",#MB_ICONINFORMATION)
  Else 
    MessageRequester("Error","OEM-Information not saved!"+Chr(10)+"Program started as Administrator?",#MB_ICONERROR)
  EndIf
EndProcedure
 

Procedure main_loop()
  Protected event.i, g_event.i, tmp.s 
  Repeat
    event = WindowEvent()
    Select event
      Case #PB_Event_CloseWindow
        End
      Case #PB_Event_Gadget
        g_event = EventGadget()
        Select g_event
          Case #G_LogoBrowse
            tmp = GetGadgetText(#G_Logo)
            CreateThread(@browse(),@tmp)
          Case #G_Save
            CreateThread(@save(),0)
        EndSelect
    EndSelect
    Delay(10)
  ForEver
EndProcedure

Procedure init_Program()
  If Not OpenWindows()
    End
  EndIf
  CreateThread(@LoadOEM(),0)
  main_loop()
EndProcedure

init_Program()
Zuletzt geändert von a14xerus am 25.03.2010 22:02, insgesamt 3-mal geändert.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: OEM-Informationen ändern

Beitrag von ts-soft »

Auf einem 64-Bit System kann man Deinen Source nicht nutzen!

1. Mit 32-Bit kompiliert landet alles im Wow64 Dschungel.
2. Mit 64-Bit hat man keine Chance es zu kompilieren, weil Du
mindestens 100 .l zu viel im Code hast :mrgreen:

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Re: OEM-Informationen ändern

Beitrag von a14xerus »

Code und Download geupptdated.

Habe leider kein 64bit um das zu testen :(

Hoffe aber das es jetzt geht...
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: OEM-Informationen ändern

Beitrag von c4s »

Code hat geschrieben:Protected *GetHandle.l, hKey.i, lReturnCode.i, lhRemoteRegistry.i, lpcbData, lValue.i, ergebnis.i
In den meisten Fällen kann und sollte man einfach ganz auf .l und .i verzichten.
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: OEM-Informationen ändern

Beitrag von ts-soft »

a14xerus hat geschrieben:Code und Download geupptdated.

Habe leider kein 64bit um das zu testen :(

Hoffe aber das es jetzt geht...
Naja, fast :wink:

Code: Alles auswählen

Procedure save(dummy)
dummy ist natürlich auch ein Integer!
Ich weiß ja nicht wozu Du soviele sinnlose Threads eingebaut hast, aber gerade dort muß dann alles stimmen,
also kein Procedure.l und kein long als parameter!

Jetzt funktioniert das Programm, aber bekomme die OEM-Versions-Informationen immer noch nicht zu sehen?

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Re: OEM-Informationen ändern

Beitrag von a14xerus »

ts-soft hat geschrieben: Ich weiß ja nicht wozu Du soviele sinnlose Threads eingebaut hast, aber gerade dort muß dann alles stimmen,
also kein Procedure.l und kein long als parameter!
ts-soft hat geschrieben: Jetzt funktioniert das Programm, aber bekomme die OEM-Versions-Informationen immer noch nicht zu sehen?
Also mit OEM-Info mein ich die die auf der Computer-Eigenschaften-seite stehen:
Bild

Eigentlich sollte das zeug da auch stehen....
Vielleicht geht das bei 64bit nicht so einfach?... aber kann ich mir eigentlich nicht vorstellen....
also würde mich schon i-wie wundern.

Wie siehts den naus wenn du selber einfach da eigene Werte reinschreibst, erscheinen die dann in der Übersicht, bzw beim nächsten start des Programms?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: OEM-Informationen ändern

Beitrag von ts-soft »

a14xerus hat geschrieben: Wie siehts den naus wenn du selber einfach da eigene Werte reinschreibst, erscheinen die dann in der Übersicht, bzw beim nächsten start des Programms?
Er schreibt ja jetzt die Werte rein und zeigt sie mir auch an, aber der Eigenschaften-Dialog zeigts nicht.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Re: OEM-Informationen ändern

Beitrag von a14xerus »

Das ist natürlich traurig ^^

Ne im ernst, keine ahnung..
Ich mein warum sollte das bei 64bit anders funktionieren???

Nur um sicherzugehen: Das muss natürlich mit Admin-rechten gestartet werden, sonst gehts nich....
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: OEM-Informationen ändern

Beitrag von ts-soft »

a14xerus hat geschrieben:Nur um sicherzugehen: Das muss natürlich mit Admin-rechten gestartet werden, sonst gehts nich....
Bei den von Dir verwendeten Registry-Funktionen schreibt er ohne Admin-Rechte nicht mal, wo
mein eigentlich keine Admin-Rechte benötigen würde :wink:

Vielleicht nimmt er die auch nur noch in Unicode unter x64, aber da scheitert Dein Code ja schon beim
Specialpath ermitteln und die 256 Zeichenbegrenzung für Strings kennt die Registry auch nicht, also solch
veralteten Code würde ich hier nicht posten :wink:

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten