• 0
Sign in to follow this  
Paulo Nobre

Exitwindowsex

Question

Alguém saberia dizer por que, pelo menos no meu XP home a função da API ExitWindowsEx com o parâmetro 1 não funciona.

ExitWindowsEx (EWX_FORCE,0) funciona, mas aparecendo tela para fazer logon

ExitWindowsEx (1,0) que seria para desligar não funciona.

Alguém tem alguma idéia.

Uso isto num programa simples de alarme que funcionava normalmente no Win9x e Me.

Obrigado pela ajuda

Paulo Nobre

Share this post


Link to post
Share on other sites

7 answers to this question

Recommended Posts

  • 0

Segundo a documentação funciona.

Experimente combinar:

ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE, 0);

ou

ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCEIFHUNG, 0);

ou

ExitWindowsEx(EWX_POWEROFF,0);

Obs: EWX_FORCE e EWX_FORCEIFHUNG são antagônicos.

Share this post


Link to post
Share on other sites
  • 0

s3c, obrigado

se der certo postarei aqui.

Paulo Nobre

Share this post


Link to post
Share on other sites
  • 0

s3c, tentei todas as combinações possíveis e a única coisa que consegui como já havia mencionado foi ao usar:

ExitWindowsEx(EWX_FORCE, 0);

fazer aparecer a tela de logon com o meu nome para eu bootar de novo.

Desligar mesmo não consigo nem a pau.

É muito estranho isto!!!

De qualquer forma muito obrigado.

Paulo Nobre

Share this post


Link to post
Share on other sites
  • 0

Acho que tem a ver com os privilégios de shutdown do NT.

Tente modificá-los:

var
  TTkHandle       :THandle;
  TTkAtu,TTkAnt :TTokenPrivileges;
  TTkRet            :DWORD;
begin
  if OpenProcessToken(GetCurrentProcess(),
                      TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
                      TTkHandle) then
    if LookupPrivilegeValue(nil,
                            'SeShutdownPrivilege',
                            TTkAtu.Privileges[0].Luid) then
    begin
      TTkAtu.PrivilegeCount           := 1;
      TTkAtu.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      Windows.AdjustTokenPrivileges(TTkHandle,
                                    False,
                                    TTkAtu,
                                    SizeOf(TTkAtu),
                                    TTkAnt,
                                    TTkRet);
      ExitWindowsEx(EWX_POWEROFF or EWX_FORCE, 0);
    end;
end;

Share this post


Link to post
Share on other sites
  • 0

Valeu s3c, desta vez funcionou!

Muito obrigado, embora não tenha entendido o código.

Paulo Nobre

Share this post


Link to post
Share on other sites
  • 0

São funções da Advapi32.dll na Windows.pas

Confesso que não me aprofundo muito nisso também, mas basicamente é o seguinte:

OpenProcessToken retorna o Handle da indicação de ajuste de privilégios para o seu processo.

LookupPrivilegeValue retorna em TTkAtu.Privileges[0].Luid o identificador p/ o privilégio de shutdown(SeShutdownPrivilege).

Com estas duas informações, você diz que o seu processo poderá desligar a máquina habilitando TTkAtu.Privileges[0].Attributes p/ enable e logo apos efetivar com AdjustTokenPrivileges.

Se o NT não reclamar em nenhum desses passos, então o shutdown funciona.

Se reclamar e você quiser saber o erro, então você deve utilizar GetLastError após cada uma delas.

Share this post


Link to post
Share on other sites
  • 0

Valeu pela explicação s3c, deu pelo menos para ter uma noção do que está acontecendo e não simplesmente estar copiando e colando código.

Paulo Nobre

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this