컴퓨터를 종료하십시오!


83

도전:

선택한 프로그래밍 언어에서 코드가 실행 된 시스템을 종료하십시오.

규칙

  • 리소스 소진으로 종료되지 않음 (예 : 강제 종료를위한 포크 폭탄)
  • 원하는 경우 특정 환경 / OS에서만 작동하는 코드를 작성할 수 있습니다.
  • 표준 허점은 금지되어 있습니다

이것은 이므로 가장 적은 양의 바이트가 이깁니다!


62
나는 학교에서이 일을하고 그들이 '해킹'한다고 생각하는 친구를 얻었다 : D
RaisingAgent

12
우리는 그러한 `whatever`;Bash / Perl / PHP / Ruby / etc 를 막기위한 규칙을 한 번 생각해 내야 합니다. stupiglots.
manatwork

260
Windows, 0 바이트 컴퓨터를 며칠 동안 그대로두고 자동 업데이트가 작동하도록하십시오
Luis Mendo

28
다른 사람이 TIO 링크가 부족하다는 것을 알고 있습니까?
steenbergh 2012 년

8
@MontyHarder 그 페이지를 읽은 후 나는 그 용어를 shatdown: past tense of the verb shutdown
만들어 내기

답변:


92

어셈블리 (x86 / x64, Linux 등) , 22 21 19 바이트

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

루트로 실행해야합니다.

이것은 전원 버튼을 누르는 것과 같으며 PC를 안전하게 끄는 방법은 아닙니다. sync최소한 파일 손상의 위험을 최소화하려면이 프로그램을 실행하기 전에 열려있는 모든 응용 프로그램을 닫고 모든 파일 시스템 버퍼를 플러시 하도록 실행하십시오.

시운전

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

어둠이 뒤 따랐다.

작동 원리

int $0x80소프트웨어 인터럽트를 호출합니다. x86과 x64에서 모두 작동하지만 10 년 이상 사용되지 않아 프로덕션 코드에서 사용해서는 안됩니다. x64 코드가 syscall대신 사용되어야합니다 . x86은을 사용해야 sysenter하지만 코드 골프에는 너무 번거 롭습니다.

syscall의 결과 조치는 레지스터 EAX-EDX, ESI 및 EDI에 따라 다릅니다. 리눅스 시스템 콜 참조 를 통해 사용할 수있는 모든 시스템 콜을 보여줍니다 int $0x80.

EAX 보유하는 경우 (88) 0x58을 , 재부팅 도 잠을하거나 컴퓨터를 최대 절전 모드뿐만 아니라 위해 전원을 차단하는 데 사용 넣을 수있는,라고 커널을 전환하고 비활성화 또는 활성화 Ctrl 키를 - Alt를 - 델의 키 콤보를.

프로그램의 시작에서 -와 함께 컴파일 as또는 gcc -nostdlib대부분의 레지스터로 설정 -, 우리는 우리가 프로그램의 시작 부분에서 실제로 걸 확인 할 수 있습니다 0 . 여기에는 EAX가 포함되어 있으므로 EAX mov $0x58, %al의 하위 8 비트를 0x58 로 설정하여 EAX 자체를 0x58 로 설정할 수 있습니다 . 이렇게하면 레지스터를 수동으로 0으로 xor %eax, %eax만드는 것보다 2 바이트를 절약 하고 32 비트로 0x58mov $0x58, %eax 을 인코딩 하는 straighforward로 한 바이트를 더 절약 할 수 있습니다.

