Bilgisayarı Kapat!


83

Meydan okuma:

Seçtiğiniz programlama dilinde, kodunuzun çalıştırıldığı makineyi kapatın.

kurallar

  • Kaynak tükenmesi nedeniyle kapanma yok (örneğin: kapanmaya zorlamak için forkbomb)
  • İsterseniz, yalnızca belirli bir ortamda / OS'de çalışan kod yazmanıza izin verilir.
  • Standart boşluklar yasaktır

Bu , bu nedenle en düşük bayt miktarı kazanır!


62
Arkadaşlarım var, bunu okulda yapanlar ve 'korsan olduklarını
sanıyorlar

12
Böyle bir `whatever`;Bash / Perl / PHP / Ruby / etc'yi durdurmak için bir kural koymalıyız . stupiglots.
Manatwork

260
Windows, 0 bayt. Bilgisayarı birkaç gün açık bırakın ve otomatik güncellemelerin işlerini yapmasına izin verin
Luis Mendo

28
TIO bağlantılarının eksikliğini fark eden başka biri var mı?
steenbergh

8
@MontyHarder Bu sayfayı okuduktan sonra şu terimi shatdown: past tense of the verb shutdown
yazıyorum

Yanıtlar:


92

Montaj (x86 / x64, Linux gibi) , 22 21 19 bayt

mov  $0x58,       %al  # 2 bytes: b0 58
mov  $0xfee1dead, %ebx # 5 bytes: bb ad de e1 fe
mov  $0x28121969, %ecx # 5 bytes: b9 69 19 12 28
mov  $0x4321fedc, %edx # 5 bytes: ba dc fe 21 43
int  $0x80             # 2 bytes: cd 80

Kök olarak çalıştırılmalıdır.

Bu, güç düğmesine basmaya eşittir ve PC'nizi kapatmak için güvenli bir yol değildir. Tüm açık uygulamaları kapattığınızdan ve çalıştırdığınızdan emin olun.sync bu programı yürütmeden önce tüm dosya sistemi arabelleklerini yıkadığınızdan , en azından dosya bozulması riskini en aza indirin.

Test sürüşü

$ as -o poweroff.o poweroff.s
$ ld -o poweroff   poweroff.o
ld: warning: cannot find entry symbol _start; defaulting to 0000000000400078
$ sudo sh -c 'sync && ./poweroff'
root's password:

Karanlığın ardından.

Nasıl çalışır

int $0x80bir yazılım kesintisini çağırır. Hem x86 hem de x64'te çalışır, ancak on yıldan beri kullanımdan kaldırılmıştır ve üretim kodunda kullanılmamalıdır. x64 kodu kullanmalısyscallBunun yerine . x86 kullanmalı sysenter, ancak kod golf için çok zahmetlidir.

Sistemden kaynaklanan sonuç, EAX - EDX, ESI ve EDI kayıtlarına bağlıdır. Linux syscall Referans yoluyla ulaşılabilir tüm syscalls gösterir int $0x80.

EAX tuttuğunda (88) 0x58 , yeniden da kapatmak için kullanılabilecek adlandırılan yatırmak, veya bilgisayar gibi hazırda bekleme çekirdek anahtarlama ve devre dışı bırakma veya etkinleştirme Ctrl - Alt - Del anahtar açılan.

Programın başında - ve asveya ile derleyerek gcc -nostdlib, aslında programın başında olduğumuzdan emin olabiliriz - çoğu kayıt 0 olarak ayarlanmıştır . Bu, EAX'i içerir , böylece EAX'inmov $0x58, %al 8 bitini 0x58'ye ayarlamak, böylece EAX'in kendisini 0x58'e ayarlamak için kullanabiliriz . Bu, iki bayttan xor %eax, %eaxdaha fazlasını 0x58'imov $0x58, %eax kodlayan düze üzerine kayıt defterine bir kez daha el ile sıfırlama ile kazandırır 32 bit olarak .

