欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > nt!CcGetVacbMiss函数分析之设置好nt!_VACB然后调用函数nt!SetVacb

nt!CcGetVacbMiss函数分析之设置好nt!_VACB然后调用函数nt!SetVacb

2025/10/23 20:07:29 来源:https://blog.csdn.net/sitelist/article/details/148284922  浏览:    关键词:nt!CcGetVacbMiss函数分析之设置好nt!_VACB然后调用函数nt!SetVacb

第一部分:MmMapViewInSystemCache函数返回

        Status = MmMapViewInSystemCache (SharedCacheMap->Section,
                                         &Vacb->BaseAddress,
                                         &NormalOffset,
                                         &MappedLength.LowPart);


NTSTATUS
MmMapViewInSystemCache (
    IN PVOID SectionToMap,
    OUT PVOID *CapturedBase,
    IN OUT PLARGE_INTEGER SectionOffset,
    IN OUT PULONG CapturedViewSize
    )

第二部分:(ntkrnlmp!_VACB *)0x89988000结构中的BaseAddress      : 0xc1080000

1: kd> p
nt!MmMapViewInSystemCache+0x51e:
80aaf210 c21000          ret     10h
1: kd> p
nt!CcGetVacbMiss+0x300:
80a1a49e 8945d4          mov     dword ptr [ebp-2Ch],eax
1: kd> dv
   SharedCacheMap = 0x89901cc8
       FileOffset = {0}
          OldIrql = 0xf78d69bf ""
      PageIsDirty = 0x89901cc8
OldSharedCacheMap = 0xffffffff
     NormalOffset = {0}
       ActiveVacb = 0x00000000
             Vacb = 0x89988000
           Status = 0n-141727208
       ActivePage = 0x30
     MappedLength = {262144}
1: kd> dx -r1 ((ntkrnlmp!_VACB *)0x89988000)
((ntkrnlmp!_VACB *)0x89988000)                 : 0x89988000 [Type: _VACB *]
    [+0x000] BaseAddress      : 0xc1080000 [Type: void *]                    BaseAddress      : 0xc1080000
    [+0x004] SharedCacheMap   : 0x0 [Type: _SHARED_CACHE_MAP *]
    [+0x008] Overlay          [Type: __unnamed]
    [+0x010] LruList          [Type: _LIST_ENTRY]

第三部分:

    //
    //  Finish filling in the Vacb, and store its address in the array in
    //  the Shared Cache Map.  (We have to rewrite the ActiveCount
    //  since it is overlaid.)  To do this we must reacquire the
    //  spin lock one more time.  Note we have to check for the unusual
    //  case that someone beat us to mapping this view, since we had to
    //  drop the spin lock.
    //

    if ((TempVacb = GetVacb( SharedCacheMap, NormalOffset )) == NULL) {

        Vacb->SharedCacheMap = SharedCacheMap;
        Vacb->Overlay.FileOffset = NormalOffset;
        Vacb->Overlay.ActiveCount = 1;

        SetVacb( SharedCacheMap, NormalOffset, Vacb );

#define GetVacb(SCM,OFF) (                                                                \
    ((SCM)->SectionSize.QuadPart > VACB_SIZE_OF_FIRST_LEVEL) ?                            \
    CcGetVacbLargeOffset((SCM),(OFF).QuadPart) :                                          \
    (SCM)->Vacbs[(OFF).LowPart >> VACB_OFFSET_SHIFT]                                      \
)

dv

     NormalOffset = {0}

1: kd> p
nt!CcGetVacbMiss+0x4cb:
80a1a669 8b1c81          mov     ebx,dword ptr [ecx+eax*4]
1: kd> r
eax=00000000 ebx=00000000 ecx=89901cf8


第四部分: ((TempVacb = GetVacb( SharedCacheMap, NormalOffset )) == NULL)


