PDA

View Full Version : سوال: برنامه Fast Shutdown



Mask
شنبه 09 بهمن 1389, 17:07 عصر
با سلام
اگر دوستان برنامه Fast Shutdown در مجموعه MRT رو دیده باشند. تنها با یک کلیک کردن بر روی باتن و بدون معطلی سیستم خاموش میشه.
چطوری همچین برنامه ای می توان نوشت.؟
ممنون.

hossein_h62
شنبه 09 بهمن 1389, 17:18 عصر
سلام
از کد زیر استفاده کنید :

ShellExecute(Handle, 'open', PChar('shutdown'), PChar('-s -t 0'), nil, SW_HIDE);

mehdi.mousavi
شنبه 09 بهمن 1389, 17:26 عصر
با سلام اگر دوستان برنامه Fast Shutdown در مجموعه MRT رو دیده باشند. تنها با یک کلیک کردن بر روی باتن و بدون معطلی سیستم خاموش میشه. چطوری همچین برنامه ای می توان نوشت.؟ ممنون.

سلام.
برای اینکار می تونید از تابع ExitWindowsEx (http://msdn.microsoft.com/en-us/library/aa376868%28v=vs.85%29.aspx) استفاده کنید. توضیحات بیشتر رو قبلا در این تاپیک (http://barnamenevis.org/showthread.php?194398-%D9%87%D8%B2%D8%A7%D8%B1-%D9%88-%DB%8C%DA%A9-%D8%A7%DB%8C%D8%B1%D8%A7%D8%AF-%D8%AF%D8%B1-%D8%AA%D8%A7%D9%BE%DB%8C%DA%A9-%D9%87%D8%B2%D8%A7%D8%B1-%D9%88-%DB%8C%DA%A9-%D9%86%DA%A9%D8%AA%D9%87-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE%21&p=935327&viewfull=1#post935327) داده ام.
همینطور عنوان کرده ام که چرا روش قبلی (که مطمئن بودم یکی دیر یا زود پیشنهاد میده) صحیح نیست!

موفق باشید.

Mask
شنبه 09 بهمن 1389, 17:46 عصر
ممنون از دو دوست عزیز.
روشهایی رو که فرمودید در جریانشون هستم.
اما جالبیه این برنامه اینه که هیچ مسیج close برای هیچ برنامه ای نمیفرسته و بدون معطلی انگار که سیم برق رو از پریز بیرون کشیدی سیستم رو خاموش میکنه.
من سوالم اینه...

BORHAN TEC
شنبه 09 بهمن 1389, 18:52 عصر
یک روشی که قبلاً کشف کرده بودم این است:
شما باید یکی از پروسه های اصلی سیستم عامل را ببندید (و یا به اجرای آن پایان دهید) با این کار سیستم همچین خاموش می شه که انگار برق رو قطع کرده اید. :گیج:
البته فکر می کنم با این روش بعد چند روز قادر خواهید بود ویندوز بترکونید!!! :کف:

mehdi.mousavi
شنبه 09 بهمن 1389, 18:54 عصر
ممنون از دو دوست عزیز. روشهایی رو که فرمودید در جریانشون هستم. اما جالبیه این برنامه اینه که هیچ مسیج close برای هیچ برنامه ای نمیفرسته و بدون معطلی انگار که سیم برق رو از پریز بیرون کشیدی سیستم رو خاموش میکنه. من سوالم اینه...

سلام.
ببینید. وقتی شما از مقدار EWX_FORCE برای به اجبار Shutdown کردن Session در ExitWindowsEx استفاده می کنید، سیستم پیام WM_QUERYENDMESSAGE (و سپس WM_ENDSESSION) رو به کلیه App ها و Service ها (در حقیقت به Top-Level Window هاشون) ارسال میکنه. سپس 5 ثانیه به اونها فرصت میده تا اونها به کارشون خاتمه بدن. این 5 ثانیه کجا تعریف شده؟ در کلید زیر:


HKEY_CURRENT_USER\Control Panel\Desktop\HungAppTimeout

به همین ترتیب، میتونید از OS بخواهید که اگر برنامه ای Hang کرد، دیگه اون Box مربوطه رو که به کاربر اجازه میده تا End Task کنه، یا منتظر اتمام یه Process بمونه رو به کاربر نشون نده. اینکار با دستکاری کلید زیر امکان پذیره:


HKEY_CURRENT_USER\Control Panel\Desktop\AutoEndTask

سپس، WM_ENDSESSION به برنامه ها ارسال میشه تا برنامه ها دست از کار بکشن. وقتی این پیام ارسال میشه، OS به اونها 20 ثانیه زمان میده تا کارشون رو خاتمه بدن. این 20 ثانیه کجا تعیین شده؟ در کلید زیر:


HKEY_CURRENT_USER\Control Panel\Desktop\WaitToKillAppTimeout

اینها رو گفتم تا بگم احتمالا برنامه ای که نام بردید، مقادیر مزبور رو دستکاری میکنه تا OS منتظر پاسخ Process ها نمونه، در نتیجه، برنامه ها در یک چشم بهم زدن بسته میشن و عمل Shutdown شدن انجام میشه.

موفق باشید.

Mask
یک شنبه 10 بهمن 1389, 16:02 عصر
با تشکر ار جناب موسوی
تغییراتی رو که فرموده بودید در رجیستری اعمال کردم.
اما بازم نزدیک به 7-8 ثانیه طول میکشه که سیستم خاموش بشه و در پنجره Windows Shuting down میمونه.
برنامه ای رو که خدمتتون معرفی کردم رو از لینک زیر بگیرید تا متوجه منظور بنده از سریع خاموش شدن بشوید.
با تشکر از شما و دوستان عزیز.
http://up.iranblog.com/images/mkz0yqk5w884wqzhjw8s.rar

BORHAN TEC
یک شنبه 10 بهمن 1389, 17:17 عصر
یک روشی که قبلاً کشف کرده بودم این است:
شما باید یکی از پروسه های اصلی سیستم عامل را ببندید (و یا به اجرای آن پایان دهید) با این کار سیستم همچین خاموش می شه که انگار برق رو قطع کرده اید.
البته فکر می کنم با این روش بعد چند روز قادر خواهید بود ویندوز بترکونید!!!
آه :اشتباه: ببخشید!!!! :افسرده:
این روشی که ذکر کردم سیستم رو خاموش نمیکنه و اون رو راه اندازی مجدد میکنه!!! :ناراحت:

ahmadi3d_ali
دوشنبه 11 بهمن 1389, 17:38 عصر
توی این کد هم کد چگونگی خاموش کردن هست هم تشخیص انلاین بودن! شما از اون قسمت خاموشش استفاده کن من حال ندارم جداش کنم بهتون بدم ! :D

unit Unit4;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls ,wininet, ExtCtrls, ComCtrls;

type
TForm4 = class(TForm)
Button1: TButton;
Timer1: TTimer;
ProgressBar1: TProgressBar;
Button3: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
procedure StartRebot;
{ Public declarations }
end;

var
Form4: TForm4;
var
time:integer;
Checkrebot:boolean;

implementation

{$R *.dfm}

function WindowsExit(RebootParam: Longword): Boolean;
var
TTokenHd: THandle;
TTokenPvg: TTokenPrivileges;
cbtpPrevious: DWORD;
rTTokenPvg: TTokenPrivileges;
pcbtpPreviousRequired: DWORD;
tpResult: Boolean;
const
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
begin
if Win32Platform = VER_PLATFORM_WIN32_NT then
begin
tpResult := OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
TTokenHd) ;
if tpResult then
begin
tpResult := LookupPrivilegeValue(nil,
SE_SHUTDOWN_NAME,
TTokenPvg.Privileges[0].Luid) ;
TTokenPvg.PrivilegeCount := 1;
TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
cbtpPrevious := SizeOf(rTTokenPvg) ;
pcbtpPreviousRequired := 0;
if tpResult then
Windows.AdjustTokenPrivileges(TTokenHd,
False,
TTokenPvg,
cbtpPrevious,
rTTokenPvg,
pcbtpPreviousRequired) ;
end;
end;
Result := ExitWindowsEx(RebootParam, 0) ;
end;
procedure TForm4.Button3Click(Sender: TObject);
begin
timer1.Enabled:=false;
ProgressBar1.Position:=0;
checkrebot:=false;
time:=0;
showmessage('you Canceled Automaticly Rebot');
end;

