第一部分:
VOID
FindFirstIndexEntry (
??? IN PIRP_CONTEXT IrpContext,
??? IN PSCB Scb,
??? IN PVOID Value,
??? IN OUT PINDEX_CONTEXT IndexContext
??? )
{
。。。。。。
??? //
??? //? Lookup the attribute record from the Scb.
??? //
??? if (!NtfsLookupAttributeByName( IrpContext,
??????????????????????????????????? Scb->Fcb,
??????????????????????????????????? &Scb->Fcb->FileReference,
??????????????????????????????????? $INDEX_ROOT,
??????????????????????????????????? &Scb->AttributeName,
??????????????????????????????????? NULL,
??????????????????????????????????? FALSE,
??????????????????????????????????? &IndexContext->AttributeContext )) {
第二部分:
0: kd> p
Ntfs!FindFirstIndexEntry+0x68:
f71740d2 84c0??????????? test??? al,al
0: kd> dv
???? IrpContext = 0xf793291c
??????????? Scb = 0xe1363d20
????????? Value = 0xe13559b0
?? IndexContext = 0xe1352348
????? Attribute = 0x00000000
????? IndexRoot = 0xe1352348
???????????? Sp = 0xe1363d20
0: kd> dx -r1 ((Ntfs!_SCB *)0xe1363d20)
((Ntfs!_SCB *)0xe1363d20)???????????????? : 0xe1363d20 [Type: _SCB *]
??? [+0x000] Header?????????? [Type: _NTFS_ADVANCED_FCB_HEADER]
??? [+0x040] FcbLinks???????? [Type: _LIST_ENTRY]
??? [+0x048] Fcb????????????? : 0xe1363c58 [Type: _FCB *]
??? [+0x04c] Vcb????????????? : 0x895d5100 [Type: _VCB *]
??? [+0x050] ScbState???????? : 0x100006a0 [Type: unsigned long]
??? [+0x054] NonCachedCleanupCount : 0x0 [Type: unsigned long]
??? [+0x058] CleanupCount???? : 0x1 [Type: unsigned long]
??? [+0x05c] CloseCount?????? : 0x2 [Type: unsigned long]
??? [+0x060] ShareAccess????? [Type: _SHARE_ACCESS]
??? [+0x07c] AttributeTypeCode : 0xa0 [Type: unsigned long]
??? [+0x080] AttributeName??? : "$I30" [Type: _UNICODE_STRING]
??? [+0x088] FileObject?????? : 0x8962b128 [Type: _FILE_OBJECT *]
??? [+0x08c] NonpagedScb????? : 0x89954e60 [Type: _SCB_NONPAGED *]
??? [+0x090] Mcb????????????? [Type: _NTFS_MCB]
??? [+0x0a8] McbStructs?????? [Type: NTFS_MCB_INITIAL_STRUCTS]
??? [+0x0f0] CompressionUnit? : 0x0 [Type: unsigned long]
??? [+0x0f4] AttributeFlags?? : 0x0 [Type: unsigned short]
??? [+0x0f6] CompressionUnitShift : 0x0 [Type: unsigned char]
??? [+0x0f7] PadUchar???????? : 0x0 [Type: unsigned char]
??? [+0x0f8] ValidDataToDisk? : 0 [Type: __int64]
??? [+0x100] TotalAllocated?? : 8192 [Type: __int64]
??? [+0x108] EofListHead????? [Type: _LIST_ENTRY]
??? [+0x110] CcbQueue???????? [Type: _LIST_ENTRY]
??? [+0x118] ScbSnapshot????? : 0x0 [Type: _SCB_SNAPSHOT *]
??? [+0x11c] EncryptionContext : 0x0 [Type: void *]
??? [+0x120] EncryptionContextLength : 0x0 [Type: unsigned long]
??? [+0x124] ScbPersist?????? : 0x0 [Type: unsigned long]
??? [+0x128] IoAtEofThread??? : 0x0 [Type: unsigned long *]
??? [+0x130] ScbType????????? [Type: __unnamed]
第三部分:
BOOLEAN
NtfsFindInFileRecord (
??? IN PIRP_CONTEXT IrpContext,
??? IN PATTRIBUTE_RECORD_HEADER Attribute,
??? OUT PATTRIBUTE_RECORD_HEADER *ReturnAttribute,
??? IN ATTRIBUTE_TYPE_CODE QueriedTypeCode,
??? IN PCUNICODE_STRING QueriedName OPTIONAL,
??? IN BOOLEAN IgnoreCase,
??? IN PVOID QueriedValue OPTIONAL,
??? IN ULONG QueriedValueLength
??? )
{
??? while ( TRUE ) {
。。。。。。
??????????????? NtfsInitializeStringFromAttribute( &AttributeName, Attribute );
??????????????? //
??????????????? //? See if we have a name match.
??????????????? //
??????????????? if (NtfsAreNamesEqual( UpcaseTable,
?????????????????????????????????????? &AttributeName,
?????????????????????????????????????? QueriedName,
?????????????????????????????????????? IgnoreCase )) {
??????????????????? break;
??????????????? }
??? return TRUE;
}
第四部分:
??????????????? NtfsInitializeStringFromAttribute( &AttributeName, Attribute );
#define NtfsInitializeStringFromAttribute(NAME,ATTRIBUTE) {??????????????? \
??? (NAME)->Length = (USHORT)(ATTRIBUTE)->NameLength << 1;???????????????? \
??? (NAME)->MaximumLength = (NAME)->Length;??????????????????????????????? \?? ??? ??? ?
??? (NAME)->Buffer = (PWSTR)Add2Ptr((ATTRIBUTE), (ATTRIBUTE)->NameOffset); \
}
(NAME)->Buffer?? ??? ?(ATTRIBUTE)->NameLength?? ??? ??? ?+0x009 NameLength?????? : 0x4 ''
(NAME)->Buffer?? ??? ?(ATTRIBUTE)->NameOffset?? ??? ??? ?+0x00a NameOffset?????? : 0x18
0: kd> dt Ntfs!_ATTRIBUTE_RECORD_HEADER? 0xc1241438+48+60+28+48
?? +0x000 TypeCode???????? : 0x90
?? +0x004 RecordLength???? : 0xe0
?? +0x008 FormCode???????? : 0 ''
?? +0x009 NameLength?????? : 0x4 ''
?? +0x00a NameOffset?????? : 0x18
?? +0x00c Flags??????????? : 0
?? +0x00e Instance???????? : 6
?? +0x010 Form???????????? : __unnamed
0: kd> db 0xc1241438+48+60+28+48+18
c1241568? 24 00 49 00 33 00 30 00-30 00 00 00 01 00 00 00? $.I.3.0.0.......
第五部分:
0: kd> p
Ntfs!NtfsFindInFileRecord+0x92:
f7171ac2 384d1c????????? cmp???? byte ptr [ebp+1Ch],cl
0: kd> dv
??????? IrpContext = 0xf793291c
???????? Attribute = 0xc1241438
0: kd> dx -r1 ((Ntfs!_ATTRIBUTE_RECORD_HEADER *)0xc1241438)
((Ntfs!_ATTRIBUTE_RECORD_HEADER *)0xc1241438)???????????????? : 0xc1241438 [Type: _ATTRIBUTE_RECORD_HEADER *]
??? [+0x000] TypeCode???????? : 0x10 [Type: unsigned long]
??? [+0x004] RecordLength???? : 0x48 [Type: unsigned long]
??? [+0x008] FormCode???????? : 0x0 [Type: unsigned char]
??? [+0x009] NameLength?????? : 0x0 [Type: unsigned char]
??? [+0x00a] NameOffset?????? : 0x18 [Type: unsigned short]
??? [+0x00c] Flags??????????? : 0x0 [Type: unsigned short]
??? [+0x00e] Instance???????? : 0x0 [Type: unsigned short]
??? [+0x010] Form???????????? [Type: __unnamed]
0: kd> dt Ntfs!_ATTRIBUTE_RECORD_HEADER? 0xc1241438
?? +0x000 TypeCode???????? : 0x10
?? +0x004 RecordLength???? : 0x48
?? +0x008 FormCode???????? : 0 ''
?? +0x009 NameLength?????? : 0 ''
?? +0x00a NameOffset?????? : 0x18
?? +0x00c Flags??????????? : 0
?? +0x00e Instance???????? : 0
?? +0x010 Form???????????? : __unnamed
0: kd> dt Ntfs!_ATTRIBUTE_RECORD_HEADER? 0xc1241438+48
?? +0x000 TypeCode???????? : 0x30
?? +0x004 RecordLength???? : 0x60
?? +0x008 FormCode???????? : 0 ''
?? +0x009 NameLength?????? : 0 ''
?? +0x00a NameOffset?????? : 0x18
?? +0x00c Flags??????????? : 0
?? +0x00e Instance???????? : 1
?? +0x010 Form???????????? : __unnamed
0: kd> dt Ntfs!_ATTRIBUTE_RECORD_HEADER? 0xc1241438+48+60
?? +0x000 TypeCode???????? : 0x40
?? +0x004 RecordLength???? : 0x28
?? +0x008 FormCode???????? : 0 ''
?? +0x009 NameLength?????? : 0 ''
?? +0x00a NameOffset?????? : 0
?? +0x00c Flags??????????? : 0
?? +0x00e Instance???????? : 9
?? +0x010 Form???????????? : __unnamed
0: kd> dt Ntfs!_ATTRIBUTE_RECORD_HEADER? 0xc1241438+48+60+28
?? +0x000 TypeCode???????? : 0x50
?? +0x004 RecordLength???? : 0x48
?? +0x008 FormCode???????? : 0x1 ''
?? +0x009 NameLength?????? : 0 ''
?? +0x00a NameOffset?????? : 0x40
?? +0x00c Flags??????????? : 0
?? +0x00e Instance???????? : 2
?? +0x010 Form???????????? : __unnamed
0: kd> dt Ntfs!_ATTRIBUTE_RECORD_HEADER? 0xc1241438+48+60+28+48
?? +0x000 TypeCode???????? : 0x90
?? +0x004 RecordLength???? : 0xe0
?? +0x008 FormCode???????? : 0 ''
?? +0x009 NameLength?????? : 0x4 ''
?? +0x00a NameOffset?????? : 0x18
?? +0x00c Flags??????????? : 0
?? +0x00e Instance???????? : 6
?? +0x010 Form???????????? : __unnamed