Matikan komputer!

83

Tantangan:

Dalam bahasa pemrograman pilihan Anda, matikan mesin yang menjalankan kode Anda.

Aturan

  • Tidak mematikan karena kehabisan sumber daya (mis: forkbomb untuk mematikan paksa)
  • Anda diperbolehkan menulis kode yang hanya berfungsi di lingkungan / OS tertentu, jika diinginkan.
  • Celah standar dilarang

Ini adalah , sehingga jumlah byte terendah menang!

P. Ktinos
sumber
62
Saya mendapat teman, yang melakukan ini di sekolah dan berpikir mereka 'peretasan': D
RaisingAgent
12
Kita harus membuat beberapa aturan sekali untuk menghentikan `whatever`;Bash / Perl / PHP / Ruby / etc. orang bodoh.
manatwork
260
Windows, 0 byte. Biarkan komputer hidup selama beberapa hari dan biarkan pembaruan otomatis melakukan tugasnya
Luis Mendo
28
Adakah orang lain yang memperhatikan kurangnya tautan TIO?
steenbergh
8
@MontyHarder Setelah membaca halaman itu, saya memutuskan untuk memasukkan istilah tersebutshatdown: past tense of the verb shutdown
FGreg

Jawaban:

92

Majelis (x86 / x64, Linux, as) , 22 21 19 byte

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

Harus dijalankan sebagai root.

Ini sama dengan menekan tombol daya dan bukan cara yang aman untuk mematikan PC Anda. Pastikan Anda menutup semua aplikasi yang terbuka dan mengeksekusi syncuntuk menyiram semua buffer sistem file sebelum menjalankan program ini, untuk setidaknya meminimalkan risiko korupsi file.

Uji coba

$ 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:

Diikuti oleh kegelapan.

Bagaimana itu bekerja

int $0x80meminta interupsi perangkat lunak. Ia bekerja pada x86 dan x64, tetapi telah ditinggalkan lebih dari satu dekade sekarang dan tidak boleh digunakan dalam kode produksi. kode x64 harus digunakan syscallsebagai gantinya. x86 harus digunakan sysenter, tetapi terlalu rumit untuk kode golf.

Tindakan yang dihasilkan dari syscall tergantung pada register EAX - EDX, ESI, dan EDI. The Linux SYSCALL Referensi menunjukkan semua syscalls yang tersedia melalui int $0x80.

Ketika EAX memegang 0x58 (88) , reboot dinamai, yang juga dapat digunakan untuk mematikan, mematikan, atau hibernasi komputer, serta mengganti kernel dan menonaktifkan atau mengaktifkan kombo tombol Ctrl - Alt - Del .

Di awal program - dan dengan kompilasi dengan asatau gcc -nostdlib, kami dapat memastikan bahwa kami benar-benar berada di awal program - sebagian besar register diatur ke 0 . Ini termasuk EAX, jadi kita bisa gunakan mov $0x58, %aluntuk mengatur 8 bit EAX yang lebih rendah ke 0x58 , sehingga mengatur EAX sendiri ke 0x58 . Ini menghemat dua byte lebih dari nol secara manual dengan register xor %eax, %eaxdan satu lagi atas straighforward mov $0x58, %eaxyang mengkodekan 0x58 dalam 32 bit.

Dua argumen pertama untuk reboot adalah angka ajaib, mungkin untuk mencegah reboot tidak disengaja, dan dibaca dari register EBX dan ECX. Kecuali jika angka-angka ini sama dengan konstanta tertentu, reboot menolak untuk melakukan tindakan apa pun.

  • Angka ajaib pertama harus sama dengan 0xfee1dead ( merasa mati ), mungkin mengacu pada matikan / matikan PC.

  • Angka ajaib kedua dapat sama dengan empat konstanta yang berbeda, meskipun tiga yang terakhir tidak bekerja di versi Linux kuno. Semua dari mereka tampaknya merujuk pada kekuatan selanjutnya pada / kelahiran PC.

    • 0x28121969 merupakan ulang tahun Linus Torvalds (28 Desember 1969).

    • 0x05121996 melambangkan ulang tahun Patricia Torvalds (5 Desember 1996).

    • 0x16041998 merupakan hari ulang tahun Daniela Torvalds (16 April 1998).

    • 0x20112000 mewakili ulang tahun Celeste Torvalds (20 November 2000).

    Patricia, Daniela, dan Celeste Torvalds adalah tiga putri Linus Torvalds.

  • Register EDX memilih jenis "reboot" yang kita inginkan. 0x4321fedc adalah RB_POWER_OFF , mematikan PC dan mematikannya.

  • Akhirnya, nilai register ESI diabaikan untuk RB_POWER_OFF ; nilai register EDI diabaikan sepenuhnya oleh reboot .

