未公开函数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.

原文地址:https://www.cnblogs.com/MaxWoods/p/1221072.html