![]() |
Winlogon, Welcome Screen
Hi,
ich bin mir nicht mehr so ganz sicher, wo ich die sources gefunden habe, aber dabei kam mir folgende Idee... Wenn man z.B. Kaspersky Antivirus installiert, dann zeichnen die im Windows XP Welcome Screen, den Text: "Kaspersky Antivirus" das würde ich auch gerne erreichen, nur halt mit meinen Text... Jetzt hab ich mal ein wenig gelesen und bin dabei über die Möglichkeit: Winlogon Notification Packages gestossen, demnach sollte das ja möglich sein, wenn man seine DLL im System registriert (entsprechender Registry Pfad)... Problem: Irgendwie zeichend er mir den Text jetzt leider nur hinter den Welcome Screen (denke mal ist der User Desktop), wie bekomme ich das denn hin, dass er mir den meinen Text auf den Welcome Screen z.B. ganz oben links zeichnet?????? vermutlich ist dass Problem das ich nicht weiss, wie ich den Welcome Desktop Screen ermitteln soll und somit auf den Canvas meinen Text zeichnen kann... Mal der Source (wie gesagt kann mich nicht mehr erinnern wo der her ist...) :-(
Delphi-Quellcode:
Vielen Dank
library sLogon;
uses Windows, Graphics, Sysutils, types; type PWSTR = PWideChar; HANDLE = Longword; PFNMSGECALLBACK = function(bVerbose: BOOL; lpMessage: LPWSTR): DWORD; stdcall; _WLX_NOTIFICATION_INFO = record Size: ULONG; Flags: ULONG; UserName: PWSTR; Domain: PWSTR; WindowStation: PWSTR; hToken: HANDLE; hDesktop: HDESK; pStatusCallback: PFNMSGECALLBACK; end; WLX_NOTIFICATION_INFO = _WLX_NOTIFICATION_INFO; PWLX_NOTIFICATION_INFO = ^WLX_NOTIFICATION_INFO; procedure DrawPicture(const FileName: String; Width: Integer = 0; Height: Integer = 0; Top: Integer = 0; Left: Integer = 0); var DC : HDC; Canvas : TCanvas; Bitmap : TBitmap; begin // Falls die Datei existiert, dann fortfahren if FileExists(FileName) then begin Bitmap := TBitmap.Create(); try Bitmap.LoadFromFile(FileName); // Falls eigene Parameter angeben sind, werden diese benutzt. if Height > 0 then Bitmap.Height := Height; if Width > 0 then Bitmap.Width := Width; // Wir holen uns den 'Device Context' vom Desktop DC := GetWindowDC(GetDesktopWindow()); try Canvas := TCanvas.Create(); try // Wir weisen den DC dem Canvas zu Canvas.Handle := DC; // Das Bild wird an Left / Top auf den Desktop gezeichnet Canvas.Draw(Left, Top, Bitmap); finally Canvas.Free; end; finally ReleaseDC(0, DC); end; finally Bitmap.Free; end; end; end; procedure WLEventLogon(pInfo: PWLX_NOTIFICATION_INFO); stdcall; begin DrawPicture('MG.bmp', 0, 0, 0, 0); end; procedure WLEventLogoff(pInfo: PWLX_NOTIFICATION_INFO); stdcall; begin DrawPicture('MG.bmp', 0, 0, 0, 0); end; exports WLEventLogon, WLEventLogoff; begin end. Marc |
Re: Winlogon, Welcome Screen
Wundert mich eigentlich :
Der Desktop ist auch nur ein Fenster. Wenn eine externe Anwendung dort was draufmalt, und dies nicht ständig wiederholt, dann wird der Text irgendwann überschrieben. |
Re: Winlogon, Welcome Screen
Zitat:
Ich würde gerne oben links in der Ecke von Welcome Screen unter XP etwas malen... Obiger Code mal aber auf den User Desktop, daher Frage: wie bekomme ich den DC vom Welcome Screen? Siehe DrawPicture: // Wir holen uns den 'Device Context' vom Desktop DC := GetWindowDC(GetDesktopWindow()); Dürfte hier wohl falsch sein, da GetDesktopWindow wohl nicht den Willkommen Bildschirm holt, anstelle dessen aber den Benutzerbildschirm (wie ich darauf komme? Weiss ich auch nicht so genau, aber wenn ich die dll in der Registry eintrage und einen Neustart mache dann sieht man ganz kurz, bevor der Willkommensbildschirm kommt meinen Text, welcher anscheinend hinter dem Willkommensbildschirm liegt (also Benutzerdesktop)? Gruss s! |
Re: Winlogon, Welcome Screen
Was ist der Willkommensbildschirm für dich?
Der Desktop mit dem LoginDialog ist ein anderer als der normale Desktop für die Anwendungen. Ich nehme an, du willst den Anmeldebildschirm-Desktop oder? Dieser Desktop heißt "winlogon". Er ist von normalen Benutzerprogrammen nicht erreichbar. Man müsste ein Program durch einen Dienst in die Session des Benutzers starten (mit SYSTEM Rechten). Dieses programm könnte ein kleines Fenster mit dem Text in den Winlogonbildschirm einblenden. Ohne Fensterrand und mit Hintergrundfarbe (oder Transparenz) sieht das so aus, als ob da ein Text auf dem Desktop steht. Wenn du auf den normalen Desktop einfach so - und nur einmal - einen Text zeichnest, dann wird dieser Text gelöscht, sobald der Desktop sich neumalt, z.B. weil ein Fenster darüber bewegt wird. Wen dein Code als Systembenutzer ausgeführt wird, dann kannst du mit OpenDesktop('winlogon',...) und SetThreadDesktop sowie GetDesktopWindow den winlogon Desktop möglicherweise auch bekommen. Die JWSCL kann das in OOP. Ich vermute mal, es sieht etwa so aus, wie im Quelltext. Aber ich kann nicht versprechen, dass es funkz:
Delphi-Quellcode:
Der Code muss als SYSTEM Benutzer ausgeführt werden. Zudem muss die SessionID des Prozesses, die Session des jeweiligen angemeldeten Benutzers sein.
uses Windows, JwsclDesktops;
var Desktop: TJwSecurityDesktop; begin Desktop:=TJwSecurityDesktop.OpenDesktop('winlogon', [], false, GENERIC_ALL); Desktop.SetThreadDesktop; try DrawPicture('MG.bmp', 0, 0, 0, 0); finally Desktop.Free; end; end; Z.B. Windows XP - Ein Benutzer angemeldet. Session ID muss 0 sein. Das kann noch ein Dienst machen. - Zwei Benutzer angemeldet. Session ID muss 0 und 1 sein. Also hier brauchen wir zwei Prozesse in Session 0 (erster Benutzer) und Session 1 (zweiter Benutzer). Session 0 kann noch ein Dienst machen. Session 1 nicht mehr. Hier muss der Dienst ein Programm in diese Session starten. Windows Vista. -Ein Benutzer angeldet. Session ID muss 1 sein. Ein Dienst kann hier nichts machen. Hier muss der Dienst ein Programm in diese Session starten. -weitere Benutzer, wie in XP |
Re: Winlogon, Welcome Screen
Zitat:
???????????????? Bahnhof! Mir ist deine Erklärung nicht ganz klar, weil ich nicht verstehe wofür ich einen Dienst brauche, wenn man so wie ich das verstanden habe dem System (OS) mittels Registryeintrag bekannt gibt, das man eine Notification DLL gebaut hat....? Meine DLL wird ja von der Winlogon.exe geladen (merk ich daran, wenn ich meine DLL aus dem System32 Verzeichnis löschen will, meckert Windows, das Winlogon.exe Zugriff auf meine DLL hat (Unlocker sei dank!) abgesehen davon kann ich ja z.B. ne Messagebox im Winlogon ausgeben also bin ich doch in der richtigen Ebene oder meinst du, wenn ich den Winlogon Zeichnen will dann brauch ich nen Service????... Besteht nicht die Möglichkeit, aus meiner DLL ein Fenster zu starten, welches sich in meiner DLL befindet? Quasi in etwa so:
Delphi-Quellcode:
procedure WLEventLogon(pInfo: PWLX_NOTIFICATION_INFO); stdcall;
begin dllFormShow.ShowForm; end; |
Re: Winlogon, Welcome Screen
Das WINDOWS-eigene Programm, das für den Logon-Bildschirm zuständig ist, heisst Gina.DLL(msgina.dll,shgina.dll). Google einfach danach. Es gibt massenhaft Programme, die Gina.DLL ersetzen.
![]() |
Re: Winlogon, Welcome Screen
1. GINA gibt es nicht mehr in Vista
2. Ich bin mir nicht sicher, aber die Callbackfunktion könnte ohne eigenen Thread aufgerufen werden. Solange du also in der Callbackfunktion irgendwas machst, kwird der Winlogon Prozess nicht funktionieren. 3. Wenn dein Programmcode innerhalb von Winlogon crasht, wird der Prozess beendet und der PC startet automatisch neu. |
Re: Winlogon, Welcome Screen
Yo da bin ich nochmal, ich verzweifel langsam!
Vielleicht drehen wir das ganze nochmal ein wenig zurück, sofern noch interesse besteht, ich hänge mal am Schluß meines Fragekataloges den Quelltext der DLL mit rein... Folgendes hat sich geändert, ich versuche jetzt nicht mehr direkt, auf den Winlogon zu zeichnen, dass klappt irgendwie mal überhaupt nicht, keine Ahnung wie Kaspersky das gemacht hat, aber ich vermute mal das der KAV Dienst dabei behilflich ist... Ich verfolge da einen anderen Ansatz, nämlich den, den du (Dezipaitor) erwähnt hattest, ein Fenster transparent zu machen und so einen, pseudo gezeichneten Text auf den Winlogon erscheinen zu lassen. Dafür hatte ich die Idee in meiner Winlogon Notification Package (was für ein Name!) über CreateProcess bei Logon / Logoff eine executeable aufzurufen, diese könnte dann das unsichtbare Fenster mit text usw enthalten... Problem 1: Ich bin jetzt mittlerweile soweit, das die exe aufgerufen wird bei jedem Logon / Logoff nur da gibt es ein extremes Problem... Sie wird ausgeführt nachdem der User sich mittels Password authentifiziert hat, soll heissen, nach Eingabe des Passwords im Winlogon erscheint mein Fenster auf dem "normalen" User Desktop, was natürlich extrem dumm ist, sie sollte eigentlich im Winlogon ausgeführt werden... Ich vermute mal wenn ich dich richtig verstanden habe "Dezipaitor" dann liegt das daran, das meine exe keine Systemrechte hat???? Dann wäre da folgende Frage, gibt es die Möglichkeit in meiner DLL mittels CreateProcess einer exe diese Rechte zu geben, wenn ja währe ich extrem fröhlich, wenn man dafür ein Beispiel hätte... :-) Das Problen an der ganzen Sache ist, ich möchte keinen Dienst schreiben dafür, wobei dort ebenfalls das gleiche Problem wäre, CreateProcess mit Systemrecht... Vielleicht schaust Du bitte nochmals über meine DLL eventuell weisst Du ja was falsch ist? Ich glaube der CreateProcess Teil war sogar von dir?? :-)
Delphi-Quellcode:
Vielen Dank!
library swxLogonNotify;
uses SysUtils, Classes, Windows, JwaWindows, JwsclStrings; type TFnMsgeCallback = function (bVerbose: Boolean; lpMessage: PWideChar): Cardinal; stdcall; TWlxNotificationInfo = record Size: Cardinal; Flags: Cardinal; UserName: PWideChar; Domain: PWideChar; WindowStation: PWideChar; Token: Cardinal; Desktop: Cardinal; StatusCallback: TFnMsgeCallback; end; PWlxNotificationInfo = ^TWlxNotificationInfo; {$R *.res} procedure StartApp(const App, Parameters, CurDir : TJwString); var StartupInfo: {$IFDEF UNICODE}TStartupInfoW{$ELSE}TStartupInfoA{$ENDIF}; ProcInfo : TProcessInformation; pEnv : Pointer; pCurDir, pCmdLine : TJwPChar; begin ZeroMemory(@StartupInfo, sizeof(StartupInfo)); StartupInfo.cb := SizeOf(StartupInfo); StartupInfo.lpDesktop := 'winsta0\default'; CreateEnvironmentBlock(@pEnv, 0, true); try if Length(Parameters) > 0 then pCmdLine := TJwPChar('"'+App+'" ' + Parameters) else pCmdLine := TJwPChar('"'+App+'" '); pCurDir := Nil; if Length(CurDir) > 0 then pCurDir := TJwPChar(CurDir); if not {$IFDEF UNICODE}CreateProcessW{$ELSE}CreateProcessA{$ENDIF}( TJwPChar(App),//__in_opt LPCTSTR lpApplicationName, pCmdLine, //__inout_opt LPTSTR lpCommandLine, nil,//__in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes, nil,//__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, true,//__in BOOL bInheritHandles, CREATE_NEW_CONSOLE or CREATE_UNICODE_ENVIRONMENT,//__in DWORD dwCreationFlags, pEnv,//__in_opt LPVOID lpEnvironment, pCurDir,//__in_opt LPCTSTR lpCurrentDirectory, StartupInfo,//__in LPSTARTUPINFO lpStartupInfo, ProcInfo,//__out LPPROCESS_INFORMATION lpProcessInformation ) then raiseLastOsError; finally DestroyEnvironmentBlock(pEnv); end; CloseHandle(ProcInfo.hProcess); CloseHandle(ProcInfo.hThread); end; procedure StartupHandler(Info: PWlxNotificationInfo); stdcall; begin end; procedure LogonHandler(Info: PWlxNotificationInfo); stdcall; begin StartApp('c:\windows\system32\storm.exe', '', ''); end; procedure StartShellHandler(Info: PWlxNotificationInfo); stdcall; begin end; procedure LockHandler(Info: PWlxNotificationInfo); stdcall; begin end; procedure UnLockHandler(Info: PWlxNotificationInfo); stdcall; begin end; procedure StartScreenSaverHandler(Info: PWlxNotificationInfo); stdcall; begin end; procedure StopScreenSaverHandler(Info: PWlxNotificationInfo); stdcall; begin end; procedure LogoffHandler(Info: PWlxNotificationInfo); stdcall; begin StartApp('c:\windows\system32\storm.exe', '', ''); end; procedure ShutdownHandler(Info: PWlxNotificationInfo); stdcall; begin end; procedure DisconnectHandler(Info: PWlxNotificationInfo); stdcall; begin end; procedure ReconnectHandler(Info: PWlxNotificationInfo); stdcall; begin end; procedure PostShellHandler(Info: PWlxNotificationInfo); stdcall; begin end; //Nachfolgender Bereich verdunkelt mit das Hirn, brauch ich den unbedingt??? procedure EntryPointProc(reason: integer); begin case reason of DLL_PROCESS_ATTACH: //1 begin DisableThreadLibraryCalls(hInstance); end; DLL_THREAD_ATTACH: //2 begin end; DLL_PROCESS_DETACH: //3 begin end; DLL_THREAD_DETACH: //0 begin end; end; end; exports StartupHandler, LogonHandler, StartShellHandler, LockHandler, UnLockHandler, StartScreenSaverHandler, StopScreenSaverHandler, LogoffHandler, ShutdownHandler, DisconnectHandler, ReconnectHandler, PostShellHandler; begin DllProc := @EntryPointProc; DllProc(DLL_PROCESS_ATTACH); end. Marc |
Re: Winlogon, Welcome Screen
da steht
Delphi-Quellcode:
sollte net so sein, oder?
StartupInfo.lpDesktop := 'winsta0\default';
|
Re: Winlogon, Welcome Screen
öhm nicht? :oops:
|
Re: Winlogon, Welcome Screen
Ich dachte du willst auf winsta0\winlogon Desktop dein Fenster zeigen?
|
Re: Winlogon, Welcome Screen
Oh mein Gott bin ich bescheuert! Logisch hast vollkommen recht!
Ist der Code denn für Dich ok soweit? Also ich habs jetzt alles so umgeschrieben, so wie du vorgeschlagen hattest, das Fenster meiner Exe ist jetzt komplett transparent, daruaf zeichne ich ein PNG danach zwinge ich das Fenster in den Vordergrund so das dieses über den Winlogon klebt... Scheint optimal zu laufen, keine Abstürze mehr nich mal mehr nen Bluescreen (bin ich froh, dass es vmware gibt!) :P ich denk mal mein LiveSystem hätte die Anzahl der Abstürze wohl kaum überlebt (hehe naja dafür gibts ja noch Acronis) :tongue: WTrotzdem wäre ich Dir sehr dankbar, wenn du nochmals über den Code fliegst und mir eventuell sagen kannst wie und wann es Probleme geben kann eventuell hast Du ja einen Rat parat wie ich diverse Probleme umgehen kann anhand des Codes... Was fürn Drama um ne 'WNP' zu bauen... das lustige ist ja das es eiegentlich umsonst war dank Vista :wall: Viele Grüsse Marc |
Re: Winlogon, Welcome Screen
Anhand desCodes wirst du nur wenig Fehler finden (wenn überhaupt). Teste das Programm ausgiebig auch auf fremden Rechnern. Dann wirst du die Fehler eher finden.
|
Re: Winlogon, Welcome Screen
Ok bin grad dabei, ich hab aber noch folgende 2 Probleme, sind mir grad aufgefallen...
1. storm.exe wird 3x aufgerufen vermutlich durch die Handler in der DLL (Logon, Logoff usw) Ich schätze mal ich müsste da, irgendwo prüfen ob der Prozess storm.exe existiert wenn ja ggf. beenden und dann erst StartApp.... aufrufen?! 2. Etwas seltsames, mein Fenster wird angezeigt, nur wenn ich nun aufs Passwordfeld im Winlogon klicke verschwindet mein Fenster (kann aber nicht ein Probleme mit ForeGround usw. sein, da in der Exe implementiert) 2a. Wenn Logoff stattfindet wird mein Fenster kurz angezeigt und dann verschwindet, es ist also nicht die ganze Zeit über im Winlogon sichtbar (passiert bei Logoff, Logon in beiden Fällen... Für Punkt 2 / 2a weiss ich keine Rat...?! Viele Grüße Marc |
Re: Winlogon, Welcome Screen
vielleicht liegt es einfach daran das sich das Fenster mit dem Passwort feld bei aktivieren in den Fordergrund bringt und somit deins überdeckt. Ansonsten macht es mir Angst was du da machst. Mir scheint es als ob du keine Ahnung von dem ganzen Hast und nur rum probierst anstelle fundiertes Wissen anzuwenden.
|
Re: Winlogon, Welcome Screen
1. Wie schon erwähnt prüft wird meine exe im code grundsätzlich in den Vordergrund gesetzt, kann also schlecht überdeckt werden...
2. Was deine Angst angeht, beunruhigt mich das weniger, wenn ich alles könnte brauchte ich kein Forum mehr besuchen oder? Viele Grüße Marc |
Re: Winlogon, Welcome Screen
Zitat:
Suche bitte nach Process Explorer von Sysinternals. Damit siehst du den Prozess Aufbau. 2. Es kann gut sein, dass Winlogon ein Hintergrund-Desktopfenster einrichtet, welches dein Fenster überdeckt. Im Winlogondesktop ist nichts normal. 2a. Vista? XP? Wenn ein Benutzer sich ausloggt, werden alle Programme einer Session geschlossen. Und wenn dein Programm in dieser Session drin ist, dann dieses natürlich auch. Dann ist deine CreateProcess Strategie verpufft und du solltest direkt in Winlogon ein Fenster erzeugen. |
Re: Winlogon, Welcome Screen
Wo hast du nur dein ganzes Wissen her mir qualmt jetzt schon wieder die birne nur vom lesen und das liegt nicht am wetter...
Trotzdem muss ich dir mal echt danken, für deine grossartige geduld mit mir :-) Ich glaub ich muss erstmal versuchen zu verstehen, was du da geschrieben hast... Ich meld mich wieder...! Ps. hast du vielleicht ne VirtualMachine? Dann könnte ich dir gerne mal bei interesse alles zusammpacken und du könntest es dir mal live ansehen, ich find immer bilder sagen mehr als 1000 worte... Viele Grüße Marc |
Re: Winlogon, Welcome Screen
Für was machst du eigentlich die ganze Sache?
|
Re: Winlogon, Welcome Screen
Oh wenn ichdir das verrate :-( dann hast du bestimmt keine Lust mehr weiterzuhelfen...
Nein mal ganz im ernst, ich hab leider nicht das Vergnügen als Programmierer zu arbeiten, das Leben hatte wohl was anderes für mich vorgesehen... (Vermutlich auch besser so, ich denke nicht das meine Zynapsen zeitweise richtig verschaltet sind dafür...) Jedenfalls macht es mir einfach tierisch Spass mit Delphi zu knobeln, einfach an Problemen zu hängen, solange bis das erledigt ist... Ich kam darauf wie gesagt weil ich das bei KAV / KIS zum ersten mal überhaupt gesehen habe und extrem neugierig darauf war, wie das überhaupt gemacht wird... Jetzt kommt hinzu das mein Freund einen PC Laden hat, wäre vielleicht eine hübsche art ein OEM Logo zu verwenden, weilin den Systemeigenschaften kann das ja jeder :-) Vorrausgesetzt natürlich, das irgendwann mal alles rund läuft, ich will ihm ja nicht sein Kunden vergraulen :-) Das ist aber nur erstmal als Gag gedacht, bei den Kunden kann man es auch machen wäre also kein Thema, aber mich interessiert das Gebiet auf dem ich gerade wackelig hin und her schaukel sehr, deshalb würde ich gerne extrem mehr Wissen darüber anäufen und rumexperimentieren... Was ich nicht kapiert habe und wo ich immer noch drüber nachdenke ist: Deine Anwendung sollte für mehrere Winlogon Instanzen aufgerufen werden. Da du eine Instanz pro Session (0...x) du solltest direkt in Winlogon ein Fenster erzeugen. Das war auch der Grund meines Vorschlages das du das mal Live siehst, inner VM? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz