Seite 1 von 1

EnableExplicit

Verfasst: 01.09.2023 19:49
von HemSA
Hallole,
Wenn ich den Code mit EnableExplicit am Anfang und diesem Teil im Code

Code: Alles auswählen

Procedure Shutdown( flags.l ) 
  Privileges.TOKEN_PRIVILEGES 
  OpenProcessToken_(GetCurrentProcess_(), 40, @hToken) 
  Privileges\PrivilegeCount           = 1 
  Privileges\Privileges[0]\Attributes = #SE_PRIVILEGE_ENABLED 
  LookupPrivilegeValue_(0, "SeShutdownPrivilege", @Privileges\Privileges[0]\Luid) 
  AdjustTokenPrivileges_(hToken, 0, @Privileges, 0, 0, 0) 
  CloseHandle_(hToken) 
  ExitWindowsEx_(flags, 0) 
EndProcedure
starte bekomme ich immer eine Fehlermeldung wie:

Line 73: With 'EnableExplicit', variables have to be declared: Privileges.

Aber Declare ist ja nur für Proceduren.
Was muss und wie muss ich das Define schreiben damit es keinen Fehler gibt?
Define Privileges klappt jedenfalls nicht und mit anderen Kombinationen hat es auch nicht geklappt.

Die Lösung ist natürlich EnableExplicit nicht zu verwenden, aber das will ich eigentlich nicht.

Danke schon mal.

Re: EnableExplicit

Verfasst: 01.09.2023 20:19
von RSBasic
Strukturen müssen auch deklariert werden, wenn du diese nutzen möchtest. Um eine Struktur nutzen zu können, brauchst du eine Variable (Verweis auf die Struktur).

So sieht der Code mit EnableExplicit aus:

Code: Alles auswählen

EnableExplicit

Procedure Shutdown( flags.l ) 
  Protected Privileges.TOKEN_PRIVILEGES
  Protected hToken
  
  OpenProcessToken_(GetCurrentProcess_(), 40, @hToken) 
  Privileges\PrivilegeCount           = 1 
  Privileges\Privileges[0]\Attributes = #SE_PRIVILEGE_ENABLED 
  LookupPrivilegeValue_(0, "SeShutdownPrivilege", @Privileges\Privileges[0]\Luid) 
  AdjustTokenPrivileges_(hToken, 0, @Privileges, 0, 0, 0) 
  CloseHandle_(hToken) 
  ExitWindowsEx_(flags, 0)
  
EndProcedure

Re: EnableExplicit

Verfasst: 01.09.2023 20:23
von Kurzer
Ich kenne zwar den Rest deines Codes nicht, aber innerhalb einer Prozedure kanst du zum Beispiel Protected nutzen, um Variablen darin zu deklarieren.
Schau in der PB Hilfe nach Protected, um dir auch die anderen möglichen Schlüsselwörter anzusehen.

So würde die prozedure ohne Fehler compiliert werden:

Code: Alles auswählen

Procedure Shutdown( flags.l ) 
  Protected Privileges.TOKEN_PRIVILEGES, hToken.i
	
  OpenProcessToken_(GetCurrentProcess_(), 40, @hToken) 
  Privileges\PrivilegeCount           = 1 
  Privileges\Privileges[0]\Attributes = #SE_PRIVILEGE_ENABLED 
  LookupPrivilegeValue_(0, "SeShutdownPrivilege", @Privileges\Privileges[0]\Luid) 
  AdjustTokenPrivileges_(hToken, 0, @Privileges, 0, 0, 0) 
  CloseHandle_(hToken) 
  ExitWindowsEx_(flags, 0) 
EndProcedure
Edith: RSBasic war schneller.

Re: EnableExplicit

Verfasst: 01.09.2023 21:05
von HemSA
Danke euch beiden, jetzt klappt es ohne Fehlermeldung.

Re: EnableExplicit

Verfasst: 01.09.2023 21:54
von HemSA
Hallole,
der Codeabschnitt ist mir sowieso total fremd. Habe ihn von einem Beispiel kopiert.

Was die Protected angeht:
- hToken finde ich ja öfters in dem Codeabschnitt, obwohl das dann wohl auch eher ein Glücksgriff waere.
aber wie komme ich auf
- Privileges.TOKEN_PRIVILEGES?

Das geht mir dann doch schon zu weit.

Re: EnableExplicit

Verfasst: 02.09.2023 02:52
von mk-soft
TOKEN_PRIVILEGES ist eine Window API Struktur.
Siehe Werkzeug -> Strukturverzeichnis
Also bei API Funktionen die MSDN fragen.

Re: EnableExplicit

Verfasst: 02.09.2023 09:40
von RSBasic
hToken steht für HandleToken und wird von einer WinAPI-Funktion zurückgegeben und die Handle-Nummer wird für die Weiterverarbeitung benötigt.
TOKEN_PRIVILEGES ist, wie mk-soft bereits sagte, eine WinAPI-Struktur, um mehrere Informationen zu lesen und zu schreiben.
Wie diese Struktur aufgebaut ist und wofür man sie benötigt, findest du nicht in der PB-Hilfe, sondern auf der MSDN-Seite: https://learn.microsoft.com/en-us/windo ... privileges