PDA

View Full Version : سوال: خاموش کردن سیستم



tanzadeh7
سه شنبه 04 شهریور 1393, 11:21 صبح
سلام دوستان چجوری میشه کامپیوتر رو تو یک برنامه C خاموش کرد یه چیزی خارج از دستورات زیر باشه



system("C://windows/system32/shutdown /s")

یا در لینوکس


system("shutdown -P now")

یا اگه دستوری دیگری نیست چجوری یه فایل Binary رو که تو اسمبلی نوشتم به حافظه بارگیری کنم.

Coder#
سه شنبه 04 شهریور 1393, 15:39 عصر
سلام دوستان چجوری میشه کامپیوتر رو تو یک برنامه C خاموش کرد یه چیزی خارج از دستورات زیر باشه



system("C://windows/system32/shutdown /s")

یا در لینوکس


system("shutdown -P now")

یا اگه دستوری دیگری نیست چجوری یه فایل Binary رو که تو اسمبلی نوشتم به حافظه بارگیری کنم.

باید از قوانین و دستورات پایه ای سیستم عامل(ها) پیروی کنی.
بیشتر از اینکه توجهت رو به C یا هر زبان دیگه ای جلب کنی، باید به سیستم عاملی که در حال کار در اون هستی توجه کنی; چه در حال ضربه زدن باشی چه در حال بهبود دادن، باید طبق قوانین و دستورات پایه ای اون سیستم عامل عمل کنی.
می تونی از این دستورات هم در ویندوز 7 و XP استفاده کنی:
7:

system("shutdown /s");

XP:

system("shutdown -s");

همچنان برای حفظ زمان می تونی این دستورات رو داخل شکم توابع قرار بدی:

void shutdown()
{
system("shutdown /s");
}
در CMD دستور ?/shutdown رو بنویس تا لیستی از دستورات مرتبط با shutdown کامپیوتر برات ظاهر بشه.
به نظرم بهتره سوال بعدیت رو در انجمن مربوط به زبان برنامه نویسی Assembly بپرسی.

ciavosh
سه شنبه 04 شهریور 1393, 16:10 عصر
اجرا کردن فایلهای اجرایی از داخل برنامه از نظر امنیتی خطرناک می باشد و سرعت عملش نیز به نسب پایین است. API ویندوز توابعی دارد که برای این منظور قابل استفاده هستند ولی اگر از API سیستم عامل خاصی در کد استفاده شود کد portable نخواهد بود. یعنی نمیتوان آن را برای سیستم عاملهای دیگر کامپایل کرد.
جناب Coder ایشون که خودشون نوشته بودن غیر از مثالها به روش دیگری میخواهند کار انجام شود! منظور از قوانین و دستورات پایه ای سیستم عامل(ها) چیست؟ چه در حال ضربه زدن باشی چه در حال بهبود دادن؟ بهتره بگیم به قصد ضربه زدن یا بهبود دادن چون موفق شدن در آن شرطه. :چشمک: چگونه قراردادن فراخوانی یک تابع در تابع دیگر به حفظ زمان کمک میکنه؟

negative60
سه شنبه 04 شهریور 1393, 18:50 عصر
تو ويندوز با تابع ExitWindowsEx API ميشه کامپيوتر رو خاموش/ ريبوت/لاگ آف/و... کرد اما در ويندوز هایNT به صورت معمول نميشه از اين تابع استفاده کرد و برنامه بايد حق استفاده و دسترسی به اين تابع رو کسب کنه.

برای کسب امتياز:
bool Adjustprivilege()
{
bool ret;
HANDLE hToken;
LUID mLUID;
TOKEN_PRIVILEGES privs;
HANDLE hProc = GetCurrentProcess();
ret = OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
if(ret == false)
{
printf("error: OpenProcessToken, %d\n", GetLastError());
return false;
}


ret = LookupPrivilegeValueA(NULL, "SeShutdownPrivilege", &mLUID);
if(ret == false)
{
printf("error: LookupPrivilegeValueA, %d\n", GetLastError());
return false;
}


privs.PrivilegeCount = 1;
privs.Privileges[0].Luid = mLUID;
privs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;


ret = AdjustTokenPrivileges (hToken, FALSE, &privs, 0, NULL, NULL);
if(ret == false)
{
printf("error: AdjustTokenPrivileges, %d\n", GetLastError());
return false;
}


return ret;
}




طرز استفاده:
int main()
{ /*
EWX_SHUTDOWN | EWX_FORCE Force ShutDown
EWX_SHUTDOWN ShutDown
EWX_LOGOFF LogOff
EWX_REBOOT Restart
more... http://msdn.microsoft.com/en-us/library/windows/desktop/aa376868(v=vs.85).aspx
*/
bool ret = Adjustprivilege();
if(ret)
{
ExitWindowsEx(EWX_SHUTDOWN, TRUE);
}
return 0;
}



توجه کنيد فلگ EWX_FORCE برای اعمال فوری ديگر فلگ ها استفاده ميشه و بايد همراه ديگر فلگ ها استفاده بشه.

tanzadeh7
سه شنبه 04 شهریور 1393, 19:59 عصر
از کمک هایی که کردید ممنونم ولی من اینها رو بلد هستم و میخوام یه چیز دیگه باشه مثلا ویندوز خودش تو C نوشته شده چحوری shutdown میشه.
این کد ها در اسمبلی کامپیوتر رو خاموش میکنه من به این صورت آنها را در C استفاده کردم ولی خطا میده



asm("mov ax, 0x5307");
asm("mov bx, 0x0001");
asm("mov cx, 0x0003");
asm("int 0x15");

ciavosh
سه شنبه 04 شهریور 1393, 21:12 عصر
از کمک هایی که کردید ممنونم ولی من اینها رو بلد هستم و میخوام یه چیز دیگه باشه مثلا ویندوز خودش تو C نوشته شده چحوری shutdown میشه.<br>
این کد ها در اسمبلی کامپیوتر رو خاموش میکنه من به این صورت آنها را در C استفاده کردم ولی خطا میده<br>
<br>

<br>
asm("mov ax, 0x5307");<br>
asm("mov bx, 0x0001");<br>
asm("mov cx, 0x0003");<br>
asm("int 0x15");<br>
<br>
<br>د ر مورد Protected Mode (http://en.wikipedia.org/wiki/Protected_mode#Privilege_levels) مطالعه کنید.