;ExitWindowsEx auch mit NT und XP nutzen ;################################################# ;Andreas Miethe * August 2002 ;################################################# ;ExitWindowsEx funktioniert unter NT und XP ;nur, wenn das aufrufenden Programm das ;Recht besitzt den Rechner neu zu starten bzw. ;auszuschalten. ;Das muss Windows aber erstmal mitgeteilt werden ! ;Erst wenn diese Vorarbeiten erledigt sind, kann ;ExitWindowEx aufgerufen werden ! ;################################################# Procedure Shutdown(par.l) #Mem1 = 1000 #Mem2 = 2000 ;Prozess-Token ermitteln OpenProcessToken_(GetCurrentProcess_(),40, @hToken) ;Da der zu ermttelnde LUID-Wert ein Large-Integer(64-Bit) ist, ;wird direkt in den Speicher geschrieben AllocateMemory(#Mem1,8,0);Speicherplatz fuer LUID AllocateMemory(#Mem2,16,0);Speicherplatz fuer Privileges PokeL(MemoryID(),1);Anzahl der Privileges = 1 UseMemory(#mem1) LookupPrivilegeValue_(0,"SeShutdownPrivilege",MemoryID());LUID auslesen Value1.l = PeekL(MemoryID()) ;1.LongInt der LUID Value2.l = PeekL(MemoryID()+4) ;2.LongInt der LUID UseMemory(#mem2) PokeL(MemoryID()+4,Value1);1. LUID-Wert in Privileges PokeL(MemoryID()+8,Value2);2. LUID-Wert in Privileges PokeL(MemoryID()+12,2);SE_PRIVILEGE_ENABLED AdjustTokenPrivileges_(hToken, 0, MemoryID(), 0, 0, 0);Privileges setzen CloseHandle_(hToken);Token wird nicht mehr benoetigt FreeMemory(#mem1);Speicher freigeben FreeMemory(#mem2);Speicher freigeben ExitWindowsEX_(par, 0);hier kann jetzt Windows beendet oder neugestartet werden. EndProcedure Shutdown(9);PowerOff End ; ExecutableFormat=Windows ; UseIcon=K:\Pure-Basic\Symbol1.ico ; Executable=K:\Pure-Basic\ShutDown\ShutNT.exe ; EOF