Yeniden başlatılacak ilk iki argüman , muhtemelen yanlışlıkla yeniden başlatmayı önlemek için sihirli sayılardır ve EBX ve ECX kayıtlarından okunur. Bu sayılar belirli sabitlere eşit değilse, yeniden başlatma işlemi herhangi bir işlem gerçekleştirmeyi reddeder.

  • İlk sihirli sayı , büyük olasılıkla PC'nin kapanması / ölümü anlamına gelen 0xfee1dead ( ölü hissediyorum ) ile aynı olmalıdır .

  • İkinci sihirli sayı dört farklı sabite eşit olabilir, ancak son üçü Linux'un eski sürümlerinde çalışmadı. Bunların hepsi, bilgisayarın daha sonraki açılışı / doğumuna atıfta bulunuyor gibi görünüyor.

    • 0x28121969 , Linus Torvalds'ın doğum gününü temsil eder (28 Aralık 1969).

    • 0x05121996 , Patricia Torvalds'ın doğum gününü temsil ediyor (5 Aralık 1996).

    • 0x16041998 , Daniela Torvalds'ın doğum gününü temsil ediyor (16 Nisan 1998).

    • 0x20112000 , Celeste Torvalds'ın doğum gününü temsil ediyor (20 Kasım 2000).

    Patricia, Daniela ve Celeste Torvalds, Linus Torvalds'ın üç kızıdır.

  • EDX kaydı, istediğimiz "yeniden başlat" türünü seçer. 0x4321fedc , bilgisayarı kapatıp kapatan , RB_POWER_OFF .

  • Son olarak, ESI kaydının değeri RB_POWER_OFF için yoksayılır ; EDI kaydının değeri tamamen yeniden başlatma ile göz ardı edilir .

Alternatif sürüm, yalnızca x64, 19 bayt

X64'te, aynı bayt sayısı için uygun bir sistem kullanabiliriz.

mov     $0xa9,       %al  # 2 bytes: b0 a9
mov     $0xfee1dead, %edi # 5 bytes: bf ad de e1 fe
mov     $0x28121969, %esi # 5 bytes: be 69 19 12 28
mov     $0x4321fedc, %edx # 5 bytes: ba dc fe 21 43
syscall                   # 2 bytes: 0f 05

Tek fark talimat ( syscallvs int $0x80), __NR_REBOOT ( 0xa9 - 0x58 ) ve ilgili kayıtların değerleridir.


Normalde exe başlığı için gereken çerçeveleme baytı olmadan derlenmiş bayt olarak montajı sayıyor muyuz?
Joshua

Evet, çünkü her komut ikili dosyadaki belirli baytlara karşılık gelir. ELF dosyaları (veya işletim sisteminizin kullandığı biçim), farklı bir dil olarak kabul edilir ve uygun bir puan elde etmek için el ile oluşturmanız gerekir.
Dennis

Kodun montajından sonra onaltılı dökümü ekler misiniz?
ckjbgames


Ben şimdi fee1çok dead
arminb

49

PowerShell, 13 bayt

Stop-Computer

Oldukça kendini açıklayıcı? PowerShell çekirdeğinde çalışmadığı için Linux / MacOS için PowerShell'de çalışmaz (zaten TIO :-D'de denedi).

Bonus Çöp Gönderme, 12 bayt

gcm s*r|iex

Testimde bu, Windows 2003'te PowerShell 2.0 ile çalışıyor. Yeni sürümlerin çoğunda çalışmaz ve hangi modüllerin yüklü olduğuna bağlı olarak çalışmayabilir. Oldukça korkunç!

Bu, desene sahip herhangi bir komut listesinde arama yapar s*rve ardından hepsini çalıştırır! Açık olmak gerekirse, bu tehlikeli, bunu yapma!

İşin püf noktası, zorunlu parametrelere sahip olmayan komutların bir listesini almaktır, aksi takdirde PowerShell bir değer ister.

