Làm cách nào để thay đổi vị trí của tệp ngủ đông trong Windows 7?


45

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?



Bạn không thể. Nhưng bạn có thể tắt chế độ ngủ đông ( powercfg.exe -h off) và sau đó xóa tệp.
Ian Boyd

Câu trả lời:


42

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


14
Để các cửa sổ xấu không thể xử lý việc này, tôi thực sự cần nó cho ổ SSD của mình. Tôi hy vọng rằng họ sẽ sửa nó trong tương lai để bạn có thể chọn nơi đặt nó như trong Mac OS X.
Hultner

5
Yah, theo tôi đó là một chút sai sót trong thiết kế. Ngay cả khi hệ thống cần khởi động từ ổ đĩa chính, không có lý do gì để lưu trữ tất cả hàng gigabyte thông tin trên cùng một ổ đĩa - tệp ngủ đông có thể tải những điều cơ bản (ví dụ như truy cập ổ đĩa) và sau đó tìm đến ổ đĩa khác để có thêm dữ liệu. Thật không may, họ đã không thiết kế nó để xử lý trường hợp đó - điều đó có nghĩa là họ sẽ không cho đến khi có một HĐH mới ... nếu có.
Namey

1
@Namey: Nếu tệp ngủ đông có thể tải những điều cơ bản, thì nó cũng có thể được ghi thẳng vào bộ tải khởi động ở vị trí đầu tiên. Sau đó, bạn mở ra một lon giun. Mặt khác, tôi cũng không coi đó là một lỗi thiết kế. Nó được viết lại từ thời Windows NT I, trong đó tốc độ, giới hạn bộ nhớ và sức mạnh CPU thấp là những yếu tố lớn, không phải là ổ SSD nhỏ. Heck, ai sẽ dự đoán SSD sẽ rất phổ biến ở nơi đầu tiên ??
Surfasb

1
Đó chỉ là những từ khá hay về "gà và trứng" không thành vấn đề: nếu trình tải khởi động biết cách tải tệp ngủ đông từ đĩa vào bộ nhớ, không có lý do gì để không có trình điều khiển hệ thống tệp trong trình tải khởi động.
Denis Barmenkov

3
Đó là một cái cớ ngu ngốc của microsoft. Điều gì xảy ra nếu cả hai đĩa trên cùng một bộ điều khiển - cùng một trình điều khiển được sử dụng? Điều gì nếu một đĩa là ssd và bạn không muốn mặc nó nhanh?
NickSoft

6

Được rồi, có 2 điều cần giải quyết để di chuyển hiberfil.sys

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

  2. Để á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 đó.


Nói về một câu trả lời khó hiểu không nhiều người có thể hiểu!
killjoy

Có ai đã thử vá ntoskrnl.exe theo cách này chưa? Nó có hoạt động sau đó không?
PF4Public
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.