Windows 7で休止状態ファイルの場所を変更する方法は?


45

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



できません。ただしpowercfg.exe -h off、休止状態()を無効にしてから、ファイルを削除できます。
イアン・ボイド

回答:


42

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

Raymond Chenは、このWindows Confidentialの記事:The File System Paradoxでその理由を説明しました。

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


14
悪いウィンドウはこれを処理できないため、SSDには本当に必要です。Mac OS Xのようにどこに配置するかを選択できるように、将来修正することを願っています。
Hultner

5
ええ、私の意見では、それは少し設計上の欠陥です。システムがメインドライブから起動する必要がある場合でも、すべてのギガバイトの情報を同じドライブに保存する必要はありません。データ。残念ながら、彼らはそのようなケースを処理するように設計していませんでした。つまり、新しいOSが登場するまで、そうではないということです。
Namey

1
@Namey:休止状態ファイルが基本をロードできる場合、そもそもブートローダーに直接書き込まれる可能性があります。次に、他のワームの缶全体を開きます。別のことではないが、私もそれを設計上の欠陥とは思わないだろう。私が推測するWindows NTの時代に書き戻されました。そこでは、速度、メモリ制限、低CPUパワーが小さなSSDドライブではなく大きな要因でした。そもそも、誰がSSDをそんなに一般的なものと予測したのでしょうか??
-surfasb

1
重要なのは「鶏と卵」についてのかわいい言葉です。ブートローダーがディスクからメモリに休止状態ファイルをロードする方法を知っている場合、ブートローダー内にファイルシステムドライバーがない理由はありません。
デニスバルメンコフ

3
それはマイクロソフトの愚かな言い訳です。両方のディスクが同じコントローラー上にある場合-同じドライバーが使用されている場合はどうなりますか?1つのディスクがssdであり、それを早く装着したくない場合はどうなりますか?
ニックソフト

6

はい、hiberfil.sysを移動するために解決すべき2つのことがあります

  1. プロセス 'System'として実行される 'ntoskrnl.exe'に、C:\-> unsolvedの代わりにD:\ hiberfil.sysにハイバネーションデータを開く/保存するように伝えます。

  2. この機会をブート構成データファイル(c:\ BOOT \ BCD)にも適用するには -> VisualBCD https://www.boyans.net/DownloadVisualBCD.htmlのようなツールを使用すると比較的簡単です HKLM \ BCD00000000 \ Objects {71575733-c376-11e4-80ea-806e6f6e6963} \ Elements \ 21000001を編集します。これはResumeLoaderのHiberFileDriveまたは\ 22000002 HiberFilePathです。「ファイル/ロードハイブ」c:\ BOOT \ BCDを使用して「BCD00000000」ブランチをマウントする必要があるかもしれません(カーソルはHKLM上にある必要があり、そうでない場合はメニュー項目がグレー表示されます) ->これは既に行われているようですntosknl.exeによって変更されるため、yaの変更は上書きされるため、これを変更する必要はありません。

しかし、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.html btw 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-Checksumを修正することを忘れないでください。


多くの人が理解できない不可解な答えについて話してください!
-killjoy

誰かがこの方法でntoskrnl.exeにパッチを当てようとしましたか?その後は機能しましたか?
PF4Public
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.