2003 makinemde döndürdüğü 3 komut şunlardır:

CommandType     Name                                                Definition                                         
-----------     ----                                                ----------                                         
Application     scrnsave.scr                                        C:\WINDOWS\system32\scrnsave.scr                   
Application     ssmarque.scr                                        C:\WINDOWS\system32\ssmarque.scr                   
Cmdlet          Stop-Computer                                       Stop-Computer [[-ComputerName] <String[]>] [[-Cr...

Evet, seçim çerçevesi ekran koruyucusunu başlatır, ancak hayır, başlatılmadan önce tamamlanmasını beklemez Stop-Computer .

Bu yaklaşım, hangi modüllerin kurulu olduğuna bağlı olarak, daha yeni makinelerde çalışabilir, ancak Windows 2012 ve 2016'da yapabileceğimin en iyisi 14 baytı :

gcm sto*er|iex

(ve evet, tabi ki, winbatch gönderimi PowerShell'de çalışacak ve daha kısa, ama .. bu eğlenceli değil)


4
Win7 & Win10 (ve belki de daha fazlası) gcm *p-c*|iexiçin bir tane daha kısaltın: - ve sadece bir sonuç da var!
Bob

@Bob hala kurulu modüllere oldukça bağımlı; Win10 makinemde, bir kısmı zorunlu parametrelere sahip olacak olan 6 sonuç döndürüyor (bu yüzden istekte bulunacaklar ve asla başaramayacaklar Stop-Computer, bu da son sonuçtur).
Britanist

39

Toplu iş, 10 bayt

Pencerelerde bu yeterli olacaktır

shutdown/s

Bu bir dakika içinde bir kapanma ayarlayacaktır.

Alternatif olarak, @flashbang'ın işaret ettiği gibi:

shutdown/p

Bu hemen bilgisayarı kapatır.


79
Press the big button on the front of your computer= 0 bayt
RaisingAgent

96
@RaisingAgent Burada PPCG'de sorunlarımızı kodda çözüyoruz. Fiziksel emek kaşlarını çattı.
steenbergh

12
@steenbergh Bilmiyorum ... 10 tuşa karşı büyük bir düğmeye basmak?
Butonla

16
@RaisingAgent Teklifinizde ölçeklenebilirlik sorunları var. Haftada dört kez 10.000 bilgisayar için yapmayı deneyin.
Emilio M Bumachar

10
@RaisingAgent gerçek adamları, PSU'da bulunan anahtarı kullanır
Cruncher

35

x86 makine kodu, Lenovo Z510, DOS COM veya Bootloader, 7 bayt

BITS 16

mov ax, (1 << 13) | (7 << 10)
mov dx, 1804h
out dx, ax

İçine monte B8 00 3C BA 04 18 EF

" Yalnızca belirli bir ortamda / işletim sisteminde çalışan, isterseniz dilerseniz " kod yazmanıza izin verilir "ifadesinden yararlanıyorum : bu yalnızca Lenovo Z510 1'de çalışır .

Bu SLP_TYPa << 10 | SLP_EN, PM1a_CNTACPI kaydına yazar , bu değerleri aylar önce ACPI tablolarından kapatma hakkında bir cevap için kullandım (burada yukarıdaki koda biraz içerik verdim).

Bu, DOS altında bir COM olarak çalıştırılabilir (sadece ikili verileri bir dosyaya yazın ve uzantıyı "com" olarak değiştirin) veya bir bootloader olarak çalışabilir.
İkincisi için standart imzayı yazın ve modern bellenimle ilgili sorunlara dikkat edin .


1 Kesinlikle doğru değil, aynı ACPI yapılandırmasına sahip olan herhangi bir sistem de kapanacaktır.


13
Sınırlı platform nedeniyle yükseltildi.
pipo

Ha! Biri Dennis'i yendi!
Joshua

7 bayt sayımı yapacaksanız, buna bir montaj çözümü yerine makine kodu gönderimi demelisiniz. Derleme gönderimi 63 bayttır.
Jakob

@Jakob Haklısın!
Margaret Bloom

Bu soruyu cevaplamak için doğru kişiye benziyor: stackoverflow.com/questions/2019463/... (. Ben, ona sefil başarısız utanç dışına benim "cevabını" silmek zorunda)
Prof. Falken

34

GRUB kabuğu , 4 bayt

golfed

halt

Komut: Durma - no-apm

Komut bilgisayarı durdurur. --No-apm seçeneği belirtilirse, APM BIOS çağrısı yapılmaz. Aksi halde, bilgisayar APM kullanılarak kapatılır.

Bonus

İşte GRUB kabuk gerçekten Tur olduğuna dair bir kanıt n ing tamamlama (yorumlar):

enter image description here


grub kabuk bir "programlama dili" değildir
Alnitak

9
@Alnitak, seni böyle düşündüren ne? Bu oldukça gelişmiş özellikleri built-in scripting language, which has a syntax quite similar to that of GNU Bash and other Bourne shell derivativesve değişkenleri, koşullu yapıları, fonksiyonları ve destekler daha o kadar belli ki, bir Torna tamamlama, herhangi bir tedbir.
zeplin

1
Tamam, onu geri alacağım - baktığımda o şeyleri bulamadım
Alnitak

28
Bir spinner gösteremez zaman açıkça Tur taraf değildir n ing tamamlama
J_F_B_M

1
Bash'de aynı komut var.
Paweł Tokarz

31

65C02 makine kodu, 1 bayt

STP talimatı (0xDB):

STP, 65C02'nin saat girişini durdurur, donanım sıfırlama gerçekleşene kadar 65C02'yi etkili bir şekilde kapatır (yani RES pimi azalır). Bu, 65C02'yi düşük güç durumuna getirir. Bu, düşük güç tüketimi gerektiren uygulamalar (devreler) için kullanışlıdır, ancak STP başka türlü görülmez.

(Kaynak: http://www.6502.org/tutorials/65c02opcodes.html )

xxd dökümü:

00000000: db                                       .

Gürültü. Ben bir Apple II korsanıydı, o zamanlar bu opcode'u bile hatırlamadım.
tür

1
Evet, daha fazla özelliği olan 65c816 emülatörü yazdıktan ve bu mücadeleyi gördükten sonra ne yapacağımı biliyordum: P Ayrıca, şu ana kadarki tek 1 byte cevabı gibi görünüyor! o /
therealfarfetchd

24

Matlab, 21 Bayt

system('shutdown -s')

Bunu denemedim (günün ortasında yeniden başlatmak için tüm programları kapatmak gerçekten cazip değil), ancak çalışması gerekiyor.. Bu çalışıyor...

Daha sonra kısa bir açıklama ekleyeceğim, dizüstü bilgisayarım şu anda kapalı.


105
"Daha sonra kısa bir açıklama ekleyeceğim, dizüstü bilgisayarım şu anda kapalı." <- Kapatma zorluğu tehlikesi
Suever

4
Axaxaxaxa, peki, bilgisayarınızı her defasında bir kez yeniden başlatmak fena olamaz :)
RaisingAgent

6
uptimeYine de mahvetti mi
Wayne Werner

Neden bunu shutdown -skabuk olarak göndermek yerine MATLAB olarak sunuyorsun?
immibis

10
Çünkü benim için deniz kabuğu kumsalda bulduğum bir şey ya da bir benzin istasyonu.
Stewie Griffin,

21

MATLAB, 11 bayt

!shutdown/p

Stewie Griffin'in yaklaşımına biraz benziyor . Ancak, MATLAB sahiptir yolu sistem komutlarını çağırma kısa yollar; Bu durumda !kullanılır. Windows .exekomut adlarına ihtiyaç duymaz , bu yüzden de kalmaz. Bu /seçenek hala destekleniyor (Windows 10 kullanıyorum) ve bu alana olan ihtiyacı ortadan kaldırıyor. Alternatifler:

system shutdown/p % 17 bytes; uses so-called 'command' syntax.
dos shutdown/p    % 14 bytes; the 'dos' command can be used just as well.

19

SmileBASIC, 14 11 6 bayt

OPTION

3DS'nin yeniden başlatılmasına neden olan bir çöküş tetikler. Umarım bu önemlidir.

En son sürümde çalışır.


Bunun yamalı olduğunu sanıyordum ... Lütfen bir sürüm numarası ekleyin.
wizzwizz4

3
Henüz Japonya dışında piyasaya sürülmemiş olan 3.5 sürümünde yamalıydı.
12Me21

4
@ 12Me21 Emin sayılır. Güzel çevre seçimi.
P. Ktinos

Sadece REBOOTSBv2 den geçerli bir cevap sayılırsa.
salyangoz_

16

Bash, 7 6 bayt

init 0

Programın root olarak çalıştırıldığı varsayılmaktadır.


Aslında, makineyi kapatmak gerekiyor. Bu nedenle geçerli bir cevap olarak 'dur-p' ye ihtiyacınız var
P. Ktinos

4
Bu düzenleme katliamı :)
RaisingAgent

@ P.Ktinos: poweroffbiraz daha fazla harf olmasına rağmen, tek bir kelimedir.
ccpizza

1
@ ccpizza Doğru, ancak tipik puanlama kriterleri bayt sayısıdır
Suever

13

Java, 101 98 62 42 bayt

()->{Runtime.getRuntime().exec("init 0");}

@Snowman'ın belirttiği gibi, soru tam bir programın gerekli olup olmadığını belirtmedi, bu yüzden bu hala kabul edilebilir olmalıdır.


2
Bu yerine daha kısa classolan interfacebu size atlamak için izin verdiği publicana dan.
Pavel

6
Bir başvuruda bulunabilirsiniz, çünkü soru gönderimin tam bir program olması gerektiğini belirtmemiştir:void f()throws Exception{Runtime.getRuntime().exec("shutdown/s");}

1
Olmaz Linux sürümü biraz daha kısa olacak?
jpmc26

2
()->{Runtime.getRuntime().exec("init 0");}veya geçici olarak ()->Runtime.getRuntime().exec("init 0")(şu anda kontrol edemezsiniz). Özel bir boşluk bırakmayan fırlatma arayüzü uygulayan bir lambdadır.
Olivier Grégoire

1
Bu, Linux'a özgü bir cevap olarak etiketlenmelidir, örneğin "LInux'ta Java".
Jakob

13

Python 2,29 bayt

import os;os.system('init 0')

Linux sistemlerinde çalışır ve kök ayrıcalıklara ihtiyaç duyar.

Windows için 33 bayt

import os;os.system('shutdown/p')

Bu sadece şimdiye kadar yazdığım en az ilginç veya faydalı kod olabilir.


2
Bir başkası Linux kabuk versiyonunu yayınladı .
jpmc26

1
Ah, tamam, benim kötü ..
FlipTack

12

Commodore 64, 11 bayt

0 sys64738

Bu BASIC komut isteminden geliyor. Veya...

Commodore 64, 6502 montajı, 3 bayt (montajlı), 16 bayt (kaynak)

*=8000
JMP $FCE2

Commodore 64'ün BASIC'den gelen doğrudan giriş modunu sys64738kullanmanın, sıfır program kullanacağını ve saklayacak başka bir program bulunmadığını düşünüyorum; Ekran RAM kullanıyorsunuz, ancak bu RAM zaten boşluklarla dolu olacak, bu nedenle bu boşlukları metinle değiştiriyorsunuz.
Shaun Bebbers

2
Kaynak kodu yer kaplar. O değil diye ayırmak boşluk hedef makinede 0 bayt kaplıyor anlamına gelmez. Aksi halde cevap `` olur.
wizzwizz4

3
Sen arasında boşluk gerekmez 0ve sys64738, sen yerine syskısayol formu ile sY, ve ben programın uzunluğu sondaki yeni satır sayılmaz. Ancak, kodunuzun gereksinimleri karşıladığını sanmıyorum: 64738'deki kod yumuşak bir sıfırlama yapıyor, bir güç kaybı değil.
Mark

2
Kapanmaz.
TecBrat

1
Bir zamanlar Commodore 64'ün üzerine bira döktüm, bu da sürekli olarak kapandı. Bu sayılır mı?
Shaun Bebbers,


11

C ++ 51 40 bayt

Ingve sayesinde -11 bayt !

#include<os>
int main(){OS::shutdown();}

Sadece IncludeOS'ta çalışıyor (v0.10.0-rc.1)

Ölçek:

$ pwd
/home/simon/IncludeOS/examples/demo_service

$ cat service.cpp
#include<os>
int main(){OS::shutdown();}

$ mkdir build && cd build && cmake .. && make && cd ..
[...]

$ boot build/IncludeOS_example
[...]
================================================================================
================================================================================
 IncludeOS v0.10.0-rc.1-9-g151a2b9
 +--> Running [ IncludeOS minimal example ]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

$

1
Şimdi IncludeOS hakkında merak ediyorum
Karl Napf

: @KarlNapf Alfred IncludeOS hakkında CppCon 2016 büyük bir sunum düzenledi youtube.com/watch?v=t4etEwG2_LY daha :-) bilmek istiyorum
Simon

1
Kullanmanıza gerek yoktur void Service::start, int main IncludeOS'ta da çalışır .
10'da

10

AppleScript, 30 bayt

tell app "Finder" to shut down

Ne diyorsa aynısını yapar: Bulucu'ya bilgisayarı kapatmasını söyler.


9

AutoHotkey, 11 10 Bayt

Gurupad Mamadapur sayesinde bir bayt kaydedildi

Shutdown,9

AHK, varsayılan olarak bir Kapatma komutunu destekler. Bu 9, Shutdown=1+ dan oluşan bir bayraktır PowerDown=8.


1
AHKgizemli.
Gurupad Mamadapur

Virgülden sonra boşluğa mı ihtiyacınız var?
therealfarfetchd

sonra boşluk ,gerekli değildir. Farklı bir bayrakla test etmeyi deneyin. Bunun bilgisayarı hemen kapatmayacağını ve açılışta yükleyen ana komut dosyasına koyacağımı düşündüm: D Şimdi güvenli modda yüklüyorum ve sorunu çözüyorum. İç çekmek.
Gurupad Mamadapur

9

Makine kodu (x86, önyükleyici) 18 bayt

b8 01 53 33 db cd 15 b8 07 53 bb 01 00 b9 03 00 cd 15

demontaj:

mov ax, 0x5301 ; connect to real-mode APM services
xor bx, bx     ; device id 0 - APM BIOS
int 0x15       ; call APM
mov ax, 0x5307 ; set power state
mov bx, 0x0001 ; on all devices
mov cx, 0x0003 ; to Off
int 0x15       ; call APM

Bochs'un hata ayıklayıcısında aşağıdaki komutlarla test edebilirsiniz (simülasyonu başlattıktan sonra, bazı disk sürücü kurulumlarını yaptıktan sonra):

pb 0x7c00
c
setpmem 0x7c00 4 0x335301b8
setpmem 0x7c04 4 0xb815cddb
setpmem 0x7c08 4 0x01bb5307
setpmem 0x7c0c 4 0x0003b900
setpmem 0x7c10 2 0x15cd
c

Bu aynı makine kodu DOS çalıştırılabilir olarak da çalışacaktır (*.COM ) .


7

C #, 79 54 53 bayt

Bu, Windows'ta çalışır.

79 bayt :

class _{static void Main(){System.Diagnostics.Process.Start("shutdown","/s");}}

TheLethalCoder sayesinde 53 byte :

_=>System.Diagnostics.Process.Start("shutdown","/s");

2
Mücadelenin tam bir program gerektirmediğini ve bir girdi (elbette kullanılmayan) almasına izin vermediğini unutmayın, böylece bir 54 bayt için derleyip Action<int>yapabilirsiniz _=>System.Diagnostics.Process.Start("shutdown", "/s");.
TheLethalCoder

@TheLethalCoder, güncellendi, teşekkürler!
Dariusz Woźniak

Gereksiz alanı da kaldırabilirsiniz.
17:17

Tabii ki evet! Teşekkür ederim, @nothrow :)
Dariusz Woźniak

