Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Winlogon Notify - DLL Funktionen werden nicht aufgerufen (https://www.delphipraxis.net/80937-winlogon-notify-dll-funktionen-werden-nicht-aufgerufen.html)

Zacherl 17. Nov 2006 17:34


Winlogon Notify - DLL Funktionen werden nicht aufgerufen
 
Hi,

ich frage mich schon lange, wie eine Winlogon Notifier DLL aufgebaut sein muss. Eingetragen werden die DLLs in der Registry, das habe ich schon rausgefunden. Als Beipsiel mal den WGA Notifier:

Code:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\WgaLogon]
"Logon"="WLEventLogon"
"Logoff"="WLEventLogoff"
"Startup"="WLEventStartup"
"Shutdown"="WLEventShutdown"
"StartScreenSaver"="WLEventStartScreenSaver"
"StopScreenSaver"="WLEventStopScreenSaver"
"Lock"="WLEventLock"
"Unlock"="WLEventUnlock"
"StartShell"="WLEventStartShell"
"PostShell"="WLEventPostShell"
"Disconnect"="WLEventDisconnect"
"Reconnect"="WLEventReconnect"
"Impersonate"=dword:00000001
"Asynchronous"=dword:00000000
"SafeMode"=dword:00000001
"MaxWait"=dword:ffffffff
"DllName"=hex(2):57,00,67,00,61,00,4c,00,6f,00,67,00,6f,00,6e,00,2e,00,64,00,\
  6c,00,6c,00,00,00
"Event"=dword:00000001
Wie es scheint muss die DLL die Funktionen exportieren, die mit Logon, Startup, PostShell, etc angegeben werden.

Kann mit jemand den Aufbau der Funktionen erklären oder noch besser ein Tutorial zeigen, in dem die einzelnen Events beschrieben sind und auch der sonstige Aufbau der DLL beschrieben wird?

Florian

TKC 17. Nov 2006 17:43

Re: Winlogon Notify - Aufbau der DLL
 
Hi,

was du brauchst, kannst du in der MSDN nachlesen :wink:

Creating a Winlogon Notification Package

Zacherl 17. Nov 2006 17:49

Re: Winlogon Notify - Aufbau der DLL
 
Mh das hab ich auch schon gefunden, aber wie kann ich Beispielsweise diese Funktion in meiner DLL implementieren?

Code:
VOID WLEventLogon (PWLX_NOTIFICATION_INFO pInfo)
{

    // Print the name of the handler to debug output.
    // You can replace this with more useful functionality.
    OutputDebugString (TEXT("NOTIFY: Entering WLEventLogon.\r\n"));
}
ich vermute jetzt mal:

Delphi-Quellcode:
procedure WLEventLogon(pInfo: PWLX_NOTIFICATION_INFO); stdcall;
die viel bessere Frage ist, wie ich folgendes deklariere:

Code:
typedef struct _WLX_NOTIFICATION_INFO { 
  ULONG Size;
  ULONG Flags;
  PWSTR UserName;
  PWSTR Domain;
  PWSTR WindowStation;
  HANDLE hToken;
  HDESK hDesktop;
  PFNMSGECALLBACK pStatusCallback;
} WLX_NOTIFICATION_INFO,
  *PWLX_NOTIFICATION_INFO;
Da hab ich überhaupt keinen Durchblick :oops:

Florian

TKC 17. Nov 2006 17:53

Re: Winlogon Notify - Aufbau der DLL
 
Schau doch mal in die Jedi Win32 Native API ... da ist alles drin was du brauchst (JwaWinWlx.pas) .

Muetze1 17. Nov 2006 17:54

Re: Winlogon Notify - Aufbau der DLL
 
Delphi-Quellcode:
Type
  PFNMSGECALLBACK = Procedure (????); StdCall; //??? fehlt!

  WLX_NOTIFICATION_INFO = Record
    Size: LongWord;
    Flags: LongWord;
    UserName: PWideChar;
    Domain: PWideChar;
    WIndowStation: PWideChar;
    hToken: THandle;
    hDesktop: THandle; // ich weiss nicht ob es einen HDESK Typ gibt
    pStatusCallBack: PFNMSGECALLBACK;
  End;

  TWLX_NOTIFICATION_INFO = WLX_NOTIFICATION_INFO;
  PWLX_NOTIFICATION_INFO = ^TWLX_NOTIFICATION_INFO;

