天天看点

未公开函数ShellShutdownDialog的定义及使用

我们用察看dll导出函数的工具可以看到msgina.dll的第一个导出函数是ShellShutdownDialog,但是查遍msdn也没有说明,于是去win2000源代码中查找得到该函数的定义,现转为delphi版本,并给出实例。

{

  *显示windows退出系统对话框*

   说明:该函数由msgina.dll导出,但是查msdn没有相关说明,查win2000源代码得函数定义

   作者: JJony

   联系方式: [email protected]

   QQ: 254706028

}

program ShowExitWindowsDialog;

{$APPTYPE CONSOLE}

uses

  windows;

const  //自定义操作码常量

  SHUT_DOWN_NONE     = 0;  //无操作

  SHUT_DOWN_LOGOUT   = 1;  //注销

  SHUT_DOWN_POWEROFF = 2;  //关机

  SHUT_DOWN_REBOOT   = 4;  //重启

  SHUT_DOWN_WAIT     = 16; //待机

  SHUT_DOWN_DORMANCY = 64; //休眠

type

  TShellShutdownDialog=function(hParent:HWND;username:pchar;bHideLogoff:bool):dword;stdcall;

var

  ShellShutdownDialog:TShellShutdownDialog;

  CurU:array[0..MAX_PATH] of char;

  Len:cardinal;

  r:dword;

  info:string;

function StrPas(const Str: PChar): string;

begin

  Result := Str;

end;

procedure CvtInt;

asm

        OR      CL,CL

        JNZ     @CvtLoop

@C1:    OR      EAX,EAX

        JNS     @C2

        NEG     EAX

        CALL    @C2

        MOV     AL,'-'

        INC     ECX

        DEC     ESI

        MOV     [ESI],AL

        RET

@C2:    MOV     ECX,10

@CvtLoop:

        PUSH    EDX

        PUSH    ESI

@D1:    XOR     EDX,EDX

        DIV     ECX

        DEC     ESI

        ADD     DL,'0'

        CMP     DL,'0'+10

        JB      @D2

        ADD     DL,('A'-'0')-10

@D2:    MOV     [ESI],DL

        OR      EAX,EAX

        JNE     @D1

        POP     ECX

        POP     EDX

        SUB     ECX,ESI

        SUB     EDX,ECX

        JBE     @D5

        ADD     ECX,EDX

        MOV     AL,'0'

        SUB     ESI,EDX

        JMP     @z

@zloop: MOV     [ESI+EDX],AL

@z:     DEC     EDX

        JNZ     @zloop

        MOV     [ESI],AL

@D5:

end;

function IntToStr(Value: Integer): string;

asm

        PUSH    ESI

        MOV     ESI, ESP

        SUB     ESP, 16

        XOR     ECX, ECX

        PUSH    EDX

        XOR     EDX, EDX

        CALL    CvtInt

        MOV     EDX, ESI

        POP     EAX

        CALL    [email protected]

        ADD     ESP, 16

        POP     ESI

end;

Function LoadShell:boolean;  //动态加载 ShellShutdownDialog

var

  h:hmodule;

begin

  h:=LoadLibrary('msgina.dll');

if h<>0 then

  ShellShutdownDialog:=GetProcAddress(h,'ShellShutdownDialog')

else

 begin

  Writeln('加载msgina.dll出错');

  readln;

 end;

result:=assigned(ShellShutdownDialog);

end;

begin

 if  not LoadShell then exit;

  Len:=sizeof(CurU);

  getusername(CurU,len);

  Writeln('');

  Writeln('*显示windows退出系统对话框*');

  Writeln(' 说明:该函数由msgina.dll导出,但是查msdn没有相关说明,查win2000源代码得函数定义');

  Writeln(' 作者: JJony ');

  Writeln(' 联系方式: [email protected]  ');

  Writeln(' QQ: 254706028 ');

  Writeln('');

  Writeln('按回车键显示windows退出系统对话框');

  readln;

  r:=ShellShutDownDialog(0,@CurU,false);

  Writeln('');

  case r of

  SHUT_DOWN_NONE :info:='(无操作)';  //无操作

  SHUT_DOWN_LOGOUT:info:='(注销 '+strpas(CurU)+')';  //注销

  SHUT_DOWN_POWEROFF:info:='(关机)';  //关机

  SHUT_DOWN_REBOOT:info:='(重新启动)';  //重启

  SHUT_DOWN_WAIT:info:='(待机)'; //待机

  SHUT_DOWN_DORMANCY:info:='(休眠)';//休眠

  end;

  writeln('返回执行操作码:'+inttostr(r)+info);

  Writeln('');

  Writeln('按回车键退出');

  readln;

end.

继续阅读