P'tit prog pour quitter windows entièrement en api win32

Soyez le premier à donner votre avis sur cette source.

Vue 5 006 fois - Téléchargée 404 fois

Description

Ce prog est juste pour montrer la création d'une appli en API Win32. Et comment quitter windows...
Le code n'est plus tout jeune, et il reste des bouts de code en commentaires que je n'est pas viré
(j'ai eu la flemme), mais bon si j'ai le ocurage je le remettrais au propre...

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
25
Date d'inscription
jeudi 20 novembre 2003
Statut
Membre
Dernière intervention
2 janvier 2006

tu as tout à fait raison. J'avais créé ce programme, initialement, pour windows 98. Et comme je n'ai pas pris le temps de le mettre à jour, il est inutilisable en l'état sous win2k et +.
Qu'a cela ne tienne, en attendant de remettre à jour le code voici ce qu'il faut y mettre pour qu'il tienne compte des privilèges :

void SetPrivilege(void)
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;

// Get a token for this process.
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
ReportError("OpenProcessToken");

// Get the LUID for the shutdown privilege.
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid);

tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

// Get the shutdown privilege for this process.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0);
// Cannot test the return value of AdjustTokenPrivileges.
ReportError("AdjustTokenPrivileges");
}

et à la place de l'ExitWindowsEx existant, il faut le remplacer par :
ExitWindowsEx(EWX_POWEROFF | EWX_FORCEIFHUNG, 0);

enfin la méthode ReportError est celle qui est communément employée :
void ReportError(char *szTitle)
{
int nerr = GetLastError();
if (nerr == 0) return;
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
nerr,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);

MessageBox(NULL, (LPCTSTR)lpMsgBuf, szTitle, MB_OK | MB_ICONINFORMATION );
// Free the buffer.
LocalFree( lpMsgBuf );
}
Messages postés
584
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
29 mai 2015

J'ai rapidement parcouru ton code mais j'ai l'impression que tu ne geres pas les privileges. Du coup ça ne tournera ni sur Win2000 ni sur WinXP

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.