วิธีที่จะทำให้ BSOD บน Windows XP และรุ่นที่ใหม่กว่า?


14

มีวิธีทำให้โปรแกรม BSOD บน Windows XP และรุ่นที่ใหม่กว่าโดยทางโปรแกรมหรือไม่ อย่างไร?

BTW เพียงเพื่อชี้แจงนี่ไม่ใช่เพื่อวัตถุประสงค์ที่เป็นอันตราย ลูกค้าขอให้สามารถปิด / รีบูตเครื่องใน LAN ด้วยวิธีนี้ เมื่อฉันถามว่าทำไมพวกเขาพูดเพราะเร็วกว่าการรีบูตปกติ ... :)

(ฉันอยากรู้ว่าส่วนไหนของ "ทางการเขียนโปรแกรม" คนเหล่านั้นไม่เข้าใจว่าใครเป็นผู้ย้ายข้อมูลนี้ไปยังผู้ใช้ระดับสูง Duh.)


18
หากคุณพบที่ไม่เกี่ยวข้องกับการเขียนโปรแกรมควบคุมให้แจ้ง Microsoft เพื่อให้สามารถแก้ไขได้
Erik

13
หนอ มันเร็วกว่าการรีบูตปกติด้วยเหตุผล - ไม่จำเป็นต้องปิดตัวลงอย่างสวยงาม หากคุณมีโปรแกรมที่ปิดตัวลงอย่างช้า ๆ จริงๆมันอาจจะไม่เป็นปัญหาที่จะขัดขวาง หากคุณบังคับให้ปิดหรือทิ้งอะไรก็ตามที่อยู่ใกล้กับฮาร์ดแวร์ I / O มากเกินไปคุณอาจจะจบลงด้วยระบบไฟล์ที่เสียหายเป็นต้นพิจารณาว่าเทียบเท่ากับวิธีการควบคุมเครือข่ายของการใช้พลังงาน (ซึ่งฉันเชื่อว่ามีขาย ปัญหาของคุณเกี่ยวกับเช่นกัน ... )

12
ลูกค้าของคุณจะต้องเป็นสถาบันและสภาพจิตใจของเขาตามมาด้วยทีมแพทย์อย่างใกล้ชิด
ดารินทร์ดิมิทรอฟ

9
โดยทั่วไปรถพยาบาลจะเร็วกว่าการขับรถของคุณเองไปที่โรงพยาบาล นั่นไม่ได้ทำให้เป็นโหมดการเดินทางที่ต้องการ
FreeAsInBeer

8
บอกให้ลูกค้าของคุณกดปุ่มเปิด / ปิดค้างไว้ 6 วินาที หรือแค่เหวี่ยงสายไฟเร็วกว่า
Hans Passant

คำตอบ:


15

ไดรเวอร์แป้นพิมพ์สามารถบอกได้ว่าเป็นสาเหตุ BSOD:

HKLM\SYSTEM\CurrentControlSet\Services\kbdhid\Parameters

หรือ (สำหรับแป้นพิมพ์ PS / 2 รุ่นเก่า)

HKLM\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters

และตั้งREG_DWORDชื่อCrashOnCtrlScrollให้1เป็น

หลังจากรีบูตถัดไปที่คุณสามารถบังคับหน้าจอสีฟ้าโดยCtrl+ +ScrollLk ScrollLkรหัสตรวจสอบข้อผิดพลาดในกรณีนี้จะเป็น 0xE2 (MANUALLY_INITIATED_CRASH)

หากคุณจริงๆต้องการวิธีการเขียนโปรแกรมที่คุณต้องพบหลุมในโปรแกรมควบคุมบางอย่างในเครื่องหรือเขียนนั้นและติดตั้งโปรแกรมควบคุมง่ายที่โทรอย่างใดอย่างหนึ่งหรือKeBugCheckKeBugCheckEx

มีความสุข ;)

หมายเหตุด้านข้าง:มันมีประโยชน์มากในการทำให้เกิดความผิดพลาดเช่นนี้สำหรับผู้เขียนไดรเวอร์หรือแม้กระทั่งเมื่อจัดการกับมัลแวร์ หากคุณกำหนดค่าระบบของคุณเพื่อสร้างการถ่ายโอนข้อมูลหน่วยความจำแบบเต็มคุณจะมีภาพของระบบที่กำลังทำงานซึ่งสามารถวิเคราะห์เพิ่มเติมได้ พิจารณากรณีเช่นการหยุดชะงักโดยที่ตัวดีบักไม่จำเป็นต้องช่วยในทุกกรณี


4
มันเป็นเรื่องจริงเหรอ? มันเยี่ยมมากถ้าเป็น! (ไม่ฉันไม่ได้ทดสอบการใช้คอมพิวเตอร์ของฉัน)
Andreas Rejbrand