6

AutoIt, 11 bayt

Shutdown(1)

Kapatma işlevi aşağıdaki kodların birleşimini alır

0 = Logoff
1 = Shutdown
2 = Reboot
4 = Force
8 = Power down
16= Force if hung
32= Standby
64= Hibernate

Kapatma ve kapatma, örneğin, kod 9 olacaktır (kapatma + kapatma = 1 + 8 = 9).


1
0(logoff) burada özel bir durumdur; dolaylı olarak Bekleme veya Hazırda Bekletme ile birleşmez.
wizzwizz4

Tamam0 + 32 = 32
rahnema1

Hm, bekleme / hazırda bekletme moduna geçmeden önce her zaman oturumu kapattı mı?
Ruslan

@Ruslan Tam olarak nasıl çalıştığını bilmiyorum, daha fazla geri bildirim almak için AutoIt kullanıcı forumuna başvurabilirsiniz :-)
rahnema1

6

Windows - NativeAPI, 212 bayt

Tamam, bu gerçekten en kısa sürüm değil. Ama belki bazıları için ilginç. Bu olacak değil Win32 alt üzerinde yürütün. Ancak yerel api bağlamında çalıştırıldığında çalışır (autochk.exe gibi)

kod

#define WIN32_NO_STATUS
#include <windef.h>
#include <winnt.h>
#include <ntndk.h>
NTSTATUS main() {
RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE,TRUE,FALSE,NULL);
return ZwShutdownSystem(ShutdownPowerOff);
}

