@ Дэвид Шварц предположил, что это потому, что они перехватывают весь доступ к диску. Это, безусловно, звучит правдоподобно для меня. Но мне интересно, вот и вся история. Я копался в драйвере EaseUS , empmntdrv.sys
. Несколько вещей, на которые стоит обратить внимание:
Он загружается, как только я запускаю пользовательский интерфейс, фактически ничего не разделяя.
На форумах EaseUS есть множество сообщений людей, жалующихся на то, что при запуске пользовательского интерфейса разделы не отображаются, и стандартный ответ службы поддержки EaseUS: переустановите драйвер. Это заставляет меня думать, что оно используется для чтения таблицы.
Вывел большое оружие: 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
.
Еще больше слоняющихся вокруг нашли несколько констант, которые могли бы дать больше подсказок. Как и в большинстве скомпилированных кодов Windows, в файле PDB есть жесткая ссылка, обычно с указанием пути на компьютере, который его создал:
ч:\epm2.0\01_projectarea\00_source\epm2\mod.windiskaccessdriver\windiskaccessdriver\objfre_wxp_x86\i386\epmntdrv.pdb
Это, вероятно, фактически название проекта для разработчика: "драйвер доступа к диску". Я думаю, что им нужен драйвер, чтобы фактически читать таблицу так, чтобы это было полезно для них.
Тогда есть эта константа, которая действительно выглядит интересно:
\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]
Итак, что за волшебство делает IoGetDeviceObjectPointer
, который доступен только в режиме ядра, когда вы вызываете его на \Device\Harddisk0\Partition0
?
От древнего поста до comp.os.ms-windows.programmer.nt.kernel-mode:
Если вы получите указатель на \device \harddisk(n) \partition(n) с помощью IoGetDeviceObjectPointer(), вы получите указатель на объект устройства разделов. Если вам нужен объект устройства физического диска, вам нужно получить указатель на \device \harddisk(n) \partition0.
Итак, partition0 позволяет нам добраться до физического диска
И это дает нам множество показателей производительности и счетчиков, которые ниже логического уровня для диска.
Наконец, пытаясь найти время, когда я подумал, что он может использовать драйвер.
Я провел "поверхностный тест" от EaseUS, и я вижу статистику производительности.
Они могли бы делать это на уровне пользователя, но в Process Explorer, когда я сделал снимок, я внезапно увидел активную DLL-библиотеку Device.mo
: предположительно, часть системы, которая взаимодействует с драйвером.
Все еще не уверен, что это хороший ответ на вопрос.
Но в любом случае это было забавное исследование! Спасибо за прочтение.