Tôi không thể bật chế độ ngủ đông trong Windows 7 vì không có đủ chỗ trên ổ C: của tôi để tạo tệp ngủ đông. Làm cách nào để Windows có thể đặt tệp ở nơi khác?
powercfg.exe -h off
) và sau đó xóa tệp.
Tôi không thể bật chế độ ngủ đông trong Windows 7 vì không có đủ chỗ trên ổ C: của tôi để tạo tệp ngủ đông. Làm cách nào để Windows có thể đặt tệp ở nơi khác?
powercfg.exe -h off
) và sau đó xóa tệp.
Câu trả lời:
Bạn không thể, nó phải nằm trong thư mục gốc của ổ đĩa khởi động (ổ C: trong trường hợp của bạn).
Raymond Chen đã giải thích lý do tại sao trong bài viết Bảo mật Windows này: Nghịch lý hệ thống tệp .
Ngủ đông theo một mô hình tương tự. Ngủ đông hệ điều hành có nghĩa là bỏ toàn bộ nội dung của bộ nhớ vào tệp ngủ đông; Khôi phục từ chế độ ngủ đông đòi hỏi phải hút tập tin đó trở lại bộ nhớ và giả vờ không có gì xảy ra. Một lần nữa, đó là một vấn đề trứng gà khác: để tải tệp ngủ đông, bạn cần trình điều khiển hệ thống tệp, nhưng trình điều khiển hệ thống tệp nằm trong tệp ngủ đông. Nếu bạn giữ tệp ngủ đông trong thư mục gốc của ổ đĩa khởi động, trình điều khiển hệ thống tệp thu nhỏ có thể được sử dụng thay thế.
Được rồi, có 2 điều cần giải quyết để di chuyển hiberfil.sys
Nói với 'ntoskrnl.exe' chạy dưới dạng Quá trình 'Hệ thống' để mở / lưu dữ liệu ngủ đông vào D: \ hiberfil.sys thay vì C: \ -> chưa được giải quyết!
Để áp dụng cơ hội này cho tệp Dữ liệu cấu hình khởi động (c: \ BOOT \ BCD) -> Điều này tương đối dễ dàng với các Công cụ như VisualBCD https://www.boyans.net/DoadVisualBCD.html -> Hoặc thậm chí chỉ sử dụng regedit chỉnh sửa HKLM \ BCD00000000 \ Đối tượng {71575733-c376-11e4-80ea-806e6f6e6963} \ Elements \ 21000001 đó là HiberFileDrive của ResumeLoader Hoặc \ 22000002 HiberFilePath. Có thể bạn cần sử dụng 'File / Load hive' c: \ BOOT \ BCD để gắn nhánh 'BCD00000000' (Con trỏ cần phải có trên HKLM, khác với mục menu bị mờ đi) -> vì có vẻ như điều này đã được thực hiện bởi ntosknl.exe vì vậy không cần sử dụng thay đổi điều này vì các thay đổi của bạn sẽ bị ghi đè.
Tuy nhiên số 1. là điều tồi tệ hơn và khó thay đổi hơn. Hmm, hãy tải ntoskrnl.exe vào IDA và định vị hàm liên quan đến /hiberfil.sys và dịch ngược nó để xem chính xác những gì đang diễn ra ở đó ...
__int64 __fastcall PopCreateHiberFile(LARGE_INTEGER *a1)
{
...
RtlInitUnicodeString(&Source, L"\\hiberfil.sys");
...
RtlAppendUnicodeStringToString(&Destination, &IoArcBootDeviceName);
RtlAppendUnicodeStringToString(&Destination, &Source);
...
ObjectAttributes.RootDirectory = 0i64;
ObjectAttributes.Attributes = 576;
ObjectAttributes.ObjectName = &Destination;
ObjectAttributes.SecurityDescriptor = v5;
ObjectAttributes.SecurityQualityOfService = 0i64;
ret_2 = IoCreateFile(
&FileHandle,
0x100003u,
&ObjectAttributes,
...
Được rồi, nói ngắn gọn là đường dẫn được mã hóa cứng như thế này: IoArcBootDeviceName + "\ hiberfil.sys" mà không có một số bản vá nhị phân khó chịu, không có cách nào để thay đổi điều đó. Ngoài việc chạm vào miếng dán cửa sổ thần thánh, "ntoskernel" có thể dẫn đến các vấn đề như cập nhật cho bản vá hoặc các chương trình Antivirus có thể trở nên điên rồ ... Tuy nhiên, hãy xem các tài liệu tham khảo nào về IoArcBootDeviceName:
IopLoadCrashdumpDriver PopDeleteHiberFile PopCeleeEiberFile
Wow thay đổi có vẻ vẫn ổn (điều duy nhất xảy ra một chút là IopLoadCrashdumpDriver System32 \ Driver \ crashdmp.sys tuy nhiên ai cần crashdump - không thành vấn đề nếu chúng ta phá vỡ thứ gì đó ở đó)
Vì vậy, việc vá IopCreateArcNames tạo ArcBootDeviceName sẽ ổn:
NTSTATUS INIT_FUNCTION NTAPI IopCreateArcNames ( IN PLOADER_PARAMETER_BLOCK LoaderBlock )
...
/* Create the global system partition name */
63 sprintf(Buffer, "\\ArcName\\%s", LoaderBlock->ArcBootDeviceName);
64 RtlInitAnsiString(&ArcString, Buffer);
65 RtlAnsiStringToUnicodeString(&IoArcBootDeviceName, &ArcString, TRUE);
66
67 /* Allocate memory for the string */
68 Length = strlen(LoaderBlock->ArcBootDeviceName) + sizeof(ANSI_NULL);
69 IoLoaderArcBootDeviceName = ExAllocatePoolWithTag(PagedPool,
70 Length,
71 TAG_IO);
72 if (IoLoaderArcBootDeviceName)
73 {
74 /* Copy the name */
75 RtlCopyMemory(IoLoaderArcBootDeviceName,
76 LoaderBlock->ArcBootDeviceName,
77 Length);
78 }
...
https://doxygen.reactos.org/d3/d82/ntoskrnl_2io_2iomgr_2arcname_8c.html btw Tôi đang sử dụng ntkrnlmp.exe 6.1.7601.19045 từ Win7 64 bit và kiểm tra mã này với ReactOS. (Tuy nhiên, phần ngủ đông chưa được triển khai trong các nguồn Reactos) Lưu ý rằng ArcBootDeviceName sẽ giống như: \ Device \ Harddisk1 \ Partition0
Hmm hãy vá ArcBootDeviceName (LoaderBlock + 0x78) thành ArcHalDeviceName (LoaderBlock + 0x80)
Vì vậy, trong trường hợp trình tải bootmgr nằm trên một phân vùng khác với các cửa sổ, hy vọng hibernate.sys được tạo là bootmgr.
1405A9C15 4C 8B 4B 78 mov r9, [rbx+78h]
Patch #1 80
1405A9C19 4C 8D 05 30 06+ lea r8, aArcnameS ; "\\ArcName\\%s"
1405A9C20 48 8D 4C 24 40 lea rcx, [rsp+0D8h+pszDest] ; pszDest
1405A9C25 48 8B D7 mov rdx, rdi ; cchDest
1405A9C28 E8 E3 AE B6 FF call RtlStringCchPrintfA
...
1405A9C41 48 8D 0D C0 E7+ lea rcx, IoArcBootDeviceName ; DestinationString
1405A9C48 41 B0 01 mov r8b, 1 ; AllocateDestinationString
1405A9C4B E8 60 13 DB FF call RtlAnsiStringToUnicodeString
1405A9C50 48 8B 7B 78 mov rdi, [rbx+78h]
Patch #2 80
Vì vậy, trong ntoskrnl.exe, thay thế 4C8B4B78 bằng 4C8B4B80 tại hai địa điểm. Đừng quên sửa PE-Checksum sau đó.