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

3/5 (2 avis)

Vue 5 080 fois - Téléchargée 432 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
kptn Messages postés 25 Date d'inscription jeudi 20 novembre 2003 Statut Membre Dernière intervention 2 janvier 2006
5 déc. 2003 à 09:48
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 );
}
garslouche Messages postés 584 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 29 mai 2015 1
4 déc. 2003 à 15:44
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.