Versi alternatif, hanya x64, 19 byte

Pada x64, kita bisa menggunakan syscall yang tepat untuk jumlah byte yang sama.

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

Satu-satunya perbedaan terletak pada instruksi ( syscallvs int $0x80), nilai __NR_REBOOT ( 0xa9 vs 0x58 ), dan register yang terlibat.

Dennis
sumber
Apakah kita biasanya menghitung perakitan sebagai byte yang dikompilasi tanpa byte framing yang diperlukan untuk header exe?
Joshua
Ya, karena setiap instruksi sesuai dengan byte spesifik dalam file biner. File ELF (atau format apa pun yang digunakan OS Anda) dianggap bahasa yang berbeda dan harus dibuat secara manual untuk mencapai skor yang layak.
Dennis
Bisakah Anda menambahkan hex dump setelah perakitan kode?
ckjbgames
@ckjbgames Ini dia.
Dennis
Saya fee1sangat deadsekarang.
arminb
49

PowerShell, 13 byte

Stop-Computer

Cukup jelas? Tidak bekerja pada inti PowerShell, sehingga tidak akan berfungsi pada PowerShell untuk Linux / MacOS (sudah mencobanya di TIO :-D).

Pengajuan Bonus Sampah, 12 byte

gcm s*r|iex

Dalam pengujian saya, ini berfungsi pada Windows 2003 dengan PowerShell 2.0. Ini tidak akan berfungsi pada sebagian besar versi yang lebih baru, dan mungkin tidak berfungsi tergantung pada modul yang diinstal. Cukup mengerikan!

Ini mencari daftar perintah untuk setiap dengan pola s*rdan kemudian menjalankan semuanya! Agar jelas, ini berbahaya, jangan lakukan ini!

Triknya tentu saja, adalah mendapatkan daftar perintah yang tidak memiliki parameter wajib, jika tidak PowerShell akan meminta nilai.

Pada mesin 2003 saya, 3 perintah yang dikembalikan adalah:

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...

Ya, ia meluncurkan screensaver tenda, tapi tidak, itu tidak menunggu sampai selesai sebelum diluncurkan Stop-Computer.

Pendekatan ini dapat bekerja pada mesin yang lebih baru, sekali lagi tergantung pada modul mana yang diinstal, tetapi yang terbaik yang bisa saya lakukan pada Windows 2012 dan 2016 adalah 14 byte :

gcm sto*er|iex

(dan ya, tentu saja, pengiriman winbatch akan bekerja di PowerShell dan lebih pendek, tapi .. itu tidak menyenangkan)

briantis
sumber
4
Yang lebih pendek untuk Win7 & Win10 (dan mungkin lebih): gcm *p-c*|iex- dan hanya ada satu hasilnya juga!
Bob
@ Bob masih sangat bergantung pada modul yang diinstal; pada mesin Win10 saya mengembalikan 6 hasil, beberapa di antaranya akan memiliki parameter wajib (jadi mereka akan meminta dan tidak pernah membuatnya Stop-Computer, yang merupakan hasil terakhir).
briantis
39

Batch, 10 byte

Di windows, ini sudah cukup

shutdown/s

Ini akan mengatur shutdown dalam satu menit.

Atau, seperti yang ditunjukkan oleh @flashbang:

shutdown/p

Ini mematikan komputer dengan segera.

steenbergh
sumber
79
Press the big button on the front of your computer= 0 byte
RaisingAgent
96
@RaisingAgent Di sini, di PPCG kami memecahkan masalah kami dalam kode. Kerja fisik disukai.
steenbergh
12
@steenbergh Saya tidak tahu ... menekan satu tombol besar vs. 10 penekanan tombol? Saya akan pergi dengan tombol
WorldSEnder
16
@RaisingAgent Proposal Anda memiliki masalah skalabilitas. Coba lakukan untuk 10.000 komputer empat kali seminggu.
Emilio M Bumachar
10
@RaisingAgent pria sejati menggunakan sakelar yang ada di PSU
Cruncher
35

kode mesin x86, Lenovo Z510, DOS COM atau Bootloader, 7 byte

BITS 16

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

Dirakit menjadi B8 00 3C BA 04 18 EF

Saya mengeksploitasi " Anda diizinkan untuk menulis kode yang hanya berfungsi di lingkungan / OS tertentu, jika Anda mau " ke tingkat tertinggi: ini hanya akan bekerja pada Lenovo Z510 1 .

Ini menulis SLP_TYPa << 10 | SLP_ENke PM1a_CNTregister ACPI, saya membuang nilai-nilai ini dari tabel ACPI bulan lalu untuk jawaban tentang shutdown (di mana saya memberikan sedikit konteks pada kode di atas).

Ini dapat dijalankan di bawah DOS sebagai COM (cukup tulis data biner ke dalam file dan ubah ekstensi menjadi "com") atau sebagai bootloader.
Untuk yang terakhir tulis tanda tangan standar dan waspadalah terhadap masalah dengan firmware modern .


1 Tidak sepenuhnya benar, sistem apa pun yang memiliki konfigurasi ACPI yang sama juga akan dimatikan.

Margaret Bloom
sumber
13
Terpilih karena platform terbatas.
pipa
Ha! Seseorang pukul Dennis!
Joshua
Jika Anda menggunakan hitungan 7-byte, Anda harus menyebutnya sebagai pengiriman kode mesin daripada solusi perakitan. Pengiriman perakitan adalah 63 byte.
Jakob
@ Jakob Anda benar!
Margaret Bloom
Anda terlihat seperti orang yang tepat untuk menjawab pertanyaan ini: stackoverflow.com/questions/2019463/… (saya gagal total, harus menghapus "jawaban" saya karena malu.)
Prof. Falken
34

Shell GRUB , 4 byte

Golf

halt

Perintah: hentikan --tidak-apm

Perintah menghentikan komputer. Jika opsi --no-apm ditentukan, tidak ada panggilan APM BIOS yang dilakukan. Jika tidak, komputer dimatikan menggunakan APM.

Bonus

Berikut ini adalah bukti bahwa GRUB shell memang Tur n ing-lengkap (lihat komentar):

masukkan deskripsi gambar di sini

zeppelin
sumber
grub shell bukan "bahasa pemrograman" - ini bukan Turing lengkap
Alnitak
9
@Alnitak, apa yang membuatmu berpikir begitu? Ini fitur lebih canggih built-in scripting language, which has a syntax quite similar to that of GNU Bash and other Bourne shell derivativesdan mendukung variabel, konstruksi kondisional, fungsi dan lebih , jadi jelas, itu adalah Menghidupkan-lengkap, dengan ukuran apa pun.
zeppelin
1
OK, saya akan mengambilnya kembali - saya tidak menemukan barang itu ketika saya melihat
Alnitak
28
Ketika itu tidak dapat menampilkan pemintal, itu jelas bukan Tur n ing-complete
J_F_B_M
1
Di Bash itu perintah yang sama.
Paweł Tokarz
31

Kode mesin 65C02, 1 byte

Instruksi STP (0xDB):

STP menghentikan input jam dari 65C02, secara efektif mematikan 65C02 sampai terjadi reset perangkat keras (yaitu pin RES menjadi rendah). Ini menempatkan 65C02 dalam kondisi daya rendah. Ini berguna untuk aplikasi (sirkuit) yang membutuhkan konsumsi daya rendah, tetapi STP jarang terlihat sebaliknya.

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

xxd dump:

00000000: db                                       .
di sanaarfarfd
sumber
Noice. Saya adalah seorang hacker Apple II pada hari itu dan bahkan tidak ingat opcode ini.
hati
1
Ya, setelah menulis emulator 65c816 dengan lebih banyak fitur dan melihat tantangan ini saya tahu apa yang harus dilakukan: P Juga, sepertinya ini adalah satu-satunya jawaban 1 byte sejauh ini! \ o /
therealfarfetchd
24

Matlab, 21 Bytes

system('shutdown -s')

Saya belum mencoba ini (menutup semua program untuk melakukan restart di tengah hari tidak benar-benar menggoda), tetapi seharusnya berhasil. . Ini bekerja...

Saya akan menambahkan penjelasan singkat nanti, laptop saya saat ini mati.

Stewie Griffin
sumber
105
"Aku akan menambahkan penjelasan singkat nanti, laptopku sedang mati." <- Bahaya tantangan penutupan
Suever
4
Axaxaxaxa, baiklah, nyalakan kembali komputer Anda sekali-sekali tidak mungkin buruk :)
RaisingAgent
6
Apakah merusak Anda uptime, meskipun
Wayne Werner
Mengapa mengirimkan ini sebagai MATLAB, alih-alih mengirimkan shutdown -ssebagai shell?
user253751
10
Karena bagi saya, shell adalah sesuatu yang saya temukan di pantai, atau pompa bensin.
Stewie Griffin
21

MATLAB, 11 byte

!shutdown/p

Agak mirip dengan pendekatan Stewie Griffin . Namun, MATLAB memiliki cara yang jauh lebih pendek untuk menjalankan perintah sistem; dalam hal ini, !digunakan. Windows tidak perlu .exeuntuk nama perintah, jadi itu ditinggalkan juga. The /opsi masih didukung (Aku sedang menjalankan Windows 10), dan meniadakan kebutuhan untuk ruang. Alternatifnya adalah:

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

SmileBASIC, 14 11 6 byte

OPTION

Memicu kerusakan yang menyebabkan 3DS restart. Saya harap ini diperhitungkan.

Berfungsi dalam versi terbaru.

12Me21
sumber
Saya pikir ini telah ditambal ... Harap sertakan nomor versi.
wizzwizz4
3
Itu telah ditambal dalam versi 3.5, yang belum dirilis di luar Jepang.
12Me21
4
@ 12Me21 Tentu itu penting. Pilihan lingkungan yang bagus.
P. Ktinos
Kalau saja REBOOTdari SBv2 dihitung sebagai jawaban yang valid.
snail_
16

Bash, 7 6 byte

init 0

Dengan asumsi bahwa program dijalankan sebagai root.

Suever
sumber
Memang, mematikan mesin diperlukan. Jadi, Anda perlu 'berhenti-p' sebagai jawaban yang valid
P. Ktinos
4
Pembantaian pengeditan ini :)
RaisingAgent
@ P. Ktinos: poweroffadalah satu kata, meskipun sedikit lebih banyak huruf.
ccpizza
1
@ccpizza Benar, tetapi kriteria penilaian tipikal adalah jumlah byte
Suever
13

Java, 101 98 62 42 byte

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

Seperti yang ditunjukkan @Snowman, pertanyaannya tidak menentukan apakah program lengkap diperlukan, jadi ini masih bisa diterima.

Tom
sumber
2
Lebih pendek untuk diganti classdengan interfaceyang memungkinkan Anda menghilangkan publicdari utama.
Pavel
6
Anda dapat menggunakan metode, karena pertanyaan tidak menentukan pengiriman harus berupa program lengkap:void f()throws Exception{Runtime.getRuntime().exec("shutdown/s");}
1
Bukankah versi Linux sedikit lebih pendek?
jpmc26
2
()->{Runtime.getRuntime().exec("init 0");}atau sementara ()->Runtime.getRuntime().exec("init 0")(tidak dapat memeriksa saat ini). Ini lambda yang mengimplementasikan antarmuka custom void, no-args-throwing.
Olivier Grégoire
1
Ini harus dilabeli sebagai jawaban khusus Linux, misalnya "Java on LInux".
Jakob
13