재부팅 할 처음 두 인수 는 실수로 재부팅되는 것을 방지하기 위해 매직 번호이며 레지스터 EBX 및 ECX에서 읽습니다. 이 숫자가 특정 상수와 같지 않으면 재부팅 은 모든 작업을 수행하지 않습니다.

  • 첫 번째 매직 넘버는 0xfee1dead ( 죽은 느낌 )와 같아야 하며 , 아마도 PC의 전원 끄기 / 죽음을 의미합니다.

  • 두 번째 마법 수는 네 개의 다른 상수와 같을 수 있지만 후자의 세 개는 고대 버전의 Linux에서는 작동하지 않았습니다. 그들 모두는 PC의 후속 전원 켜기 / 탄생을 나타내는 것으로 보입니다.

    • 0x28121969 는 Linus Torvalds의 생일 (1969 년 12 월 28 일)을 나타냅니다.

    • 0x05121996 은 Patricia Torvalds의 생일 (1996 년 12 월 5 일)을 나타냅니다.

    • 0x16041998 은 Daniela Torvalds의 생일을 나타냅니다 (1998 년 4 월 16 일).

    • 0x20112000 은 Celeste Torvalds의 생일 (2000 년 11 월 20 일)을 나타냅니다.

    패트리샤, 다니엘라, 셀레스트 토발즈는 리누스 토발즈의 세 딸입니다.

  • EDX 레지스터는 우리가 원하는 "재부팅"유형을 선택합니다. 0x4321fedcRB_POWER_OFF 이며 PC를 종료하고 전원을 끕니다.

  • 마지막으로, ESI 레지스터의 값은 RB_POWER_OFF에 대해 무시됩니다 . EDI 레지스터의 값은 재부팅에 의해 완전히 무시됩니다 .

대체 버전, x64 전용, 19 바이트

x64에서는 동일한 바이트 수에 대해 적절한 syscall을 사용할 수 있습니다.

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

유일한 차이점은 명령어 ( syscallvs int $0x80), __NR_REBOOT 값 ( 0xa9 vs 0x58 ) 및 관련 레지스터에 있습니다.


일반적으로 exe 헤더에 필요한 프레이밍 바이트없이 어셈블리를 컴파일 된 바이트로 계산합니까?
Joshua

예. 각 명령어는 이진 파일의 특정 바이트에 해당하기 때문입니다. ELF 파일 (또는 OS에서 사용하는 모든 형식)은 다른 언어로 간주되므로 적절한 점수를 얻으려면 수동으로 만들어야합니다.
Dennis

코드를 조립 한 후 16 진수 덤프를 추가 할 수 있습니까?
ckjbgames


나는 fee1그래서 dead바로 지금.
arminb 2016 년

49

PowerShell, 13 바이트

Stop-Computer

꽤 설명이 필요하십니까? PowerShell 코어에서는 작동하지 않으므로 Linux / MacOS 용 PowerShell에서는 작동하지 않습니다 (이미 TIO :-D에서 시도했습니다).

보너스 쓰레기 제출, 12 바이트

gcm s*r|iex

필자의 테스트에서는 PowerShell 2.0이 설치된 Windows 2003에서 작동합니다. 대부분의 최신 버전에서는 작동하지 않으며 설치된 모듈에 따라 작동하지 않을 수 있습니다. 꽤 끔찍 해요!

패턴이있는 명령 목록을 검색 s*r한 다음 모든 명령을 실행합니다! 분명히, 이것은 위험합니다, 이것을하지 마십시오!

비결은 필수 매개 변수가없는 명령 목록을 얻는 것입니다. 그렇지 않으면 PowerShell에서 값을 입력하라는 메시지가 표시됩니다.

내 2003 시스템에서 반환되는 3 가지 명령은 다음과 같습니다.

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

예, 선택 윤곽 스크린 세이버를 시작하지만 시작하기 전에 완료 될 때까지 기다리지 않습니다 Stop-Computer.

이 방법은 설치된 모듈에 따라 최신 컴퓨터에서 다시 작동 할 수 있지만 Windows 2012 및 2016에서 수행 할 수있는 최선의 작업은 14 바이트입니다 .

gcm sto*er|iex

(그리고 물론, winbatch 제출은 PowerShell에서 작동하며 짧아 지지만 재미는 없습니다.)


4
Win7 및 Win10에 대한 짧은 것 (그리고 아마도 더 많음) : gcm *p-c*|iex-결과는 하나뿐입니다!
Bob

@Bob은 여전히 ​​설치된 모듈에 크게 의존합니다. 내 Win10 컴퓨터에서 6 개의 결과를 반환하며 그중 일부는 필수 매개 변수를 갖습니다 (따라서 프롬프트가 표시되지 않으며 Stop-Computer마지막 결과입니다).
briantist

39

배치, 10 바이트

창문에서는 이것으로 충분합니다.

shutdown/s

1 분 후에 종료됩니다.

또는 @flashbang이 지적한 것처럼 :

shutdown/p

컴퓨터가 즉시 종료됩니다.


79
Press the big button on the front of your computer= 0 바이트
RaisingAgent

96
@RaisingAgent 여기서 PPCG는 코드의 문제를 해결합니다. 육체 노동은 눈살을 찌푸리게합니다.
steenbergh

12
@steenbergh 모르겠다 ... 하나의 큰 버튼과 10 개의 키를 누르는 것? 나는 버튼과 함께 갈 것이다
WorldSEnder

16
@RaisingAgent 제안에 확장 성 문제가 있습니다. 일주일에 네 번 10.000 대의 컴퓨터를 사용하십시오.
Emilio M Bumachar

10
@RaisingAgent 실제 남자는 PSU에 맞는 스위치를 사용합니다
Cruncher

35

x86 기계 코드, Lenovo Z510, DOS COM 또는 부트 로더, 7 바이트

BITS 16

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

에 조립 B8 00 3C BA 04 18 EF

" 원하는 경우 특정 환경 / OS에서만 작동하는 코드를 작성할 수 있습니다 "라는 것을 최대한 활용하고 있습니다. 이는 Lenovo Z510 1 에서만 작동합니다 .

이것은 ACPI 레지스터에 기록 SLP_TYPa << 10 | SLP_EN되며, 몇 달 전에PM1a_CNT ACPI 테이블 에서이 값을 덤프하여 종료에 대한 답변을 얻었습니다 (위의 코드에 약간의 컨텍스트를 부여합니다).

이것은 DOS에서 COM (이진 데이터를 파일에 쓰고 확장자를 "com"으로 변경) 또는 부트 로더로 실행할 수 있습니다.
후자의 경우 표준 서명을 작성하고 최신 펌웨어 문제를주의하십시오 .


1 정확히는 아니지만, 동일한 ACPI 구성을 가진 시스템도 종료됩니다.


13
제한된 플랫폼으로 인해 상향 조정되었습니다.
파이프

하아! 누군가 데니스를 이겼다!
Joshua

7 바이트 수를 사용하는 경우이를 어셈블리 솔루션이 아닌 머신 코드 제출이라고합니다. 어셈블리 제출은 63 바이트입니다.
Jakob

@ 야콥 당신이 맞아요!
마가렛 블룸

당신은이 질문에 대답을 맞은 사람처럼 : stackoverflow.com/questions/2019463/...을 (. 나는 그것을 비참하게 실패 수치에서 내 "대답"를 삭제했다)
교수 팔켄

34

GRUB 쉘 , 4 바이트

골프

halt

명령 : halt --no-apm

명령이 컴퓨터를 정지시킵니다. --no-apm 옵션을 지정하면 APM BIOS 호출이 수행되지 않습니다. 그렇지 않으면 APM을 사용하여 컴퓨터가 종료됩니다.

보너스

다음은 GRUB 쉘이 실제로 터는하다는 증거입니다 N 보내고 완성은 (주석 참조)

여기에 이미지 설명을 입력하십시오


그럽 쉘은 "프로그래밍 언어"가 아닙니다
Alnitak

9
@Alnitak, 어떻게 생각하세요? 그것은 오히려 고급 기능 built-in scripting language, which has a syntax quite similar to that of GNU Bash and other Bourne shell derivatives과 변수, 조건 구조, 기능 및 지원 는, 그래서 분명히 한다 터닝 완료 어떠한 조치가.
zeppelin

1
OK, 나는 그것을 다시 할게요 - 내가 보았을 때 나는 그 물건을 찾을 수 없습니다
알니 타크

28
이 스피너를 표시 할 수 없습니다 때 분명히 TUR되지 N 보내고 완성
J_F_B_M

1
Bash에서도 같은 명령입니다.
Paweł Tokarz

31

65C02 머신 코드, 1 바이트

STP 명령어 (0xDB) :

STP는 65C02의 클록 입력을 중지하고 하드웨어 리셋이 발생할 때까지 (즉 RES 핀이 낮아질 때까지) 65C02를 효과적으로 종료합니다. 이로 인해 65C02가 저전력 상태가됩니다. 이것은 낮은 전력 소비를 요구하는 애플리케이션 (회로)에 유용하지만 STP는 거의 볼 수 없습니다.

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

xxd 덤프 :

00000000: db                                       .

아뇨 나는 그 당시 애플 II 해커였으며이 opcode조차도 기억하지 못했다.
kindall

1
예, 더 많은 기능을 갖춘 65c816 에뮬레이터를 작성한 후이 과제를 보았습니다. \ o /
therealfarfetched

24

Matlab, 21 바이트

system('shutdown -s')

나는 이것을 시도하지 않았다 (한낮에 다시 시작하기 위해 모든 프로그램을 닫는 것은 실제로 유혹적이지 않다). 그러나 그것은 작동해야한다. . 이것은 작동합니다 ...

나중에 간단한 설명을 추가하겠습니다. 랩탑이 현재 꺼져 있습니다.


105
"나중에 간단한 설명을 추가하겠습니다. 랩탑이 현재 꺼져 있습니다." <-셧다운 챌린지의 위험
Suever

4
Axaxaxaxa, 글쎄, 가끔씩 컴퓨터를 다시 시작하는 것은 나쁘지 않다 :)
RaisingAgent

6
당신의 파멸 않습니다 uptime하지만
웨인 베르너

shutdown -s쉘로 제출하는 대신 이것을 MATLAB으로 제출해야하는 이유는 무엇 입니까?
immibis

10
나에게 쉘은 해변이나 주유소에서 찾은 것이기 때문이다.
Stewie Griffin

21

MATLAB, 11 바이트

!shutdown/p

Stewie Griffin의 접근 방식 과 다소 유사합니다 . 그러나 MATLAB은 시스템 명령을 호출하는 방법이 짧습니다. 이 경우에 !사용됩니다. Windows는 .exe명령 이름이 필요하지 않으므로 생략됩니다. 이 /옵션은 여전히 ​​지원되며 (Windows 10을 실행 중임) 공간이 필요하지 않습니다. 대안은 다음과 같습니다.

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 바이트

OPTION

3DS가 다시 시작되도록하는 충돌을 트리거합니다. 나는 이것이 중요하기를 바랍니다.

최신 버전에서 작동합니다.


패치되었다고 생각했습니다. 버전 번호를 알려주십시오.
wizzwizz4

3
일본 이외의 지역에서는 아직 출시되지 않은 버전 3.5에서 패치되었습니다.
12Me21

4
물론입니다. 환경의 좋은 선택.
P. Ktinos 2012 년

REBOOTSBv2 에서만 유효한 답변으로 계산됩니다.
snail_ 2016 년

16

배쉬, 7 6 바이트

init 0

프로그램이 루트로 실행된다고 가정합니다.


실제로 기계의 전원을 꺼야합니다. 따라서 당신은 유효한 답변으로 'halt -p'가 필요합니다
P. Ktinos

4
이 편집 대학살 :)
RaisingAgent

@ P.Ktinos : poweroff약간 더 많은 글자가 있지만 한 단어입니다.
ccpizza 2012 년

1
@ccpizza 맞습니다. 그러나 일반적인 채점 기준은 바이트 수
Suever

13

자바, 101 98 62 42 바이트

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

@ Snownow가 지적했듯이 질문은 전체 프로그램이 필요한지 여부를 지정하지 않았으므로 여전히 수용 가능해야합니다.


2
메인 에서 생략 할 수 있으므로 대체 class하는 것이 더 짧습니다 . interfacepublic
Pavel

6
질문에 제출물이 완전한 프로그램이어야 함을 명시하지 않았으므로 방법을 사용할 수 있습니다.void f()throws Exception{Runtime.getRuntime().exec("shutdown/s");}

1
하지 않을까요 리눅스 버전은 조금 짧아?
jpmc26

2
()->{Runtime.getRuntime().exec("init 0");}또는 잠정적으로 ()->Runtime.getRuntime().exec("init 0")(현재 확인할 수 없음). 사용자 정의 void, no-args-throwing 인터페이스를 구현하는 람다입니다.
Olivier Grégoire

1
Linux 관련 답변으로 표시되어야합니다 (예 : "Lonux의 Java").
Jakob

13

파이썬 2, 29 바이트

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

Linux 시스템에서 작동하며 루트 권한이 필요합니다.

Windows의 경우 33 바이트

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

이것은 내가 작성한 것 중 가장 흥미 롭거나 유용한 코드 일 수 있습니다.


2
다른 사람 이 Linux 셸 버전을 게시 했습니다.
jpmc26

1
아, 알았어 ..
FlipTack

12

코모도 64, 11 바이트

0 sys64738

이것은 기본 프롬프트에서 나온 것입니다. 또는...

Commodore 64, 6502 어셈블리, 3 바이트 (조립), 16 바이트 (소스)

*=8000
JMP $FCE2

BASIC에서 Commodore 64의 직접 입력 모드를 sys64738사용 하면 저장할 프로그램이나 다른 것이 없기 때문에 0 바이트 를 사용한다고 생각합니다 . 화면 RAM을 사용하고 있지만 해당 RAM은 이미 공백으로 채워져 있으므로 해당 공백을 텍스트로 바꿉니다.
Shaun Bebbers

2
소스 코드는 공간을 차지합니다. 그렇지 않은해서 예약 공간 대상 시스템을 이 0 바이트를 차지 의미하지 않는다. 그렇지 않으면 대답은``입니다.
wizzwizz4

3
0와 사이에 공백이 필요없고 바로 가기 양식으로 sys64738바꿀 수 있으며 프로그램 길이의 마지막 줄 바꿈은 포함하지 않습니다. 그러나 코드가 요구 사항을 충족한다고 생각하지 않습니다. 64738의 코드는 전원이 아닌 소프트 리셋을 수행합니다. syssY
Mark

2
전원을 끄지 않습니다.
TecBrat

1
한 번은 Commodore 64에 맥주를 쏟아서 영구적으로 전원을 차단했습니다. 이것이 중요합니까?
Shaun Bebbers


11

C ++, 51 40 바이트

Ingve 덕분에 -11 바이트 !

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

IncludeOS (v0.10.0-rc.1) 에서만 작동

테스트:

$ 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
지금은 IncludeOS에 대해 궁금합니다
Karl Napf

@KarlNapf Alfred는 CppCon 2016에서 IncludeOS에 대해 멋진 프레젠테이션을했습니다 : youtube.com/watch?v=t4etEwG2_LY :-)
simon

1
당신은 사용할 필요가 없습니다 void Service::start, int main IncludeOS에서 작동 뿐만 아니라.
Ingve

10

AppleScript, 30 바이트

tell app "Finder" to shut down

정확히 말한 내용 : Finder가 컴퓨터를 종료하도록 지시합니다.


9

오토 핫키, 11 10 바이트