İnşa etmek

Bunu oluşturmak için WinDDK build.exearacını kullanın (için uygun bir sourcedosyayla NMAKE)

Veya derlemek ve bağlamak için bu komutları kullanın:

cl /Gd /D_X86_ /showIncludes /I%DDK_INC_PATH% /I%CRT_INC_PATH% /c main.c
link /verbose /nodefaultlib /subsystem:native /machine:X86 /entry:NtProcessStartup@4 C:\WinDDK\7600.16385.1\lib\win7\i386\nt.lib C:\WinDDK\7600.16385.1\lib\win7\i386\ntdllp.lib C:\WinDDK\7600.16385.1\lib\win7\i386\BufferOverflow.lib .\main.obj 

Not: Bu, x86 yerel bir yürütülebilir dosya oluşturacaktır. Bunu farklı bir mimari için inşa etmek istiyorsanız uygun bitleri değiştirin.

Ölçek

Yerel bir yürütülebilir dosyayı test etmek için , win32 alt sistemi yüklenmeden önce çalıştırmanız gerekir . Bunu yapmanın yaygın bir yolu, yürütülebilir dosyayı aşağıdaki kayıt defteri anahtarına eklemektir:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\BootExecute

Uyarı

Ancak bunu yaparsanız, hedef işletim sisteminin kayıt defteri kovanını başka bir işletim sisteminden düzenleme seçeneğiniz vardır. Dan beri artık hedef OS önyükleme mümkün olmayacaktır!

