回答:
できません。起動ドライブ(この場合はC:ドライブ)のルートにある必要があります。
Raymond Chenは、このWindows Confidentialの記事:The File System Paradoxでその理由を説明しました。
ハイバネーションは同様のパターンに従います。オペレーティングシステムを休止状態にすることは、メモリの内容全体を休止状態ファイルにダンプすることを意味します。休止状態から復元するには、そのファイルをメモリに吸い戻し、何も起こらないふりをする必要があります。繰り返しますが、これは別の鶏と卵の問題です。休止状態ファイルをロードするには、ファイルシステムドライバーが必要ですが、ファイルシステムドライバーは休止状態ファイルにあります。ブートドライブのルートディレクトリに休止状態ファイルを保持する場合は、代わりにミニチュアファイルシステムドライバーを使用できます。
はい、hiberfil.sysを移動するために解決すべき2つのことがあります
プロセス 'System'として実行される 'ntoskrnl.exe'に、C:\-> unsolvedの代わりにD:\ hiberfil.sysにハイバネーションデータを開く/保存するように伝えます。
この機会をブート構成データファイル(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を修正することを忘れないでください。