Gurupad Mamadapur 덕분에 바이트 절약

Shutdown,9

AHK 기본적으로 종료 명령을 지원합니다. 이 9이루어진 플래그이다 Shutdown=1+ PowerDown=8.


1
AHK신비하다.
Gurupad Mamadapur

쉼표 뒤에 공백이 필요합니까?
therealfarfetch을

이후 공간 ,이 필요하지 않습니다. 다른 플래그로 테스트 해보십시오. 나는 이것이 컴퓨터를 즉시 종료하지 않고 시작시로드되는 기본 스크립트에 넣지 않을 것이라고 생각했습니다 .D 이제 안전 모드로로드하고 문제를 해결했습니다. 한숨.
Gurupad Mamadapur

9

머신 코드 (x86, 부트 로더) 18 바이트

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

분해 :

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의 디버거에서 테스트 할 수 있습니다 (시뮬레이션을 시작한 후 일부 디스크 드라이브 설정).

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

이와 동일한 머신 코드는 DOS 실행 파일 ( *.COM) 로도 작동 합니다.


7

C #, 79 54 53 바이트

이것은 Windows에서 작동합니다.

79 바이트 :

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

TheLethalCoder 덕분에 53 바이트 :

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

2
도전 과제는 전체 프로그램이 필요하지 않으며 입력 (물론 사용되지 않음)을 허용하지 않으므로 컴파일하여 54 바이트를 Action<int>수행 할 수 _=>System.Diagnostics.Process.Start("shutdown", "/s");있습니다.
TheLethalCoder

@ TheLethalCoder, 감사합니다!
Dariusz Woźniak

불필요한 공간을 제거 할 수도 있습니다.
nothrow

물론 예! 감사합니다, @nothrow :)
Dariusz Woźniak

6

AutoIt, 11 바이트

Shutdown(1)

종료 기능은 다음 코드의 조합을 얻습니다

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

예를 들어 종료 및 전원을 끄려면 코드는 9 (종료 + 전원 차단 = 1 + 8 = 9)입니다.


1
0(로그 오프)는 특별한 경우입니다. 대기 또는 최대 절전 모드와 암시 적으로 결합되지 않습니다.
wizzwizz4

OK0 + 32 = 32
rahnema1 2012 년

흠, 그래서 대기 / 최대 절전 모드로 가기 전에 항상 로그 오프합니까?
Ruslan

@Ruslan 정확히 어떻게 작동하는지 모르겠습니다. 더 많은 피드백을 받기 위해 AutoIt 사용자 포럼 을 참조 할 수 있습니다 :-)
rahnema1

6

Windows-NativeAPI, 212 바이트

좋습니다. 이것은 실제로 가장 짧은 버전이 아닙니다. 그러나 아마도 일부에게는 흥미로울 것입니다. 이 것 없는 Win32 하위 시스템에서 실행합니다. 그러나 autochk.exe처럼 네이티브 API의 컨텍스트 내에서 실행될 때 실행됩니다.

암호

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

짓다

이 구축 중 하나 WinDDK의 사용 build.exe(적절한과 도구를 source위한 파일 NMAKE)

또는 다음 명령을 사용하여 컴파일하고 링크하십시오.

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 

참고 : x86 기본 실행 파일이 빌드됩니다. 다른 아키텍처에 맞게 빌드하려면 적절한 비트를 변경하십시오.

테스트

원시 실행 파일을 테스트하려면 win32 서브 시스템이로드 되기 전에 실행 해야 합니다. 가장 일반적인 방법은 다음 레지스트리 키에 실행 파일을 추가하는 것입니다.

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

경고

그러나이 작업을 수행하는 경우 다른 OS에서 대상 OS의 레지스트리 하이브를 편집 할 수있는 옵션이 필요합니다. 이후에게 당신은 더 이상 대상 OS를 부팅 할 수 없습니다!

이전 스냅 샷으로 쉽게 되돌릴 수있는 VM에서 수행했습니다!