TKC 17. Nov 2006 17:57

Re: Winlogon Notify - Aufbau der DLL
 
Wieso fehlt ????

Delphi-Quellcode:
 PFNMSGECALLBACK = function(bVerbose: BOOL; lpMessage: LPWSTR): DWORD; stdcall;

Muetze1 17. Nov 2006 18:05

Re: Winlogon Notify - Aufbau der DLL
 
Zitat:

Zitat von ACE-ppc
Wieso fehlt ????

Und wo bitte ist diese Deklaration in dem Code Ausschnitt von Florian Bernd? Ich habe in der Zeit wo du einfach nur verlinkst die Struktur mit eigenem Grips übersetzt und die oben genannte Funktion konnte ich nicht übersetzen, da mir deren Deklaration fehlt. Ich habe rein gar nix auf deine verlinkte Unit bezogen.

Und das es da nicht fehlt, sollte jedem mit ein wenig geistigen Kapazitäten klar sein, weil sie sonst schlecht eine komplette Übersetzung der Struktur liefern könnten... :wall:

TKC 17. Nov 2006 18:13

Re: Winlogon Notify - Aufbau der DLL
 
Zitat:

Zitat von Muetze1

Und wo bitte ist diese Deklaration in dem Code Ausschnitt von Florian Bernd? Ich habe in der Zeit wo du einfach nur verlinkst die Struktur mit eigenem Grips übersetzt und die oben genannte Funktion konnte ich nicht übersetzen, da mir deren Deklaration fehlt. Ich habe rein gar nix auf deine verlinkte Unit bezogen.

Das war für mich nicht ganz so ersichtlich :shock: !
Aber warum noch einmal übersetzen, wenn das schon jemand gemacht hat ????


Zitat:

Zitat von Muetze1
Und das es da nicht fehlt, sollte jedem mit ein wenig geistigen Kapazitäten klar sein, weil sie sonst schlecht eine komplette Übersetzung der Struktur liefern könnten... :wall:

Ich denke ... selbst jemand mit wenig geistigen Kapazitäten kann das auch normal äußern !

Zacherl 17. Nov 2006 18:37

Re: Winlogon Notify - Aufbau der DLL
 
So, vielen Dank an euch beide, die Deklarationen der Typen hab ich jetzt so:

Delphi-Quellcode:
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;
Dann sollte es jetzt doch eingentlich funktionieren, wenn ich z.B. eine DLL erstelle, die die Funktion

Delphi-Quellcode:
procedure WLEventLogon(pInfo: PWLX_NOTIFICATION_INFO); stdcall;
exportiert, oder?

Florian

Zacherl 17. Nov 2006 20:31

Re: Winlogon Notify - DLL Funktionen werden nicht aufgerufen
 
So, ich habe jetzt die folgende DLL, die einfach nur jede 10 Sekunden eine Message anzeigen soll:

Delphi-Quellcode:
library WinLogon;

uses
  Windows,
  MMSystem,
  dialogs;

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;

var
  TimerID: Longword;
  DelayTime: integer = 10000;
  Files: Textfile;

procedure TimerCallback(uTimer, uMessage, dwUser, dw1, dw2: Cardinal); stdcall;
begin
  showmessage('test');
end;

procedure WLEventLogon(pInfo: PWLX_NOTIFICATION_INFO); stdcall;
begin
  TimerID := timeSetEvent(DelayTime, 0, TimerCallback, 0, 0);
end;

procedure WLEventLogoff(pInfo: PWLX_NOTIFICATION_INFO); stdcall;
begin
  timeKillEvent(TimerID);
end;

exports
  WLEventLogon,
  WLEventLogoff;

begin

end.
Nur leider werden keine Nachrichten angezeigt. Nach einem Neustart ist die DLL ordnungsgemäß im Winlogon Prozess geladen, aber meine Events werden nicht abgearbeitet.

In der Registry habe ich

Code:
"Logon"="WLEventLogon"
"Logoff"="WLEventLogoff"
zu dem Dllnamen und Impersonate und Asynchronous eingetragen.

Florian


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:14 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz