Wie ändere ich den Speicherort der Ruhezustandsdatei in Windows 7?

45

Ich kann den Ruhezustand in Windows 7 nicht aktivieren, da auf meinem Laufwerk C: nicht genügend Speicherplatz vorhanden ist, um die Ruhezustandsdatei zu erstellen. Wie kann ich Windows veranlassen, die Datei woanders abzulegen?

Phänomen
quelle
Das kannst du nicht. Sie können jedoch den Ruhezustand ( powercfg.exe -h off) deaktivieren und die Datei anschließend löschen.
Ian Boyd

Antworten:

42

Dies ist nicht möglich, es muss sich im Stammverzeichnis des Startlaufwerks befinden (in Ihrem Fall im Laufwerk C:).

Raymond Chen erläuterte die Gründe dafür in diesem vertraulichen Windows-Artikel: The File System Paradox .

Der Winterschlaf folgt einem ähnlichen Muster. Wenn Sie das Betriebssystem in den Ruhezustand versetzen, wird der gesamte Speicherinhalt in die Ruhezustandsdatei geschrieben. Beim Wiederherstellen aus dem Ruhezustand wird die Datei zurück in den Speicher verschoben, und es wird so getan, als wäre nichts passiert. Wieder ist es ein anderes Hühnchen-und-Ei-Problem: Um die Ruhezustandsdatei zu laden, benötigen Sie den Dateisystemtreiber, aber der Dateisystemtreiber befindet sich in der Ruhezustandsdatei. Wenn Sie die Ruhezustandsdatei im Stammverzeichnis des Startlaufwerks behalten, kann stattdessen der Miniatur-Dateisystemtreiber verwendet werden.

Snark
quelle
14
Schade, dass Windows damit nicht umgehen kann, ich brauche es wirklich für meine SSD. Ich hoffe, dass sie das Problem in Zukunft beheben, damit Sie auswählen können, wo es unter Mac OS X
abgelegt werden soll.
5
Yah, meiner Meinung nach ist es ein Designfehler. Selbst wenn das System vom Hauptlaufwerk booten muss, gibt es keinen Grund, alle Gigabyte an Informationen auf demselben Laufwerk zu speichern - die Ruhezustandsdatei könnte die Grundlagen laden (z. B. Laufwerkszugriff) und dann auf ein anderes Laufwerk nach weiteren suchen Daten. Leider haben sie es nicht für diesen Fall entworfen - was bedeutet, dass sie es erst mit einem neuen Betriebssystem tun werden ... wenn überhaupt.
Namey
1
@Namey: Wenn die Ruhezustandsdatei die Grundlagen laden könnte, könnte sie auch direkt in den Bootloader geschrieben werden. Dann öffnet man eine ganze Dose Würmer. Zum anderen würde ich es auch nicht als Designfehler bezeichnen. Es wurde in den Tagen von Windows NT geschrieben, in denen Geschwindigkeit, Speicherbeschränkungen und geringe CPU-Leistung die großen Faktoren waren, nicht kleine SSD-Laufwerke. Heck, wer würde davon ausgehen, dass SSDs überhaupt so häufig sind?
Surfasb
1
Es sind nur hübsche Worte über "Hühnchen und Eier", die keine Rolle spielen: Wenn der Bootloader weiß, wie man Ruhezustandsdateien von der Festplatte in den Arbeitsspeicher lädt, gibt es keinen Grund, keinen Dateisystemtreiber im Bootloader zu haben.
Denis Barmenkov
3
Das ist eine blöde Ausrede für Microsoft. Was passiert, wenn sich beide Festplatten auf demselben Controller befinden und derselbe Treiber verwendet wird? Was ist, wenn eine Festplatte ssd ist und Sie sie nicht schnell tragen möchten?
NickSoft
6

Okay, es gibt 2 Dinge zu lösen, um hiberfil.sys zu bewegen

  1. Sagen Sie 'ntoskrnl.exe', die als Prozess 'System' ausgeführt wird, um Ruhezustandsdaten in D: \ hiberfil.sys anstelle von C: \ -> noch ungelöst zu öffnen / speichern!

  2. Diese Chance auch auf die Startkonfigurationsdatei (c: \ BOOT \ BCD) anzuwenden -> Dies ist mit Tools wie der VisualBCD https://www.boyans.net/DownloadVisualBCD.html relativ einfach -> oder auch nur mit regedit Bearbeiten von HKLM \ BCD00000000 \ Objects {71575733-c376-11e4-80ea-806e6f6e6963} \ Elements \ 21000001, das das HiberFileDrive von ResumeLoader oder \ 22000002 HiberFilePath ist. Möglicherweise müssen Sie 'File / Load hive' c: \ BOOT \ BCD verwenden, um den Zweig 'BCD00000000' zu mounten (Cursor muss sich auf HKLM befinden, sonst ist der Menüpunkt ausgegraut) -> wie es scheint, ist dies bereits erledigt Durch ntosknl.exe muss dies nicht geändert werden, da die Änderungen überschrieben werden.

Nummer 1 ist jedoch die schlechtere und schwerer zu ändernde Sache. Hmm, lass uns ntoskrnl.exe in IDA laden und die Funktion finden, die sich mit /hiberfil.sys befasst, und dekompilieren, um zu sehen, was genau dort vor sich geht ...

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

Okay, kurz gesagt, der Pfad ist wie folgt fest codiert : IoArcBootDeviceName + "\ hiberfil.sys" Ohne ein böses binäres Patching gibt es keine Möglichkeit, dies zu ändern. Naja, neben dem Berühren des Holy Windows Grail Patches kann das "ntoskernel" zu Problemen führen, wie zum Beispiel das Rückgängigmachen des Patches oder das Verrücktwerden von Antivirenprogrammen.

IopLoadCrashdumpDriver PopDeleteHiberFile PopCreateHiberFile PopBcdSetupResumeObject PopBcdSetDefaultResumeObjectElements PopBcdSetPendingResume PopBcdRegenerateResumeObject PopBcdEstablishResumeObjectObject PopResumeObject

Wow, das scheint in Ordnung zu sein (nur IopLoadCrashdumpDriver System32 \ Drivers \ crashdmp.sys geht ein bisschen runter, aber wer Crashdump braucht - ist egal, ob wir dort etwas kaputt machen)

So Patchen IopCreateArcNames , die schafft ArcBootDeviceName fein sein wird:

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 Übrigens Ich verwende ntkrnlmp.exe 6.1.7601.19045 von Win7 64 Bit und überprüfte diesen Code gegen ReactOS. (Der Ruhezustand ist jedoch noch nicht in den Reactos-Quellen implementiert.) Beachten Sie, dass ArcBootDeviceName etwa wie folgt lautet: \ Device \ Harddisk1 \ Partition0

Hmm lass uns ArcBootDeviceName (LoaderBlock + 0x78) auf ArcHalDeviceName (LoaderBlock + 0x80) patchen

Falls sich der Bootmgr-Loader auf einer anderen Partition befindet als Windows, wird hoffentlich hibernate.sys dort erstellt, wo bootmgr ist.

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

Ersetzen Sie daher in ntoskrnl.exe 4C8B4B78 an zwei Stellen durch 4C8B4B80. Vergessen Sie nicht, die PE-Checksumme nachträglich zu reparieren.

Nadu
quelle
Sprechen Sie über eine kryptische Antwort, die nicht viele verstehen können!
Killjoy
Hat jemand versucht, ntoskrnl.exe auf diese Weise zu patchen? Hat es danach geklappt?
PF4Public