5

대부분의 Linux 쉘, 15 바이트

# echo o>/p*/*ger

/proc디렉토리 에 있으면 11 바이트 길이로 만들 수 있습니다 .

# echo o>*ger

이것은 매우 간단하며 (파일 시스템 마운트 해제 또는 프로세스 종료와 같은 부작용이 없음) 다소 잔인합니다.


1
마지막으로 리디렉션에서 와일드 카드 확장을 시도했을 때 일치하는 파일이 존재하더라도 와일드 카드가 포함 된 파일을 생성했습니다.
Joshua

5
바이트 수에 "/ proc /"를 추가해야한다고 생각합니다
zeppelin

@Joshua 쉘에 따라 다를 수 있습니다. 나는 실제로 그것을 (테스트 bash내 컴퓨터 :-)에)
라도 반 Garabík

1
@ Radovan Garabík-나는 그것이 실제로 유효하다고 생각하지 않습니다. 이것은 기본적으로 "p = poweroff"라는 별칭 ( "불가능"하지 않음)이 있고 "p"가 유효한 1 바이트 솔루션 이라고 주장하는 것과 같습니다 .
zeppelin

1
그러나 당신은 아마 이것처럼 단지 3 바이트의 비용으로 유효하게 만들 수 있습니다echo o>/p*/*ger
zeppelin


5

AppleScript, 44 바이트

tell application "Finder"
shut down
end tell

AppleScript 구문의 작동 방식 또는 기타 사항을 모르므로이를 단축하는 방법을 아는 사람이 있으면 알려주십시오.

또한 학교에서 휴대 전화에서이 작업을 수행하고 있으므로 ( "해킹") 테스트 할 수 없습니다.

14 바이트를 줄이면 (너무 감사합니다)

tell app "Finder" to shut down

누군가가 몇 시간 후 (같은 프로그램) 짧은 솔루션을 함께했다 (대신 여기 주석의 그것을 게시) codegolf.stackexchange.com/a/107958/62824
devRicher

들여 쓰기를 제거 할 수 있습니다
Cyoce

4
tell app "Finder" to shut down작동한다고 생각합니다 (컴파일이 'app'를 'application'으로 대체 할 수는 있지만).
kindall

4

J, 14 바이트

2!:0'poweroff'

Linux 시스템에서 작동합니다. 2!:0에서 문자열을 실행합니다 /bin/sh.


4

클로저, 40 39 바이트

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

에서 플래그 변경하여 -1 바이트 -s/s저 공간을 없애 허용.

기본적으로 Java 답변.

이것을 테스트하는 것은 재미 있었다. Windows는 종료 된 순간 내 Surface에서 펌웨어 업데이트를 수행하기로 결정했습니다. 물론이야.

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



2

C ++, 48 47 (Windows) 46 45 (Linux) 바이트

눈사람 덕분에 1 바이트 제거

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

이것은 Windows 용 시스템을 종료해야합니다

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

Linux 용 시스템을 종료해야합니다


당신은 필요 ;합니까?
RaisingAgent

1
@LliwTelracs "-p"가 아니라 "shutdown / p"이며 공간이 필요하지 않다는 것을 확신하십시오.
P. Ktinos

세미콜론은 올바른 C ++ 구문에 필요하며 슬래시를 사용하면 창에 대한 짧은 대답을 허용하지만 더 이상 Linux에서는 작동하지 않습니다. Windows와 Linux간에 공유되는 종료에 대해 잘못된 문자를 추가했지만
fəˈnɛtɪk

@LliwTelracs 원하는 것은 무엇이든 할 수 있지만, 두 번째 규칙을 남용하고 리눅스 기능에 신경 쓰지 않는 것이 좋습니다. 이것은 코드 골프이고 적은 양의 바이트가 더 좋기 때문입니다.
P. Ktinos

1
#include<cstdlib>바이트를 면도합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.