Как изменить местоположение файла гибернации в Windows 7?
45
Я не могу включить спящий режим в Windows 7, потому что на диске C: недостаточно места для создания файла спящего режима. Как я могу заставить Windows поместить файл куда-нибудь еще?
Спячка идет по аналогичной схеме. Спящий режим операционной системы означает сброс всего содержимого памяти в файл гибернации; восстановление из спящего режима влечет за собой высвобождение этого файла обратно в память и притворяется, что ничего не произошло. Опять-таки, это еще одна проблема: для загрузки файла гибернации необходим драйвер файловой системы, но драйвер файловой системы находится в файле гибернации. Если вы сохраняете файл гибернации в корневом каталоге загрузочного диска, вместо него можно использовать драйвер миниатюрной файловой системы.
Чтобы плохие окна не могли справиться с этим, мне действительно нужно это для моего SSD. Я надеюсь, что они исправят это в будущем, так что вы можете выбрать, куда поместить это, как в Mac OS X.
Хультнер,
5
Да, на мой взгляд, это немного недостаток дизайна. Даже если система должна загружаться с основного диска, просто нет необходимости хранить все гигабайты информации на одном диске - файл гибернации может загрузить основы (например, доступ к диску), а затем искать другой диск для получения дополнительной информации. данные. К сожалению, они не разработали его для этого случая - а это значит, что они не будут до новой ОС ... если вообще когда-либо.
Ноябрь
1
@Namey: Если файл гибернации может загружать основы, он может быть записан прямо в загрузчик. Тогда вы открываете еще одну банку с червями. С другой стороны, я бы не стал считать это недостатком дизайна. Он был написан еще во времена Windows NT, я полагаю, что важными факторами были скорость, ограничения памяти и низкая мощность процессора, а не небольшие SSD-накопители. Черт, кто бы из предсказанных SSD был таким распространенным во-первых ??
Surfasb
1
Это просто красивые слова о «курице и яйцах», которые не имеют значения: если загрузчик знает, как загружать файл гибернации с диска в память, нет никаких причин не иметь драйвер файловой системы внутри загрузчика.
Денис Барменков
3
Это глупое оправдание Microsoft. Что если оба диска находятся на одном контроллере - используется один и тот же драйвер? Что делать, если один диск является SSD, и вы не хотите носить его быстро?
NickSoft
6
Хорошо, есть 2 вещи, которые нужно решить, чтобы переместить hiberfil.sys
Скажите 'ntoskrnl.exe', который запускается как Процесс 'Система', чтобы открыть / сохранить данные гибернации в D: \ hiberfil.sys вместо C: \ -> еще не решено!
Чтобы применить этот шанс также к файлу данных конфигурации загрузки (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, и декомпилируем ее, чтобы увидеть, что именно там происходит ...
Короче говоря, путь жестко запрограммирован так:
IoArcBootDeviceName + "\ hiberfil.sys"
без каких-либо неприятных бинарных исправлений, изменить это невозможно. Помимо прикосновения к исправлению святого окна, исправление «ntoskernel» может привести к таким проблемам, как обновление, отмена исправления или антивирусные программы могут стать сумасшедшими ... Однако давайте посмотрим, какие ссылки относятся к IoArcBootDeviceName:
Изменения в вау, которые кажутся хорошими (единственное, что немного выходит из строя, это 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 Кстати, я использую ntkrnlmp.exe 6.1.7601.19045 из 64-битной Win7 и проверил этот код на ReactOS. (Однако часть спящего режима еще не реализована в исходниках Reactos).
Обратите внимание, что ArcBootDeviceName будет выглядеть примерно так: \ Device \ Harddisk1 \ Partition0
powercfg.exe -h off
), а затем удалить файл.Ответы:
Вы не можете, это должно быть в корне загрузочного диска (диск C: в вашем случае).
Рэймонд Чен объяснил причины этой секретной статьи Windows: парадокс файловой системы .
источник
Хорошо, есть 2 вещи, которые нужно решить, чтобы переместить hiberfil.sys
Скажите 'ntoskrnl.exe', который запускается как Процесс 'Система', чтобы открыть / сохранить данные гибернации в D: \ hiberfil.sys вместо C: \ -> еще не решено!
Чтобы применить этот шанс также к файлу данных конфигурации загрузки (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, и декомпилируем ее, чтобы увидеть, что именно там происходит ...
Короче говоря, путь жестко запрограммирован так: IoArcBootDeviceName + "\ hiberfil.sys" без каких-либо неприятных бинарных исправлений, изменить это невозможно. Помимо прикосновения к исправлению святого окна, исправление «ntoskernel» может привести к таким проблемам, как обновление, отмена исправления или антивирусные программы могут стать сумасшедшими ... Однако давайте посмотрим, какие ссылки относятся к IoArcBootDeviceName:
IopLoadCrashdumpDriver PopDeleteHiberFile PopCreateHiberFile PopBcdSetupResumeObject PopBcdSetDefaultResumeObjectElements PopBcdSetPendingResume PopBcdRegenerateResume PopjectObjectObBRumeReBB
Изменения в вау, которые кажутся хорошими (единственное, что немного выходит из строя, это IopLoadCrashdumpDriver System32 \ Drivers \ crashdmp.sys, однако, кому нужен crashdump - не имеет значения, если мы что-то там сломаем)
Так что исправление IopCreateArcNames, которое создает ArcBootDeviceName, будет хорошо:
https://doxygen.reactos.org/d3/d82/ntoskrnl_2io_2iomgr_2arcname_8c.html Кстати, я использую ntkrnlmp.exe 6.1.7601.19045 из 64-битной Win7 и проверил этот код на ReactOS. (Однако часть спящего режима еще не реализована в исходниках Reactos). Обратите внимание, что ArcBootDeviceName будет выглядеть примерно так: \ Device \ Harddisk1 \ Partition0
Хм, давайте исправим ArcBootDeviceName (LoaderBlock + 0x78) в ArcHalDeviceName (LoaderBlock + 0x80)
Таким образом, в случае, если загрузчик bootmgr находится в другом разделе, чем windows, мы надеемся, что hibernate.sys создает bootmgr.
Таким образом, в ntoskrnl.exe замените 4C8B4B78 на 4C8B4B80 в двух местах. Не забудьте исправить PE-Checksum впоследствии.
источник