3
ใช่มันไม่ได้เป็นเรื่องตลก นี่คือสิ่งที่ผู้เขียนโปรแกรมควบคุมใช้มาระยะหนึ่งแล้วแม้ว่าฉันจะจำไม่ได้ว่าจากตำแหน่งบนสุดของที่ตั้งของรีจิสทรี ต้องดูมันในบันทึกของฉัน
0xC0000022L

ฉันพบ bsod ด้วยการพิมพ์หน้าจอหรือหน่วยความจำมากเกินไปในการใช้ Ram หรือ Hardisk ภายใน อาจใช้ประโยชน์จากระบบด้วย
Tech-IO


1

ไม่แน่ใจว่าจะทำอย่างไร แต่ฉันเชื่อใน Vista และ 7 เป็นค่าเริ่มต้นที่จะปิดระบบล้มเหลวและไม่แสดง BSOD


ไม่เป็นไรฉันต้องการพฤติกรรมนั้น
Tamás Szelei

1
@FreeAsInBeer: อันที่จริงนั่นเป็นเพราะการตั้งค่าระบบของคุณบอกให้รีบูตหลังจากเกิดความผิดพลาด สิ่งนี้สามารถเปลี่ยนแปลงได้ในแท็บขั้นสูงของคุณสมบัติคอมพิวเตอร์ของคุณ นอกจากนี้การทิ้งความผิดพลาดที่สร้างขึ้นในปัจจุบันมักเป็นขนาดเล็กโดยค่าเริ่มต้นซึ่งเป็นสาเหตุที่การรีบูตเกิดขึ้นอย่างรวดเร็วจนคุณไม่เห็นหน้าจอสีน้ำเงิน (ตามตัวอักษร) แต่อยู่ที่นั่นเชื่อฉัน;)
0xC0000022L

1
@STATUS_ACCESS_DENIED: ฉันรู้ว่าฉันแค่บอกให้เขารู้ว่าค่าเริ่มต้นสำหรับตัวแปรนี้ถูกตั้งค่าให้ไม่แสดง BSOD ดังนั้นเขาจึงรู้ว่าจะตรวจสอบคุณสมบัตินั้นถ้าเขาไม่ได้รับอย่างที่คาดไว้
FreeAsInBeer

@FreeAsInBeer: ยุติธรรมพอ :)
0xC0000022L

1

โดยทั่วไปแล้ว BSOD จะเกิดขึ้นเมื่อมีสิ่งผิดปกติเกิดขึ้นภายในระบบปฏิบัติการหรือฮาร์ดแวร์ การรับสิ่งผิดพลาดภายในอย่างใดอย่างหนึ่งจากภายนอกนั้นค่อนข้างยากเนื่องจากผู้เขียนระบบปฏิบัติการและผู้จำหน่ายฮาร์ดแวร์ไม่ชอบวิศวกรซอฟต์แวร์ที่ไม่ดีทำให้ผลิตภัณฑ์ของพวกเขาดูแย่และทำลายประสบการณ์ของผู้ใช้

การเขียนไดรเวอร์เป็นวิธีหนึ่งในไม่กี่วิธีในการเข้าใกล้ระบบปฏิบัติการและฮาร์ดแวร์มากพอและทำให้เกิดข้อผิดพลาดดังกล่าว แน่นอนว่าการติดตั้งไดรเวอร์ดังกล่าวไม่ใช่สิ่งที่คุณมักจะทำโดยไม่มีความรู้และสิทธิพิเศษในการดูแลดังนั้นการใช้สิ่งนี้เพื่อจุดประสงค์ที่เป็นอันตรายค่อนข้างยาก ด้วยการเข้าถึงแบบนั้นคุณสามารถทำอันตรายได้มากกว่าโดยไม่ต้อง BSOD หรือรอบ ๆ เช่นนั้น


1

BSOD เป็นความตื่นตระหนกของเคอร์เนล มันหมายถึงส่วนหนึ่งของเคอร์เนลซึ่งเป็นแกนหลักของระบบปฏิบัติการที่ทำสิ่งที่ไม่ดีจริง ๆ มันอาจจะเขียนหน่วยความจำมันอาจจะรันรหัสที่มันไม่ควรมี โดยทางโปรแกรมคุณจะต้องรับโค้ดในพื้นที่เคอร์เนลจากนั้นเรียกใช้งานตามความต้องการ มีความเสี่ยงเล็กน้อยสำหรับเซิร์ฟเวอร์แยง

เครื่อง Windows ปกติมีสถานะเป็นจำนวนมากในกระบวนการและในเคอร์เนล การล้างข้อมูลใด ๆ ที่คุณต้องการเพื่อให้สถานะสอดคล้องกันคุณก็แค่ลัดวงจร