procedure TForm4.FormCreate(Sender: TObject);
begin
time:=0;
end;
procedure TForm4.StartRebot;
begin
timer1.Enabled:=true;
if Checkrebot=true then begin
if Time=10 then
WindowsExit(EWX_REBOOT or EWX_FORCE) ;
end
else
showmessage('Rebot Canceled By user');
end;
procedure TForm4.Timer1Timer(Sender: TObject);
begin
time:=time+1;
ProgressBar1.Position:=time;
StartRebot;
end;

function AmIOnline: boolean;
var
connect_status: dword;
begin
connect_status := 2 {user uses a lan} +
1 {user uses a modem.} +
4 {user uses a proxy} ;
result := InternetGetConnectedState(@connect_status, 0);
end;

procedure TForm4.Button1Click(Sender: TObject);
var
x: cardinal;
begin
if AmIOnline = false then
begin
ShowMessage('You are not online! The aplication for fix your problem will be rebot Automaticly after 10 sec that you press ok this message to cancel rebot press Button "Cancel Rebot" at top');
Checkrebot:=true;
StartRebot;
InternetAutodial(INTERNET_AUTODIAL_FORCE_UNATTENDE D, 0);

//do the stuff you want to do here
InternetAutodialHangup(0);
end
else begin
Checkrebot:=false;
ShowMessage('You are online! No problem');
end;
// do the stuff you want to do here
// application.Terminate;
end;
end.یه نکته که در کد بالا هست اینه که می تونی بگی چند ثانیه بعد از اجرا خاموش بشه ! 0 ثانیه یا 100000 ثانیه!
دلبخواه هست!

