it-swarm.asia

كيف تغير موقع ملف السبات في ويندوز 7؟

لا يمكنني تمكين وضع الإسبات في Windows 7 لأنه لا توجد مساحة كافية على محرك الأقراص C: لإنشاء ملف الإسبات. كيف يمكنني جعل Windows يضع الملف في مكان آخر؟

44
Phenom

لا يمكنك ، يجب أن يكون في جذر محرك أقراص التمهيد (محرك الأقراص C: في حالتك).

أوضح Raymond Chen الأسباب في مقالة Windows السرية هذه: The File System Paradox .

السبات يتبع نمطًا مشابهًا. يعني الإسبات في نظام التشغيل إلقاء محتويات الذاكرة بالكامل في ملف الإسبات. الاستعادة من السبات تستلزم إعادة الملف إلى الذاكرة والتظاهر بعدم حدوث أي شيء. مرة أخرى ، هناك مشكلة أخرى في الدجاج والبيض: لتحميل ملف الإسبات ، فأنت بحاجة إلى برنامج تشغيل نظام الملفات ، لكن برنامج تشغيل نظام الملفات موجود في ملف الإسبات. إذا احتفظت بملف الإسبات في الدليل الجذر لمحرك التمهيد ، فيمكن استخدام برنامج تشغيل نظام الملفات المصغر بدلاً من ذلك.

42
Snark

حسنًا ، يوجد 2 شيء يجب حله لنقل hiberfil.sys

  1. أخبر 'ntoskrnl.exe' الذي يتم تشغيله كـ Process 'System' لفتح/حفظ بيانات السبات إلى D:\hiberfil.sys بدلاً من C:\-> لم يتم حلها بعد!

  2. لتطبيق هذه الفرصة أيضًا على ملف بيانات تهيئة التمهيد (c:\BOOT\BCD) -> هذا أمر سهل نسبيًا باستخدام أدوات مثل VisualBCD https://www.boyans.net/DownloadVisualBCD .html -> أو حتى مجرد استخدام إعادة تحرير HKLM\BCD00000000\Objects {71575733-c376-11e4-80ea-806e6f6e6963}\Elements\21000001 وهو HiberFileDrive من ResumeLoader أو\22000002 HiberFilePath . ربما تحتاج إلى استخدام "File/Load Hive" 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" إلى حدوث مشكلات مثل التحديثات ، حيث قد تتراجع برامج التصحيح أو برامج مكافحة الفيروسات ... ومع ذلك ، دعونا نرى المراجع الموجودة في IoArcBootDeviceName:

IopLoadCrashdumpDriver PopDeleteHiberFile PopCreateHiberFile PopBcdSetupResumeObject PopBcdSetDefaultResumeObjectElements PopBcdSetPendingResume PopBcdRegenerateResumeObject PopBcdEstablishResumeObject

نجاح باهر تغيير هذا يبدو أنه جيد (الشيء الوحيد الذي ينفجر قليلاً هو IopLoadCrashdumpDriver System32\Drivers\crashdmp.sys ومع ذلك من يحتاج إلى crashdump - لا يهم إذا كسرنا شيئًا هناك)

لذا فإن الترقيع IopCreateArcNames الذي ينشئ ArcBootDeviceName سيكون على ما يرام:

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 راجع للشغل أنا أستخدم ntkrnlmp.exe 6.1. 7601.19045 من Win7 64 بت والتحقق من هذا الرمز ضد ReactOS. (ومع ذلك ، لم يتم تطبيق جزء الإسبات في مصادر Reactos) لاحظ أن ArcBootDeviceName سيكون مثل:\Device\Harddisk1\Partition0

هم دعونا تصحيح ArcBootDeviceName (LoaderBlock + 0x78) إلى ArcHalDeviceName (LoaderBlock + 0x80)

لذلك في حالة وجود أداة تحميل bootmgr على قسم مختلف عن إنشاء نوافذ ، نأمل أن يكون 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 استبدال 4C8B4B78 مع 4C8B4B80 في موقعين. لا تنسى أن إصلاح PE- اختباري بعد ذلك.

6
Nadu