1

Почему многим инструментам управления разделами, таким как EASEUS Partition Master, Acronis Disk Director и т.д., Требуются собственные драйверы для запуска?

Другими словами, что им нужно сделать, чего нельзя достичь без выделенного драйвера?

Прямой доступ к диску полностью возможен из пользовательского режима в Windows, поэтому мне любопытно, почему эти инструменты настаивают на установке собственного драйвера для своей работы. В чем причина этого?

2 ответа2

3

@ Дэвид Шварц предположил, что это потому, что они перехватывают весь доступ к диску. Это, безусловно, звучит правдоподобно для меня. Но мне интересно, вот и вся история. Я копался в драйвере EaseUS , empmntdrv.sys . Несколько вещей, на которые стоит обратить внимание:

  1. Он загружается, как только я запускаю пользовательский интерфейс, фактически ничего не разделяя.

  2. На форумах EaseUS есть множество сообщений людей, жалующихся на то, что при запуске пользовательского интерфейса разделы не отображаются, и стандартный ответ службы поддержки EaseUS: переустановите драйвер. Это заставляет меня думать, что оно используется для чтения таблицы.

  3. Вывел большое оружие: PE Explorer, чтобы разобрать файл драйвера. Конечно, греческий для меня, но кое-что выпрыгивает. Во-первых, таблица символов показывает список системных вызовов, сделанных для ntoskrnel.exe , и которые включают в себя взлом с символическими ссылками:

    ; Imports from ntoskrnl.exe
        extrn DbgPrint
        extrn ExAllocatePoolWithTag
        extrn ExFreePoolWithTag
        extrn IoBuildAsynchronousFsdRequest
        extrn IoBuildDeviceIoControlRequest
        extrn IoCreateDevice
        extrn IoCreateSymbolicLink
        extrn IoDeleteDevice
        extrn IoDeleteSymbolicLink
        extrn IoFreeIrp
        extrn IoFreeMdl
        extrn IoGetAttachedDeviceReference
        extrn IoGetDeviceObjectPointer
        extrn IofCallDriver
        extrn IofCompleteRequest
        extrn KeBugCheckEx
        extrn KeInitializeEvent
        extrn KeSetEvent
        extrn KeTickCount
        extrn KeWaitForSingleObject
        extrn MmMapLockedPagesSpecifyCache
        extrn MmUnlockPages
        extrn ObfDereferenceObject
        extrn ObfReferenceObject
        extrn RtlAnsiCharToUnicodeChar
        extrn RtlInitUnicodeString
        extrn RtlUnicodeStringToInteger
        extrn memcpy
        extrn memset
    

    Также обратите внимание, что это не процедуры драйвера фильтра, а операции ввода-вывода низкого уровня. (Не FltGetDiskDeviceObject , скорее IoGetDeviceObjectPointer .

  4. Еще больше слоняющихся вокруг нашли несколько констант, которые могли бы дать больше подсказок. Как и в большинстве скомпилированных кодов Windows, в файле PDB есть жесткая ссылка, обычно с указанием пути на компьютере, который его создал:

    ч:\epm2.0\01_projectarea\00_source\epm2\mod.windiskaccessdriver\windiskaccessdriver\objfre_wxp_x86\i386\epmntdrv.pdb

    Это, вероятно, фактически название проекта для разработчика: "драйвер доступа к диску". Я думаю, что им нужен драйвер, чтобы фактически читать таблицу так, чтобы это было полезно для них.

  5. Тогда есть эта константа, которая действительно выглядит интересно:

    \Device\Harddisk%u\Partition0
    

    Это выглядело достаточно интересно, и я проследил, где на него ссылались в разобранном коде, что привело меня сюда:

     0001051E  68C6190100                       push    L000119C6
     00010523  6A78                             push    00000078h
     00010525  50                               push    eax
     00010526  E85BFFFFFF                       call    SUB_L00010486
     0001052B  83C420                           add esp,00000020h
     0001052E  85C0                             test    eax,eax
     00010530  7404                             jz  L00010536
     00010532                           L00010532:
     00010532  33C0                             xor eax,eax
     00010534  EB43                             jmp L00010579
     00010536                           L00010536:
     00010536  8D4584                           lea eax,[ebp-7Ch]
     00010539  50                               push    eax
     0001053A  8D8574FFFFFF                     lea eax,[ebp-0000008Ch]
     00010540  50                               push    eax
     00010541  FF15941A0100                     call    [ntoskrnl.exe!RtlInitUnicodeString]
     00010547  8D4580                           lea eax,[ebp-80h]
     0001054A  50                               push    eax
     0001054B  8D857CFFFFFF                     lea eax,[ebp-00000084h]
     00010551  50                               push    eax
     00010552  56                               push    esi
     00010553  8D8574FFFFFF                     lea eax,[ebp-0000008Ch]
     00010559  50                               push    eax
     0001055A  FF15901A0100                     call    [ntoskrnl.exe!IoGetDeviceObjectPointer]
    
  6. Итак, что за волшебство делает IoGetDeviceObjectPointer, который доступен только в режиме ядра, когда вы вызываете его на \Device\Harddisk0\Partition0 ?

    От древнего поста до comp.os.ms-windows.programmer.nt.kernel-mode:

    Если вы получите указатель на \device \harddisk(n) \partition(n) с помощью IoGetDeviceObjectPointer(), вы получите указатель на объект устройства разделов. Если вам нужен объект устройства физического диска, вам нужно получить указатель на \device \harddisk(n) \partition0.

    Итак, partition0 позволяет нам добраться до физического диска

    И это дает нам множество показателей производительности и счетчиков, которые ниже логического уровня для диска.

  7. Наконец, пытаясь найти время, когда я подумал, что он может использовать драйвер. Я провел "поверхностный тест" от EaseUS, и я вижу статистику производительности. Они могли бы делать это на уровне пользователя, но в Process Explorer, когда я сделал снимок, я внезапно увидел активную DLL-библиотеку Device.mo: предположительно, часть системы, которая взаимодействует с драйвером.

Все еще не уверен, что это хороший ответ на вопрос. Но в любом случае это было забавное исследование! Спасибо за прочтение.

2

Они должны перехватывать все обращения к диску. Например, предположим, что вы находитесь в процессе клонирования раздела. Если в процессе клонирования будут сделаны какие-либо записи на диск, сектор, в который выполняется запись, должен быть клонирован до того, как будет разрешена запись, иначе результирующий клон будет несовместимым.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .