Обработка информации для объема

Я использую WinDBG для получения информации о ручке:

kd> !handle 430 PROCESS 85c91030 SessionId: 0 Cid: 0388 Peb: 7ffdc000 ParentCid: 01e8 DirBase: 7ee841c0 ObjectTable: 8da023f0 HandleCount: 539. Image: svchost.exe Handle table at 9a3da000 with 539 entries in use 0430: Object: 8480e038 GrantedAccess: 00100080 Entry: 8da01860 Object: 8480e038 Type: (844f9ac8) File ObjectHeader: 8480e020 (new version) HandleCount: 1 PointerCount: 2 Directory Object: 00000000 Name: \ {HarddiskVolume2} 

Я знаю, что большинство данных происходит от _FILE_OBJECT, но я не могу определить, как определяется {HarddiskVolume2}. Как WinDBG получает эту информацию?

это имя объекта устройства для раздела в вашем жестком диске

 kd> !object \Device\HardDisk0\ Object: e13d5f58 Type: (812bd3c8) Directory ObjectHeader: e13d5f40 (old version) HandleCount: 1 PointerCount: 6 Directory Object: e10077a0 Name: Harddisk0 Hash Address Type Name ---- ------- ---- ---- 21 8123e5e0 Device DR0 33 e13d3a50 SymbolicLink Partition0 34 e13d3030 SymbolicLink Partition1 36 8126b030 Device DP(1)0x7e00-0xfff2e4400+1 kd> !object \Device\HardDisk0\Partition1 Object: e13d3030 Type: (812bd1f8) SymbolicLink ObjectHeader: e13d3018 (old version) HandleCount: 0 PointerCount: 1 Directory Object: e13d5f58 Name: Partition1 Target String is '\Device\HarddiskVolume1' 

вы также можете запросить обратное, используя! driveinfo [dosdevicename]

 kd> !driveinfo c: Drive c:, DriveObject e13d3770 Directory Object: e1004890 Name: C: Target String is '\Device\HarddiskVolume1' Drive Letter Index is 3 (C:) Volume DevObj: 8126bd98 Vpb: 8123db20 DeviceObject: 8121b020 FileSystem: \FileSystem\Ntfs 

скрипт python для отображения всех дисков

 from ctypes import * ntdevs = create_string_buffer(15000) b=windll.kernel32.GetLogicalDriveStringsA(sizeof(ntdevs),byref(ntdevs)) for i in range(0,b): print ntdevs[i], print "\n" dosdevs = create_string_buffer(15000) for j in range(0,b,4): a=windll.Kernel32.QueryDosDeviceA(ntdevs[j]+ntdevs[j+1],byref(dosdevs),sizeof(dosdevs)) for i in range(0,a): print dosdevs[i], print "\n" 

Exec

 python qdd.py C : \ D : \ E : \ F : \ G : \ \ D evice \ H arddisk V olume 2 \ D evice \ H arddisk V olume 3 \ D evice \ H arddisk V olume 4 \ D evice \ C d R om 0 \ D evice \ H arddisk V olume 5 

редактировать

Если бы вы были на xp-sp3, этот скрипт мог бы помочь вам понять, как windbg извлекает {hardiskvolume1}, этот скрипт также предполагает определенные вещи, такие как уровень kernel_handle_table, если у вас много ручек, вероятно, вы не можете индексировать слепое, как handle * size + start of table

В более поздних версиях структура OBJECT_HEADER различна. Нет поля NameInfoOffset
в структуре OBJECT_HEADER но TypeIndex вам может понадобиться изменить этот скрипт в соответствии с os> xp

 r $t0 = (@@c++((sizeof(nt!_HANDLE_TABLE_ENTRY) / sizeof(unsigned long))) * ${$arg1}) r $t1 = (@$t0 + poi(poi(nt!ObpKernelHandleTable))) r $t2 = (@@c++(#FIELD_OFFSET(nt!_OBJECT_HEADER ,Body))) r $t3 = (@@c++(#FIELD_OFFSET(nt!_FILE_OBJECT ,DeviceObject))) r $t4 = (@@c++(#FIELD_OFFSET(nt!_OBJECT_HEADER ,NameInfoOffset))) r $t5 = ((poi(@$t1) & 0xfffffff8 ) + @$t2) r $t6 = (poi(@$t5 + @$t3) - @$t2 - @$t4) .printf "%mu {%msu}" , @@c++(((nt!_FILE_OBJECT *) @@masm( @$t5 ))->FileName.Buffer ) , @$t6 

выполненный таким образом

 kd> $$>a< "xxx\getfilename.txt" 294 \Documents and Settings\NetworkService\NTUSER.DAT {HarddiskVolume1} 

подтверждение с помощью ручки 294

 PROCESS 80559c20 SessionId: none Cid: 0000 Peb: 00000000 ParentCid: 0000 DirBase: 00039000 ObjectTable: e1000b78 HandleCount: 230. Image: Idle Kernel handle table at e1002000 with 230 entries in use 0294: Object: 810c20e0 GrantedAccess: 00000003 (Protected) Entry: e1002528 Object: 810c20e0 Type: (8127b900) File ObjectHeader: 810c20c8 (old version) HandleCount: 1 PointerCount: 4 Directory Object: 00000000 Name: \Documents and Settings\NetworkService\NTUSER.DAT {HarddiskVolume1}