it-swarm-eu.dev

Vieni a cambiare la posizione del file di ibernazione in Windows 7?

Non riesco ad abilitare la sospensione in Windows 7 perché non c'è spazio sufficiente sul mio disco C: per creare il file di sospensione. Come posso fare in modo che Windows metta il file da qualche altra parte?

44
Phenom

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

Raymond Chen ha spiegato i motivi per cui in questo articolo confidenziale di Windows: The File System Paradox .

L'ibernazione segue uno schema simile. Ibernare il sistema operativo significa scaricare l'intero contenuto della memoria nel file di ibernazione; il ripristino dal letargo comporta il risucchio di quel file in memoria e il pretendere che non sia successo nulla. Di nuovo, si tratta di un altro problema Chicken-and-Egg: per caricare il file di ibernazione, è necessario il driver del file system, ma il driver del file system si trova nel file di sospensione. Se si mantiene il file di ibernazione nella directory principale dell'unità di avvio, è possibile utilizzare il driver del file system in miniatura.

42
Snark

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

  1. Dì "ntoskrnl.exe" che viene eseguito come Processo "Sistema" per aprire/salvare i dati di ibernazione su D:\hiberfil.sys invece di C:\-> non ancora risolto!

  2. Per 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 solo usando la modifica regedit HKLM\BCD00000000\Objects {71575733-c376-11e4-80ea-806e6f6e6963}\Elements\21000001 cioè HiberFileDrive di ResumeLoader O\22000002 HiberFilePath . Forse hai bisogno di usare "File/Carica Hive" c:\BOOT\BCD per montare il ramo "BCD00000000". (Il cursore deve essere su HKLM, altrimenti la voce di menu è disattivata) -> come sembra che questo sia già stato fatto da ntosknl.exe, quindi non è assolutamente necessario modificarlo poiché le modifiche verranno sovrascritte.

Comunque il numero 1. è la cosa peggiore e più difficile da cambiare. Hmm carichiamo ntoskrnl.exe in IDA e localizziamo la funzione che si occupa di /hiberfil.sys e decompilalo 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,
...

Ok, in breve, il percorso è hardcoded in questo modo: IoArcBootDeviceName + "\ hiberfil.sys" senza qualche brutto patch binario non c'è modo di cambiarlo. Oltre a toccare le finestre sante, il patch di graille sul "ntoskernel" potrebbe causare problemi come gli aggiornamenti, annullare la patch o i programmi antivirus potrebbero diventare pazzi ... Tuttavia vediamo quali sono i riferimenti a IoArcBootDeviceName:

IopLoadCrashdumpDriver PopDeleteHiberFile PopCreateHiberFile PopBcdSetupResumeObject PopBcdSetDefaultResumeObjectElement PopBcdSetPendingResume PopBcdRegenerateResumeObject PopBcdEstablishResumeObject PopAllocateHiberContext IopCreateArcNames PopBcdSetupResumeObject

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

Quindi patching 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 controllato questo codice con ReactOS. (Tuttavia la parte in letargo non è ancora implementata nei sorgenti di Reactos) Si noti che ArcBootDeviceName sarà qualcosa del tipo:\Device\Harddisk1\Partition0

Hmm cerchiamo ArcBootDeviceName (LoaderBlock + 0x78) in ArcHalDeviceName (LoaderBlock + 0x80)

Quindi, nel caso in cui il bootmgr loader si trovi su una partizione diversa da Windows, si spera che hibernate.sys venga creato sia 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 correggere PE-Checksum in seguito.

6
Nadu