mehdi.mousavi
دوشنبه 11 بهمن 1389, 19:02 عصر
با تشکر ار جناب موسوی تغییراتی رو که فرموده بودید در رجیستری اعمال کردم. اما بازم نزدیک به 7-8 ثانیه طول میکشه که سیستم خاموش بشه و در پنجره Windows Shuting down میمونه.

سلام.
حقیقتش من تا آخر هفته فرصت نمیکنم این برنامه رو تست کنم، اما الان نکته دیگه ای به ذهنم خطور کرد و اون timeout ای هستش که OS برای خاتمه NT Service ها در نظر میگیره. میتونم خواهش کنم اینو هم تست کنید و نتیجه رو اعلام کنید؟ کلید مزبور در اینجا قرار داره:


HKEY_LOCAL_MACHINE\System\CurrentControlSet\Contro l\WaitToKillServiceTimeoutکه بصورت پیش فرض 20 ثانیه هستش... به بیان دیگه، کلیه timeout هایی رو که اسم بردید رو به مقادیر کمتری Set کنید و برنامه اتون رو مجددا آزمایش کنید.

موفق باشید.

ahmadi3d_ali
دوشنبه 11 بهمن 1389, 19:11 عصر
چرا خودتون را اذیت می کنید کدی که من گفتم بدون وقفه و در 0 ثانیه می تونه خاموش کنه ! که البته قابل تغییر هم هست

mehdi.mousavi
دوشنبه 11 بهمن 1389, 19:44 عصر
چرا خودتون را اذیت می کنید کدی که من گفتم بدون وقفه و در 0 ثانیه می تونه خاموش کنه ! که البته قابل تغییر هم هست

راستش منم همون پیشنهاد استفاده از EWX_FORCE رو در پست اول دادم، اما بچه ها گفتن اون کار با وقفه ای همراه هستش و سیستم بلافاصله Restart نمیشه. به همین دلیل (و چون خودم فرصت تست نداشتم) گفتم حتما بچه ها تست کرده اند که این حرف رو میزنن، که خوب، اگر کد شما درست کار میکنه، بنابراین معلوم میشه که تست نکرده بودن... (اتفاقا برام جالب بود که تونستن Privilege ها رو دستکاری کنن و Win32 API مزبور رو فراخوانی کنن). منم بر همین اساس فکر کردم ExitWindowsEx علیرغم اینکه پارامتر EWX_FORCE رو بهش میدیم، باز هم داره Timeout ها رو لحاظ میکنه که بحث به این نقطه کشید...

ممنون و موفق باشید.

Felony
دوشنبه 11 بهمن 1389, 20:50 عصر
اتفاقا برام جالب بود که تونستن Privilege ها رو دستکاری کنن و Win32 API مزبور رو فراخوانی کنن
مگه دستکاری Privilege کار غیر معمولیه ؟!

mehdi.mousavi
سه شنبه 12 بهمن 1389, 00:02 صبح
مگه دستکاری Privilege کار غیر معمولیه ؟!

بستگی داره... اجازه بدید از بحث اصلی منحرف نشیم و بیش از این وقت صرف این تاپیک نکنیم.

ممنونم.

Mask
سه شنبه 12 بهمن 1389, 13:01 عصر
ممنون از دوستان عزیز.
اگه ممکنه اون برنامه رو که لینکشو گزاشتم دانلود کنید تا متوجه بشید منظورم چیه.
هر کاری و هر روشی که دوستان فرمودند رو انجام دادم اما بازم پنجره Windows shuting down مییاد.
اما برنامه مد نظر من اصلا به این پنجره نمیرسه.