Eski bir anlık görüntüye kolayca geri dönebileceğim bir sanal makinede yaptım!



5

Çoğu Linux kabukları, 15 bayt

# echo o>/p*/*ger

Dizinde olursanız, 11 bayt uzunluğunda olabilir /proc:

# echo o>*ger

Bu çok basittir (bağlantısız dosya sistemleri veya öldürme işlemleri gibi hiçbir yan etkisi yoktur) ve oldukça acımasızdır.


1
En son yönlendirdiğimde joker karakter genişletmeyi denediğimde, eşleşen bir dosya olmasına rağmen içinde joker karakter içeren bir dosya oluşturuldu.
Joshua

5
Bayt sayınıza "/ proc /" eklemeniz gerektiğine inanıyorum
zeppelin

@Joshua Kabuğa bağlı olabilir. Aslında bashbilgisayarımda (ile ) test ettim :-)
Radovan Garabík

1
@Radovan Garabík - Bunun gerçekten geçerli olduğunu sanmıyorum. Bu temelde, "p = poweroff" takma adı ("imkansız" değildir) ve "p" nin geçerli bir 1 baytlı çözüm olduğunu iddia etmekle aynıdır .
zeplin

1
Ama muhtemelen, sadece 3 byte pahasına geçerli hale getirebilirsiniz, bunun gibiecho o>/p*/*ger
zeppelin


5

AppleScript, 44 bayt

tell application "Finder"
shut down
end tell

AppleScript sözdiziminin nasıl çalıştığını ya da herhangi bir şeyi bilmiyorum, bu yüzden herhangi biri bunu nasıl kısaltmayı bilen varsa, lütfen söyleyin.

Ayrıca, bunu okuldaki telefonumda yapıyorum ("hackleme"), bu yüzden test edemiyorum.

14 daha az baytta (çeşit sayesinde)

tell app "Finder" to shut down

Birisi sizden birkaç saat sonra (aynı programla) daha kısa bir çözüm buldu (ancak burada yorum yapmak yerine bunu gönderdi) codegolf.stackexchange.com/a/107958/62824
devRicher

Girinti kaldırabilirsiniz
Cyoce

4
tell app "Finder" to shut downçalışması gerektiğini düşünüyorum (derleme 'uygulama' yerine 'uygulama' yerine).
tür

4

J, 14 bayt

2!:0'poweroff'

Linux sistemlerinde çalışır. 2!:0dizesini çalıştırır /bin/sh.


4

Clojure, 40 39 bayt

(.exec(Runtime/getRuntime)"shutdown/s")

Dan bayrağını değiştirerek -1 bayt -siçin /sbana uzay kurtulmak için izin.

Temelde Java cevabı.

Bunu test etmek eğlenceliydi. Windows, kapatıldığı anda Yüzeyim üzerinde bir ürün yazılımı güncellemesi yapmaya karar verdi. Tabii ki.

(defn shutdown []
  (.exec (Runtime/getRuntime) "shutdown -s"))

2

Node.js, 39 bayt

Linux

require('child_process').exec('init 0')


2

C ++, 48 47 (Windows) 46 45 (Linux) bayt

Snowman sayesinde 1 bayt kaldırıldı

#include<cstdlib>
main(){system("shutdown/p");}

Bu sistem pencereleri kapatmalı

#include<cstdlib>
main(){system("poweroff");}

Bu Linux için sistemi kapatmalı


ihtiyacın var ;
Ajan

1
@LliwTelracs "Kapama / p" olduğundan ve "-p" olmadığından ve alana ihtiyaç duyulmadığından emin olun.
P. Ktinos

Noktalı virgül uygun c ++ sözdizimi için gereklidir, bir eğik çizgi kullanmak pencereler için daha kısa bir cevap verir ancak linux için artık çalışmaz. Her ne kadar pencereler ve linux arasında paylaşılan kapatma için yanlış bir karakter ekledim rağmen
fəˈnɛtɪk

@LliwTelracs Ne istersen yapsan da, ikinci kuralı kötüye kullanmanı ve Linux işlevselliğini önemsememeyi öneririm, çünkü bu bir kod golfü ve düşük bayt miktarı daha iyi.
P. Ktinos

1
#include<cstdlib>Bir bayt tıraş olur.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.