web-dev-qa-db-ja.com

Windows 7でハイバネーションファイルの場所を変更する方法

C:ドライブにハイバネーションファイルを作成するための十分なスペースがないため、Windows 7でハイバネーションを有効にできません。 Windowsにファイルを別の場所に配置させるにはどうすればよいですか?

45
Phenom

できません。それは、ブートドライブ(この場合はC:ドライブ)のルートにある必要があります。

レイモンドチェンは、このWindows機密記事 The File System Paradox で理由を説明しました。

冬眠も同様のパターンに従います。オペレーティングシステムを休止状態にすることは、メモリの内容全体を休止状態ファイルにダンプすることを意味します。ハイバネーションから復元するには、そのファイルをメモリに吸い戻し、何も起こらないふりをします。繰り返しますが、これはもう1つの問題です。休止状態ファイルを読み込むには、ファイルシステムドライバーが必要ですが、ファイルシステムドライバーは休止状態ファイルにあります。ハイバネーションファイルをブートドライブのルートディレクトリに保存する場合は、代わりにミニチュアファイルシステムドライバーを使用できます。

42
Snark

わかりましたhiberfil.sysを移動するために解決する2つの事柄があります

  1. プロセス 'System'として実行される 'ntoskrnl.exe'に、休止データをC:\ではなくD:\ hiberfil.sysに開く/保存するように伝えます->まだ解決されていません!

  2. このチャンスをブート構成データファイル(c:\ BOOT\BCD)にも適用するには、これはVisualBCDなどのツールを使用すると比較的簡単です https://www.boyans.net/DownloadVisualBCD.html ->または、regedit編集HKLM\BCD00000000\Objects {71575733-c376-11e4-80ea-806e6f6e6963}\Elements\21000001を使用して、ResumeLoaderのHiberFileDriveまたは\ 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"厄介なバイナリパッチを適用しないと、これを変更する方法はありません。 "ntoskernel"にパッチを当てて聖なる窓の杯に触れるだけでなく、更新プログラムがパッチを取り消したり、ウイルス対策プログラムが狂ったりするような問題が発生する可能性があります。

IopLoadCrashdumpDriver PopDeleteHiberFile PopCreateHiberFile PopBcdSetupResumeObject PopBcdSetDefaultResumeObjectElements PopBcdSetPendingResume PopBcdRegenerateResumeObject PopBcdEstablishResumeObject PopAllocateHiberContext IopCreateArcNames PopBcdSetupResumeObject

うわー、それはうまくいくように見えます(少しうまくいくのはIopLoadCrashdumpDriver System32\Drivers\crashdmp.sysですが、誰がクラッシュダンプを必要とするか-ここで何かを壊してもかまいません)

したがって、ArcBootDeviceNameを作成するパッチIopCreateArcNamesは問題ありません。

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.htmlbtw Win7 64ビットのntkrnlmp.exe 6.1.7601.19045を使用して、このコードをチェックしましたReactOSに対して。 (ただし、休止状態の部分はまだReactosソースに実装されていません)ArcBootDeviceNameは次のようになることに注意してください:\ Device\Harddisk1\Partition0

うーん、ArcBootDeviceName(LoaderBlock + 0x78)をArcHalDeviceName(LoaderBlock + 0x80)にパッチしてみましょう

したがって、bootmgrローダーがWindowsとは異なるパーティションにある場合、うまくいけば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では、2つの場所で4C8B4B78を4C8B4B80に置き換えます。後でPEチェックサムを修正することを忘れないでください。

6
Nadu