Python 2, 29 byte

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

Bekerja pada sistem Linux dan membutuhkan hak akses root.

Untuk Windows, 33 byte

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

Ini mungkin kode yang paling tidak menarik atau bermanfaat yang pernah saya tulis.

Gurupad Mamadapur
sumber
2
Orang lain memposting versi shell Linux.
jpmc26
1
Ah ok,
salahku
12

Commodore 64, 11 byte

0 sys64738

Ini dari prompt BASIC. Atau...

Commodore 64, 6502 rakitan, 3 byte (rakitan), 16 byte (sumber)

*=8000
JMP $FCE2
Shaun Bebbers
sumber
Saya pikir bahwa menggunakan mode input langsung Commodore 64 dari BASIC dengan sys64738akan menggunakan nol byte karena tidak ada program atau hal lain untuk menyimpan; Anda menggunakan RAM layar tetapi RAM itu sudah akan diisi dengan spasi, jadi Anda hanya mengganti spasi tersebut dengan teks.
Shaun Bebbers
2
Kode sumber membutuhkan ruang. Hanya karena itu tidak menyimpan ruang pada mesin target tidak berarti itu membutuhkan 0 byte. Kalau tidak, jawabannya adalah ``.
wizzwizz4
3
Anda tidak memerlukan spasi antara 0dan sys64738, Anda dapat mengganti sysdengan bentuk pintasan sY, dan saya tidak menghitung baris tambahan dalam panjang program. Namun, saya tidak berpikir kode Anda memenuhi persyaratan: kode di 64738 melakukan soft reset, bukan poweroff.
Mark
2
Tidak mati.
TecBrat
1
Saya pernah menumpahkan bir di Commodore 64 saya, yang mematikannya secara permanen. Apakah ini masuk hitungan?
Shaun Bebbers
12

TI-Nspire CX CAS, 3 byte

" "+" "

menjumlahkan dua string kosong.

Pada versi kalkulator yang lebih lama, ini akan membuat perangkat mogok dan menyebabkannya melakukan reboot (tidak ada cara untuk mematikan perangkat tanpa mem-boot terlepas dari kombinasi tombol fisik).

Video oleh Adriweb

lebih kaya
sumber
Bukankah itu 7 byte?
Roman Gräf
Kedengarannya meyakinkan bagi saya.
Roman Gräf
11

C ++, 51 40 byte

-11 byte berkat Ingve !

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

Hanya berfungsi di IncludeOS (v0.10.0-rc.1)

Uji:

$ 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 ]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

$
simon
sumber
1
Sekarang saya ingin tahu tentang IncludeOS
Karl Napf
@KarlNapf Alfred mengadakan presentasi hebat di CppCon 2016 tentang IncludeOS: youtube.com/watch?v=t4etEwG2_LY jika Anda ingin tahu lebih banyak :-)
simon
1
Anda tidak perlu menggunakan void Service::start, int main bekerja di IncludeOS juga.
Ingve
10

AppleScript, 30 byte

tell app "Finder" to shut down

Melakukan persis seperti yang dikatakan: memberitahu Finder untuk mematikan komputer.

Menandai
sumber
9

AutoHotkey, 11 10 Bytes

Menyimpan satu byte berkat Gurupad Mamadapur

Shutdown,9

AHK Mendukung perintah Shutdown secara default. Ini 9adalah bendera, terdiri dari Shutdown=1+ PowerDown=8.

ATaco
sumber
1
AHKmisterius.
Gurupad Mamadapur
Apakah Anda memerlukan ruang setelah koma?
therealfarfetchd
ruang setelah ,tidak diperlukan. Coba mengujinya dengan bendera yang berbeda. Saya pikir ini tidak akan segera mematikan komputer, dan meletakkannya di skrip utama saya yang memuat saat startup: D Sekarang saya telah memuat dalam mode aman dan menyelesaikan masalah. Mendesah.
Gurupad Mamadapur
9

