Come modificare la posizione del file di ibernazione in Windows 7?


Risposte:


42

Non è possibile, deve trovarsi nella radice dell'unità di avvio (l'unità C: nel tuo caso).

Raymond Chen ha spiegato i motivi per cui in questo articolo confidenziale di Windows: Il paradosso del file system .

L'ibernazione segue un modello simile. Sospendere il sistema operativo significa scaricare l'intero contenuto della memoria nel file di ibernazione; il ripristino dal letargo comporta il ripristino di quel file in memoria e la pretesa che non sia successo nulla. Ancora una volta, si tratta di un altro problema con l'uovo e la gallina: per caricare il file di ibernazione, è necessario il driver del file system, ma il driver del file system si trova nel file di ibernazione. Se si mantiene il file di ibernazione nella directory principale dell'unità di avvio, è possibile utilizzare invece il driver del file system in miniatura.


14
Per le finestre difettose non è in grado di gestirlo, ne avrei davvero bisogno per il mio SSD. Spero che lo risolveranno in futuro in modo da poter scegliere dove metterlo come in Mac OS X.
Hultner,

5
Sì, secondo me è un po 'un difetto di progettazione. Anche se il sistema deve avviarsi dall'unità principale, non c'è motivo di archiviare tutti i gigabyte di informazioni sulla stessa unità: il file di ibernazione potrebbe caricare le basi (ad es. Accesso all'unità) e quindi cercare un'altra unità per ulteriori dati. Sfortunatamente, non lo hanno progettato per gestire quel caso, il che significa che non lo faranno fino a un nuovo sistema operativo ... se mai.
Namey

1
@Namey: se il file di ibernazione potesse caricare le basi, potrebbe anche essere scritto direttamente nel boot loader in primo luogo. Quindi apri un'altra lattina di vermi. D'altra parte, non lo considero neanche un difetto di progettazione. È stato riscritto ai tempi di Windows NT, suppongo, dove la velocità, i limiti di memoria e la bassa potenza della CPU erano i fattori principali, non le piccole unità SSD. Cavolo, chi avrebbe predetto che gli SSD fossero così comuni in primo luogo ??
surfasb,

1
Sono solo belle parole su "pollo e uova" che non contano: se il boot loader sa come caricare il file di ibernazione dal disco alla memoria, non c'è motivo per non avere il driver del file system all'interno del boot loader.
Denis Barmenkov,

3
Questa è una stupida scusa di Microsoft. Cosa succede se entrambi i dischi si trovano sullo stesso controller - viene utilizzato lo stesso driver? cosa succede se un disco è ssd e non vuoi indossarlo velocemente?
NickSoft,

6

Va bene ci sono 2 cose da risolvere per spostare hiberfil.sys

  1. Di 'a' ntoskrnl.exe 'che funziona come' Sistema 'di processo per aprire / salvare i dati di ibernazione su D: \ hiberfil.sys invece di C: \ -> ancora irrisolti!

  2. Applicare questa possibilità anche al file di dati di configurazione di avvio (c: \ BOOT \ BCD) -> Questo è relativamente facile con strumenti come VisualBCD https://www.boyans.net/DownloadVisualBCD.html -> O anche semplicemente usando regedit modifica HKLM \ BCD00000000 \ Objects {71575733-c376-11e4-80ea-806e6f6e6963} \ Elements \ 21000001 ovvero HiberFileDrive di ResumeLoader Or \ 22000002 HiberFilePath. Forse devi usare 'File / Load hive' c: \ BOOT \ BCD per montare il ramo 'BCD00000000' (il cursore deve essere su HKLM, altrimenti la voce di menu è disattivata) -> poiché sembra che sia già stato fatto da ntosknl.exe, quindi non è necessario cambiarlo poiché le modifiche verranno sovrascritte.

Comunque il numero 1. è la cosa peggiore e più difficile da cambiare. Hmm cariciamo ntoskrnl.exe in IDA e individuiamo la funzione che si occupa di /hiberfil.sys e decompiliamola per vedere cosa sta succedendo esattamente lì ...

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

Va bene in breve il percorso è hardcoded in questo modo: IoArcBootDeviceName + "\ hiberfil.sys" senza qualche brutta patch binaria non c'è modo di cambiarlo. Bene, oltre a toccare il patch graal di Windows santo, il "ntoskernel" potrebbe causare problemi come gli aggiornamenti, annullare la patch, oppure i programmi antivirus potrebbero impazzire ... Comunque vediamo quali sono i riferimenti a IoArcBootDeviceName:

IopLoadCrashdumpDriver PopDeleteHiberFile PopCreateHiberFile PopBcdSetupResumeObject PopBcdSetDefaultResumeObjectElements PopBcdSetPendingResume PopBcdRegenerateResumeObject PopBcdEstablishResumeObject Pop

Wow cambiando che sembra andare bene (l'unica cosa che si spegne un po 'è IopLoadCrashdumpDriver System32 \ Drivers \ crashdmp.sys tuttavia chi ha bisogno di crashdump - non importa se rompiamo qualcosa lì)

Quindi patchare IopCreateArcNames che crea ArcBootDeviceName andrà bene:

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 sto usando ntkrnlmp.exe 6.1.7601.19045 da Win7 64 bit e ho controllato questo codice con ReactOS. (Tuttavia la parte in letargo non è ancora implementata nelle fonti di Reactos) Nota che ArcBootDeviceName sarà simile a: \ Device \ Harddisk1 \ Partition0

Hmm patch Patch ArcBootDeviceName (LoaderBlock + 0x78) su ArcHalDeviceName (LoaderBlock + 0x80)

Quindi nel caso in cui il caricatore bootmgr si trovi su una partizione diversa da quella che si spera hibernate.sys di Windows sia stato creato da 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

Quindi in ntoskrnl.exe sostituire 4C8B4B78 con 4C8B4B80 in due posizioni. Non dimenticare di riparare PE-Checksum in seguito.


Parla di una risposta criptica che molti non riescono a capire!
killjoy

Qualcuno ha provato a patchare ntoskrnl.exe in questo modo? Ha funzionato dopo?
PF4 Pubblico il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.