Как изменить местоположение файла спящего режима в Windows 7?

Я не могу включить спящий режим в Windows 7, потому что на моем диске C: недостаточно места для создания файла гибернации. Как заставить Windows поместить файл в другое место?

Вы не можете, он должен быть в корне диска загрузки (диск C: в вашем случае).

Раймонд Чен объяснил причины, почему в этой статье Windows Confidential: The File System Paradox .

Гибернация следует аналогичной схеме. Спящий режим операционной системы означает сброс всего содержимого памяти в файл гибернации; Восстановление из спящего режима влечет засасывание этого файла в память и притворство, что ничего не произошло. Опять же, это еще одна проблема с курицей и яйцом: для загрузки файла спящего режима вам нужен драйвер файловой системы, но драйвер файловой системы находится в файле гибернации. Если вы сохраните файл гибернации в корневом каталоге загрузочного диска, вместо него можно использовать миниатюрный драйвер файловой системы.

Хорошо, есть две вещи, которые нужно решить, чтобы переместить hiberfil.sys

  1. Скажите 'ntoskrnl.exe', который запускается как Process 'System', чтобы открыть / сохранить данные гибернации в D: \ hiberfil.sys, а не C: \ -> еще не все!

  2. Чтобы применить этот шанс также к файлу данных конфигурации загрузки (c: \ BOOT \ BCD) -> Это относительно легко с такими инструментами, как VisualBCD https://www.boyans.net/DownloadVisualBCD.html -> Или даже просто с помощью regedit Редактирование HKLM \ BCD00000000 \ Objects {71575733-c376-11e4-80ea-806e6f6e6963} \ Elements \ 21000001, который является HiberFileDrive оператора ResumeLoader или \ 22000002 HiberFilePath. Возможно, вам нужно использовать «File / Load hive» c: \ BOOT \ BCD для монтирования ветки «BCD00000000». (Курсор должен быть включен в HKLM, иначе пункт меню выделен серым цветом) ->, как кажется, это уже сделано От ntosknl.exe, поэтому нет необходимости использовать это при изменении, так как изменения будут перезаписаны.

Однако число 1. хуже и труднее изменить. Хм, давайте загрузим ntoskrnl.exe в IDA и разместим функцию, которая имеет дело с /hiberfil.sys, и декомпилируем ее, чтобы увидеть, что именно происходит там …

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

Короче говоря, путь жестко запрограммирован следующим образом: IoArcBootDeviceName + "\ hiberfil.sys" без какого-либо неприятного двоичного исправления не может изменить это. Ну а прикосновение к святым окнах grail patching «ntoskernel» может привести к проблемам, таким как обновления, отменить патч или программы Antivirus, которые могут сходить с ума … Однако давайте посмотрим, какие ссылки относятся к IoArcBootDeviceName:

IopLoadCrashdumpDriver PopDeleteHiberFile PopCreateHiberFile PopBcdSetupResumeObject PopBcdSetDefaultResumeObjectElements PopBcdSetPendingResume PopBcdRegenerateResumeObject PopBcdEstablishResumeObject PopAllocateHiberContext IopCreateArcNames PopBcdSetupResumeObject

Ничего себе меняя это, кажется, что все в порядке (только немного, но это немного зависит от IopLoadCrashdumpDriver System32 \ Drivers \ crashdmp.sys, но кому нужен crashdump – неважно, сломаем ли мы что-то там)

Поэтому исправление IopCreateArcNames, которое создает ArcBootDeviceName, будет прекрасным:

 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 Я использую ntkrnlmp.exe 6.1.7601.19045 из Win7 64 бит и проверял этот код на ReactOS. (Однако спящий элемент еще не реализован в источниках Reactos). Обратите внимание, что ArcBootDeviceName будет выглядеть примерно так: \ Device \ Harddisk1 \ Partition0

Хмм, давайте исправим ArcBootDeviceName (LoaderBlock + 0x78) в ArcHalDeviceName (LoaderBlock + 0x80)

Таким образом, если загрузчик bootmgr находится на другом разделе, чем окна, мы надеемся, что hibernate.sys создает 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 

Поэтому в ntoskrnl.exe замените 4C8B4B78 на 4C8B4B80 в двух местах. Не забудьте впоследствии исправить PE-Checksum.

  • Почему Hibernate больше не работает (Windows 7)?
  • Windows 10 ПК начинаются посреди ночи
  • Win 8.1 не собирается спать
  • Windows 7 выходит из сна, когда я открываю удаленный рабочий стол
  • Можно ли установить hiberfil.sys на другой диск?
  • Безопасно ли удалять USB-носители при приостановке работы компьютера?
  • Как подключить VPN автоматически после спящего режима / спящего режима в Vista / 7?
  • Как определить причину возобновления спящего режима в Windows 7?
  • Давайте будем гением компьютера.