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


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

    {
      *显示windows退出系统对话框*
       说明:该函数由msgina.dll导出,但是查msdn没有相关说明,查win2000源代码得函数定义
       作者: JJony
       联系方式: jzj_jony@126.com
       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    System.@LStrFromPCharLen
            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(' 联系方式: jzj_jony@126.com  ');
      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.

  • 相关阅读:
    两台独立计算机共享一套键鼠
    【不要太监,成为笑话】拼搏百天,我要成为程序员!键盘敲烂,我要月薪过万!第三天
    【不要太监,成为笑话】拼搏百天,我要成为程序员!键盘敲烂,我要月薪过万!第二天
    【不要太监,成为笑话】拼搏百天,我要成为程序员!键盘敲烂,我要月薪过万!第一天
    javac编译时报错 (错误: 编码GBK的不可映射字符)
    JavaWeb学习1-springMVC
    理学和工学的区别
    各种证书
    问题
    字符编码的理解
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/1221072.html
Copyright © 2020-2023  润新知