我们用察看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.