1: kd> dd 89901cf8
89901cf8  00000000 00000000 00000000 00000000
89901d08  89901cf8 899c41b0 00000000 00000000
89901d18  00000000 00000000 00000000 00000001
89901d28  00000000 80b1cbd0 80b1cbd0 00000204
89901d38  00000000 00000000 e127a740 00000000
89901d48  00000000 00000000 00000000 00000000
89901d58  f7169a2c 898ffa10 89901dec 89901dec
89901d68  00000000 f718f6ec 00000000 00000000

1: kd> p
nt!CcGetVacbMiss+0x4ce:
80a1a66c 85db            test    ebx,ebx
1: kd> r
eax=00000000 ebx=00000000 ecx=89901cf8 edx=00000000 esi=89988000 edi=89901cc8
eip=80a1a66c esp=f78d6948 ebp=f78d6994 iopl=0         nv up ei pl zr na pe nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00000246
nt!CcGetVacbMiss+0x4ce:
80a1a66c 85db            test    ebx,ebx
1: kd> p
nt!CcGetVacbMiss+0x4d0:
80a1a66e 7527            jne     nt!CcGetVacbMiss+0x4f9 (80a1a697)

89901cf8还没有被设置现在设置Vacb!!!


第五部分:

    if ((TempVacb = GetVacb( SharedCacheMap, NormalOffset )) == NULL) {

        Vacb->SharedCacheMap = SharedCacheMap;
        Vacb->Overlay.FileOffset = NormalOffset;
        Vacb->Overlay.ActiveCount = 1;

        SetVacb( SharedCacheMap, NormalOffset, Vacb );


1: kd> dx -r1 ((ntkrnlmp!_VACB *)0x89988000)
((ntkrnlmp!_VACB *)0x89988000)                 : 0x89988000 [Type: _VACB *]
    [+0x000] BaseAddress      : 0xc1080000 [Type: void *]
    [+0x004] SharedCacheMap   : 0x89901cc8 [Type: _SHARED_CACHE_MAP *]
    [+0x008] Overlay          [Type: __unnamed]
    [+0x010] LruList          [Type: _LIST_ENTRY]


   +0x008 Overlay          : __unnamed
      +0x000 FileOffset       : _LARGE_INTEGER
         +0x000 LowPart          : Uint4B
         +0x004 HighPart         : Int4B
         +0x000 u                : __unnamed
         +0x000 QuadPart         : Int8B
      +0x000 ActiveCount      : Uint2B


1: kd> dd 0x89988000
89988000  c1080000 89901cc8 00000001 00000000
89988010  80b1cb60 80b1cb60


第六部分:

1: kd> t
Breakpoint 2 hit
nt!SetVacb:
80a194a2 55              push    ebp
1: kd> kc
 #
00 nt!SetVacb
01 nt!CcGetVacbMiss
02 nt!CcGetVirtualAddress
03 nt!CcMapData
04 Ntfs!NtfsMapStream
05 Ntfs!NtfsReadBootSector
06 Ntfs!NtfsMountVolume
07 Ntfs!NtfsCommonFileSystemControl
08 Ntfs!NtfsFspDispatch
09 nt!ExpWorkerThread
0a nt!PspSystemThreadStartup
0b nt!KiThreadStartup
1: kd> dv
 SharedCacheMap = 0x89901cc8
         Offset = {0}
           Vacb = 0x89988000

    } else if (Vacb < VACB_SPECIAL_FIRST_VALID) {
        SharedCacheMap->Vacbs[Offset.LowPart >> VACB_OFFSET_SHIFT] = Vacb;
    }

#define VACB_OFFSET_SHIFT                (18)


第七部分:结果!!!

1: kd> dd 0x89901cf8
89901cf8  89988000
1: kd> dt nt!_vacb 89988000
   +0x000 BaseAddress      : 0xc1080000 Void
   +0x004 SharedCacheMap   : 0x89901cc8 _SHARED_CACHE_MAP
   +0x008 Overlay          : __unnamed
   +0x010 LruList          : _LIST_ENTRY [ 0x80b1cb60 - 0x80b1cb60 ]

原来为0
1: kd> dd 89901cf8
89901cf8  00000000 00000000 00000000 00000000

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词