Kode mesin (x86, boot loader) 18 byte

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

Membongkar:

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

Anda dapat mengujinya di debugger Bochs dengan perintah berikut (setelah memulai simulasi, mengatur drive disk):

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

Kode mesin yang sama ini juga akan berfungsi sebagai DOS executable ( *.COM).

Ruslan
sumber
7

C #, 79 54 53 byte

Ini berfungsi pada Windows.

79 byte :

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

53 byte , terima kasih kepada TheLethalCoder:

_=>System.Diagnostics.Process.Start("shutdown","/s");
Dariusz Woźniak
sumber
2
Perhatikan bahwa tantangannya tidak memerlukan program lengkap dan tidak melarang mengambil input (tidak digunakan tentu saja) sehingga Anda dapat mengkompilasi ke Action<int>dan lakukan _=>System.Diagnostics.Process.Start("shutdown", "/s");untuk 54 byte.
TheLethalCoder
@TheLethalCoder, diperbarui, terima kasih!
Dariusz Woźniak
Anda juga dapat menghapus ruang yang tidak perlu.
nothrow
Tentu saja ya! Terima kasih, @tidak :)
Dariusz Woźniak
6

AutoIt, 11 byte

Shutdown(1)

Fungsi shutdown mendapat kombinasi kode-kode berikut

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

Untuk mematikan dan mematikan, misalnya, kode akan menjadi 9 (mematikan + mematikan = 1 + 8 = 9).

rahnema1
sumber
1
0(logoff) adalah kasus khusus di sini; itu tidak bergabung dengan Siaga atau Hibernate secara implisit.
wizzwizz4
OK0 + 32 = 32
rahnema1
Hm, jadi apakah selalu logout sebelum pergi ke siaga / hibernasi?
Ruslan
@Ruslan Saya tidak tahu persis cara kerjanya, Anda dapat merujuk ke forum pengguna AutoIt untuk menerima lebih banyak umpan balik :-)
rahnema1
6

Windows - NativeAPI, 212 byte

Oke, ini bukan versi yang terpendek. Tapi mungkin menarik bagi sebagian orang. Ini tidak akan dijalankan pada subsistem Win32. Namun itu akan berjalan ketika dieksekusi dalam konteks api asli (seperti autochk.exe tidak)

Kode

#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);
}

Membangun

Untuk membangun ini, gunakan build.exealat WinDDK (dengan sourcefile yang sesuai untuk NMAKE)

Atau gunakan perintah ini untuk mengkompilasi dan menautkan:

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 

Catatan: Ini akan membangun executable asli x86. Ubah bit yang sesuai jika Anda ingin membangun ini untuk arsitektur yang berbeda.

Uji

Untuk menguji executable asli Anda harus menjalankannya sebelum subsistem win32 dimuat. Salah satu cara umum untuk melakukannya adalah dengan menambahkan executable di kunci registri berikut:

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

Peringatan

Namun, jika Anda melakukan ini, Anda harus memiliki opsi untuk mengedit kumpulan registri dari OS target dari OS lain. Karena Anda tidak akan dapat mem-boot OS target lagi!

Saya melakukannya pada VM di mana saya dapat dengan mudah kembali ke snapshot sebelumnya!

MrPaulch
sumber
5

Groovy, 23 byte

'shutdown /p'.execute()
Gurupad Mamadapur
sumber
2
Apakah ruang sebelum tebasan diperlukan?
steenbergh
3
@steenbergh Ya, itu diperlukan.
Gurupad Mamadapur
@GurupadMamadapur Anda yakin?
TrojanByAccident
5

Sebagian besar shell Linux, 15 byte

# echo o>/p*/*ger

Panjangnya bisa 11 byte, jika Anda berada di /procdirektori:

# echo o>*ger