ahmadi3d_ali
سه شنبه 12 بهمن 1389, 14:22 عصر
روشی که من گفتم را امتحان کردید!؟؟؟ من مطمئن هستم بدون وقفه خودش خاموش میکنه!

Mask
سه شنبه 12 بهمن 1389, 15:14 عصر
ممنون از پاسخ دوستان.
اینم یه نمونه برنامه از کد شما.
چند ثانیه ای رو معطل میمونیم.

fire.angle
چهارشنبه 13 بهمن 1389, 13:39 عصر
سلام
حق با آقای Delphi-7 هست
تاخیر داره
اون برنامه ای رو که آقای Delphi-7 گذاشتند رو ببینید اون برنامه نه تنها تاخیر نداره بلکه رجیستری رو هم دستکاری نمی کنه

لطفا راهنمایی کنید

Mask
پنج شنبه 05 اسفند 1389, 14:33 عصر
ممنون از دوستانی که در این پست شرکت کردند.
با کمک دوست عزیزم M8spy تونستم کد مربوطه به این کار رو البته برای vb پیدا کنم.
حالا از دوستانی که vb و دلفی بلدند خواهشمندم که این کد رو تبدیل به دلفی بکنند.
ممنون از همه.

Private Declare Function RtlAdjustPrivilege& Lib "ntdll" (ByVal Privilege&, ByVal NewValue&, ByVal NewThread&, OldValue&)
Private Declare Function NtShutdownSystem& Lib "ntdll" (ByVal ShutdownAction&)
Private Const SE_SHUTDOWN_PRIVILEGE& = 19
Private Const SHUTDOWN& = 0

Private Sub Command1_Click()
RtlAdjustPrivilege SE_SHUTDOWN_PRIVILEGE, 1, 0, 0
NtShutdownSystem SHUTDOWN
End Sub

loo30fer
پنج شنبه 05 اسفند 1389, 16:29 عصر
من کد ویژوال بیسیکتون رو تست کردم دیدم بله سریعتر از اینم میشه کد دلفیش رو براتون قرار دادم درست عین کد ویژوال بیسیک عمل میکنه

function SetPrivilege(sPrivilegeName: String; bEnabled: Boolean): Boolean;
var
TPPrev, TP : TTokenPrivileges;
Token : Cardinal;
dwRetLen : DWord;
begin
Result:= False;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token);
TP.PrivilegeCount:= 1;
if LookupPrivilegeValue(Nil, PChar(sPrivilegeName), TP.Privileges[0].LUID) then begin
if bEnabled then
TP.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED
else
TP.Privileges[0].Attributes:= 0;
dwRetLen:= 0;
Result:= AdjustTokenPrivileges(Token, False, TP, SizeOf(TPPrev), TPPrev, dwRetLen);
end;
CloseHandle(Token);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
NTShutDownSystemFunc: function(Action: DWord): dword; StdCall;
DLLHandle: THandle;
begin
SetPrivilege('SeShutdownPrivilege', true);
DllHandle := LoadLibrary('NTDLL.DLL');
@NTShutDownSystemFunc := GetProcAddress(DllHandle, 'NtShutdownSystem');
if @NTShutDownSystemFunc<>Nil then
NTShutDownSystemFunc(0);
FreeLibrary(DllHandle);
NTShutDownSystemFunc(2);
end;اینم توضیحات مربوطش :

If you use NTShutDownSystemFunc(2); it will shutdown and power off on ACPI Systems
If you use NTShutDownSystemFunc(1); it will reboot
If you use NTShutDownSystemFunc(0); it will shutdown

loo30fer
پنج شنبه 05 اسفند 1389, 17:52 عصر
بله درسته دوست عزیز
ولی کد دوم رو که گذاشتم تست کردم و با نحوه کار کد ویژوال بیسیک شما هیچ فرقی نمیکرد هر دو هم ntdll رو صدا میزدن احتمالا شما کد آخری من رو تو صفحه دو رو ندیدین اون کدم رو که جناب موسوی حذف کردن به دلیل تکرار کلا من قصد نقض قوانین رو هم نداشتم متوجه کد دوستمون رو نبودم شرمنده

loo30fer
شنبه 07 اسفند 1389, 19:46 عصر
دوست عزیز اگه اشتباه نکنم اونم کد آخری که قرار دادم با ntdll کار میکنه و من این کد رو بر اساس همین Ntdll برای شما پیدا کردم و اصلا نحوه کار کرد و مدت زمان خاموش کردنش با کد بیسیک شما یکی هست نمیدونم تست کردین یا نه ؟