โดยเฉพาะอย่างยิ่ง BSOD คือ (โดยปกติ) ข้อผิดพลาดของเคอร์เนล (หรือไดรเวอร์) เคอร์เนลอยู่ในสถานะไม่ดีดังนั้นจึงรู้สึกว่ามันไม่สามารถล้างข้อมูลได้และจะรีบูตค่อนข้างสูญเสียสถานะที่ดีเนื่องจากมีเพียง รู้ว่าอะไรดีและอะไรไม่ดี บัฟเฟอร์ใด ๆ ไม่สามารถถูกฟลัชไปยังดิสก์ จากนั้นจะพยายามล้างข้อมูลในการรีบูต แต่มันสูญเสียบริบทจำนวนมากในการปิดระบบ / การตื่นตระหนกดังนั้นจึงเป็นการล้างข้อมูลแบบอนุรักษ์นิยมโดยต้องเลือกทั้งของที่เหลือทั้งดีและไม่ดีจากความตื่นตระหนก

ดังนั้นความได้เปรียบของคุณในการปิดระบบจึงเริ่มต้นขึ้นเนื่องจากตอนนี้มันจำเป็นต้องรู้ว่ามันได้รับมาจากที่ใด จำเป็นต้องเรียกใช้ chkdsk และล้างข้อมูลบล็อกดิสก์ใด ๆ ที่อยู่ในสถานะการเขียนบางส่วน ดิสก์ USB มีแคชจำนวนมาก คุณสามารถปิดการแคชซึ่งจะทำให้มีโอกาสน้อยที่จะสูญเสียข้อมูลจากความผิดพลาด แต่การไม่แคชจะทำให้ความเร็วลดลง ไฟล์ใดที่คุณยินดีเสีย?

ในระยะสั้นนี่เป็นความคิดที่ไม่ดี เครื่องผลิตใด ๆ ที่มีสิ่งนี้เกิดขึ้นอาจอยู่ในสภาพไม่เสถียรแม้หลังจากการล้างข้อมูลแล้ว นี้ไม่ดี.

ฉันจะบอกว่าจะตีการปิดและรีสตาร์ท คุณจะสูญเสียเวลาใดก็ตามที่คุณคิดว่าประหยัดได้ในครั้งแรกที่คุณต้องสร้างเซิร์ฟเวอร์ขึ้นใหม่เพราะจะไม่สามารถบู๊ตได้หรือโปรแกรมของคุณไม่สามารถเริ่มต้นได้


คุณพลาดจุด มีเหตุผลที่ดีที่จะทำให้ BSOD ตามต้องการเมื่อทำการดีบั๊กปัญหากับไดรเวอร์ที่คุณเขียน อย่างไรก็ตามฉันคิดว่าคำถามนี้ไม่ควรถูกย้ายจาก SO ไปที่นี่เนื่องจากลักษณะของมัน
0xC0000022L

@STATUS_ACCESS_DENIED ฉันเห็นด้วยกับคำสั่งของคุณ แต่ถ้าคุณจำคำถามเดิมได้มันไม่เกี่ยวกับการดีบัก แต่เป็นทางลัดในการปิดระบบ ไม่ใช่เหตุผลที่ดีในความคิดของฉัน
Rich Homolka

0

ต้องพูดถึงว่ากระบวนการฆ่า csrss.exe จะทำให้ BSOD แต่ไม่ใช่สำหรับ Windows รุ่นใหม่ล่าสุด (8, 8.1)


แอปนี้สามารถทำได้ ทุกคนสามารถสร้างแอปดังกล่าวได้ใน Visual Studio Express (ฟรี)
pbies

นี่คือรหัส 0xC000021A ( STATUS_SYSTEM_PROCESS_TERMINATED), btw
0xC0000022L

0

ตัวอย่างโค้ดจากhttps://www.mpgh.net/forum/showthread.php?t=1100477 ทำงานบน Windows 10.17134

#include <windows.h>
#pragma comment(lib, "ntdll.lib")

extern "C" NTSTATUS NTAPI RtlAdjustPrivilege(ULONG Privilege, BOOLEAN Enable, BOOLEAN CurrentThread, PBOOLEAN OldValue);
extern "C" NTSTATUS NTAPI NtRaiseHardError(LONG ErrorStatus, ULONG NumberOfParameters, ULONG UnicodeStringParameterMask,
PULONG_PTR Parameters, ULONG ValidResponseOptions, PULONG Response);

void BlueScreen()
{
    BOOLEAN bl;
    ULONG Response;
    RtlAdjustPrivilege(19, TRUE, FALSE, &bl); // Enable SeShutdownPrivilege
    NtRaiseHardError(STATUS_ASSERTION_FAILURE, 0, 0, NULL, 6, &Response); // Shutdown
}

ดูเหมือนจะไม่มีร่องรอยในบันทึกเหตุการณ์ แน่นอนว่าจะมีร่องรอยใน minidump แน่นอน?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.