Ini sangat mudah (tidak memiliki efek samping, seperti melepas sistem file atau membunuh proses) dan agak brutal.

Radovan Garabík
sumber
1
Terakhir kali saya mencoba ekspansi wildcard pada redirect itu menghasilkan file dengan wildcard di dalamnya meskipun ada file yang cocok.
Joshua
5
Saya yakin Anda harus menambahkan "/ proc /" ke hitungan byte Anda
zeppelin
@ Yosua Mungkin tergantung pada shell. Saya benar-benar mengujinya (dengan bash) di komputer saya :-)
Radovan Garabík
1
@Radovan Garabík - Saya tidak berpikir itu benar-benar valid. Ini pada dasarnya sama dengan menyiratkan bahwa ada alias "p = poweroff" (yang bukan "tidak mungkin" juga) dan mengklaim "p" sebagai solusi 1 byte yang valid .
zeppelin
1
Tetapi Anda mungkin dapat membuatnya valid dengan mengorbankan hanya 3 byte, seperti iniecho o>/p*/*ger
zeppelin
5

Android shell, 9 byte

reboot -p
Pedro Lobito
sumber
7
Selamat datang di PPCG!
Produk ETH
5

AppleScript, 44 byte

tell application "Finder"
shut down
end tell

Saya tidak tahu bagaimana sintaks AppleScript bekerja atau apa pun, jadi jika ada yang tahu cara mempersingkat ini, tolong beri tahu.

Juga, saya melakukan ini di ponsel saya di sekolah ("peretasan"), jadi saya tidak bisa mengujinya.

Pada 14 byte lebih sedikit (terima kasih untuk kebaikan) yang bisa Anda katakan

tell app "Finder" to shut down
Daniel
sumber
Seseorang datang dengan solusi yang lebih pendek (dengan program yang sama) beberapa jam setelah Anda (tetapi mempostingnya daripada berkomentar di sini) codegolf.stackexchange.com/a/107958/62824
devRicher
Anda mungkin dapat menghapus lekukan
Cyoce
4
tell app "Finder" to shut downharus bekerja, saya percaya (meskipun kompilasi dapat menggantikan 'aplikasi' dengan 'aplikasi').
hati
4

J, 14 byte

2!:0'poweroff'

Bekerja pada sistem Linux. 2!:0mengeksekusi string dalam /bin/sh.

mil
sumber
4

Clojure, 40 39 byte

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

-1 byte dengan mengubah flag dari -smenjadi /s, yang memungkinkan saya untuk menyingkirkan spasi.

Pada dasarnya jawaban Java.

Menguji ini menyenangkan. Windows memutuskan untuk melakukan pembaruan firmware pada Surface saya begitu ia dimatikan. Tentu saja.

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

Node.js, 39 byte

Linux

require('child_process').exec('init 0')
Tom
sumber
2

AHK, 19 15 byte

Run,Shutdown -s

Hanya bekerja di windows.

Gurupad Mamadapur
sumber
2

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

Dihapus 1 byte berkat Snowman

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

Ini harus mematikan sistem untuk windows

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

Ini harus mematikan sistem untuk Linux

fəˈnɛtɪk
sumber
Apakah kamu membutuhkannya ;?
RaisingAgent
1
@LliwTelracs Cukup yakin itu "shutdown / p" dan bukan "-p" dan ruang tidak diperlukan.
P. Ktinos
Titik koma diperlukan untuk sintaksis c ++ yang tepat, menggunakan slash memungkinkan jawaban yang lebih pendek untuk windows tetapi membuatnya tidak lagi berfungsi untuk linux. Meskipun saya menambahkan karakter yang salah untuk shutdown yang dibagi antara windows dan linux
fəˈnɛtɪk
@LliwTelracs Meskipun Anda dapat melakukan apa pun yang Anda inginkan, saya sarankan untuk menyalahgunakan aturan kedua dan tidak peduli dengan fungsi Linux, karena ini adalah kode-golf dan jumlah byte yang lebih rendah lebih baik.
P. Ktinos
1
#include<cstdlib>akan memangkas satu byte.