sfc_os!SfcQueueValidationRequest函数分析之sfc_os!IsFileInQueue

第一部分:

1: kd> kc
 #
00 sfc_os!SfcQueueValidationRequest
01 sfc_os!SfcWatchProtectedDirectoriesWorkerThread
02 kernel32!BaseThreadStart

1: kd> dv
         RegVal = 0x01129164
     ChangeType = 5
            vrd = 0x012bfef0
         Status = 0n1988337684
    vrdexisting = 0x012bffdc

    //
    // if we're in GUI-Setup, don't queue any validation requests
    //
    if (SFCDisable == SFC_DISABLE_SETUP) {
        return STATUS_SUCCESS;
    }

1: kd> x sfc_os!SFCDisable
768421b8          sfc_os!SFCDisable = 0


    vrd->NextValidTime = GetTickCount() + (1000*SFCStall);
    vrd->RegVal = RegVal;
    vrd->ChangeType = ChangeType;
    vrd->Signature = SFC_VRD_SIGNATURE;

1: kd> dx -id 0,0,ffffffff89ce3d88 -r1 ((sfc_os!_VALIDATION_REQUEST_DATA *)0x1fe0048)
((sfc_os!_VALIDATION_REQUEST_DATA *)0x1fe0048)                 : 0x1fe0048 [Type: _VALIDATION_REQUEST_DATA *]
    [+0x000] Entry            [Type: _LIST_ENTRY]
    [+0x008] Signature        : 0x69696969 [Type: unsigned long]
    [+0x010] ImageValData     [Type: _COMPLETE_VALIDATION_DATA]
    [+0x130] RegVal           : 0x1129164 [Type: _SFC_REGISTRY_VALUE *]
    [+0x134] SourceInfo       [Type: _SOURCE_INFO]
    [+0xd74] ChangeType       : 0x5 [Type: unsigned long]
    [+0xd78] CopyCompleted    : 0 [Type: int]
    [+0xd7c] Win32Error       : 0x0 [Type: unsigned long]
    [+0xd80] SyncOnly         : 0 [Type: int]
    [+0xd84] RetryCount       : 0x0 [Type: unsigned long]
    [+0xd88] Flags            : 0x0 [Type: unsigned long]
    [+0xd8c] NextValidTime    : 0xffd4b349 [Type: unsigned long]


1: kd> dx -id 0,0,ffffffff89ce3d88 -r1 ((sfc_os!_SFC_REGISTRY_VALUE *)0x1129164)  
((sfc_os!_SFC_REGISTRY_VALUE *)0x1129164)                 : 0x1129164 [Type: _SFC_REGISTRY_VALUE *]
    [+0x000] Entry            [Type: _LIST_ENTRY]
    [+0x008] FileName         : "pidgen.dll" [Type: _UNICODE_STRING]
    [+0x010] DirName          : "c:\windows\system32" [Type: _UNICODE_STRING]
    [+0x018] FullPathName     : "c:\windows\system32\pidgen.dll" [Type: _UNICODE_STRING]
    [+0x020] InfName          : "" [Type: _UNICODE_STRING]
    [+0x028] SourceFileName   : "" [Type: _UNICODE_STRING]
    [+0x030] OriginalFileName [Type: unsigned short [128]]
    [+0x130] DirHandle        : 0x24 [Type: void *]
    [+0x134] pvWinSxsCookie   : 0x0 [Type: void *]
    [+0x138] dwWinSxsFlags    : 0x0 [Type: unsigned long]


 


第二部分:

1: kd> p
sfc_os!SfcQueueValidationRequest+0xb9:
001b:76838ee2 e860e7ffff      call    sfc_os!IsFileInQueue (76837647)
1: kd> t
sfc_os!IsFileInQueue:
001b:76837647 55              push    ebp
1: kd> kc
 #
00 sfc_os!IsFileInQueue
01 sfc_os!SfcQueueValidationRequest
02 sfc_os!SfcWatchProtectedDirectoriesWorkerThread
03 kernel32!BaseThreadStart

1: kd> x sfc_os!SfcErrorQueue
76840e80          sfc_os!SfcErrorQueue = struct _LIST_ENTRY [ 0x12380d0 - 0x12380d0 ]
1: kd> dx -id 0,0,ffffffff89ce3d88 -r1 (*((sfc_os!_LIST_ENTRY *)0x76840e80))
(*((sfc_os!_LIST_ENTRY *)0x76840e80))                 [Type: _LIST_ENTRY]
    [+0x000] Flink            : 0x12380d0 [Type: _LIST_ENTRY *]
    [+0x004] Blink            : 0x12380d0 [Type: _LIST_ENTRY *]
1: kd> dt VALIDATION_REQUEST_DATA 0x12380d0
sfc_os!VALIDATION_REQUEST_DATA
   +0x000 Entry            : _LIST_ENTRY [ 0x76840e80 - 0x76840e80 ]
   +0x008 Signature        : 0x69696969
   +0x010 ImageValData     : _COMPLETE_VALIDATION_DATA
   +0x130 RegVal           : 0x01129164 _SFC_REGISTRY_VALUE        RegVal           : 0x01129164
   +0x134 SourceInfo       : _SOURCE_INFO
   +0xd74 ChangeType       : 3
   +0xd78 CopyCompleted    : 0n1
   +0xd7c Win32Error       : 0
   +0xd80 SyncOnly         : 0n0
   +0xd84 RetryCount       : 0
   +0xd88 Flags            : 1
   +0xd8c NextValidTime    : 0xffd2d959

        if (RegVal == vrd->RegVal) {
            return vrd;        //VALIDATION_REQUEST_DATA 0x12380d0
        }

        if (!vrdexisting || (vrdexisting->Flags & VRD_FLAG_REQUEST_PROCESSED) ) {

            DebugPrint1( LVL_VERBOSE,
                        L"Inserting [%ws] into error queue for validation",
                        RegVal->FullPathName.Buffer );

            InsertTailList( &SfcErrorQueue, &vrd->Entry );
            ErrorQueueCount += 1;

            //
            // do this to avoid free later on
            //
            vrdexisting = NULL;

        }


第三部分:


1: kd> p
sfc_os!IsFileInQueue+0x27:
001b:7683766e 5d              pop     ebp
1: kd> r
eax=012380d0


D:\srv03rtm\base\subsys\sm/sfc/dll/sfcp.h:471:#define VRD_FLAG_REQUEST_PROCESSED        0x00000001

+0xd88 Flags            : 1


1: kd> x sfc_os!ErrorQueueCount
76840e7c          sfc_os!ErrorQueueCount = 1


1: kd> x sfc_os!ErrorQueueCount
76840e7c          sfc_os!ErrorQueueCount = 2


1: kd> dx -id 0,0,ffffffff89ce3d88 -r1 (*((sfc_os!_LIST_ENTRY *)0x76840e80))
(*((sfc_os!_LIST_ENTRY *)0x76840e80))                 [Type: _LIST_ENTRY]
    [+0x000] Flink            : 0x12380d0 [Type: _LIST_ENTRY *]
    [+0x004] Blink            : 0x1fe0048 [Type: _LIST_ENTRY *]


1: kd> dt VALIDATION_REQUEST_DATA 0x1fe0048
sfc_os!VALIDATION_REQUEST_DATA
   +0x000 Entry            : _LIST_ENTRY [ 0x76840e80 - 0x12380d0 ]
   +0x008 Signature        : 0x69696969
   +0x010 ImageValData     : _COMPLETE_VALIDATION_DATA
   +0x130 RegVal           : 0x01129164 _SFC_REGISTRY_VALUE
   +0x134 SourceInfo       : _SOURCE_INFO
   +0xd74 ChangeType       : 5                //+0xd74 ChangeType       : 5
   +0xd78 CopyCompleted    : 0n0
   +0xd7c Win32Error       : 0
   +0xd80 SyncOnly         : 0n0
   +0xd84 RetryCount       : 0
   +0xd88 Flags            : 0                //+0xd88 Flags            : 0    
   +0xd8c NextValidTime    : 0xffd4b349

1: kd> dt VALIDATION_REQUEST_DATA 0x12380d0
sfc_os!VALIDATION_REQUEST_DATA
   +0x000 Entry            : _LIST_ENTRY [ 0x76840e80 - 0x76840e80 ]
   +0x008 Signature        : 0x69696969
   +0x010 ImageValData     : _COMPLETE_VALIDATION_DATA
   +0x130 RegVal           : 0x01129164 _SFC_REGISTRY_VALUE        RegVal           : 0x01129164
   +0x134 SourceInfo       : _SOURCE_INFO
   +0xd74 ChangeType       : 3                //+0xd74 ChangeType       : 3
   +0xd78 CopyCompleted    : 0n1
   +0xd7c Win32Error       : 0
   +0xd80 SyncOnly         : 0n0
   +0xd84 RetryCount       : 0
   +0xd88 Flags            : 1                //+0xd88 Flags            : 1
   +0xd8c NextValidTime    : 0xffd2d959


第四部分:


1: kd> x sfc_os!hErrorThread
76840e88          sfc_os!hErrorThread = 0x00000b4c

1: kd> !handle b4c

PROCESS 89ce3d88  SessionId: 0  Cid: 01d4    Peb: 7ffdf000  ParentCid: 018c
    DirBase: 7c1c9000  ObjectTable: e136a268  HandleCount: 564.
    Image: winlogon.exe

Handle table at e136a268 with 564 entries in use

0b4c: Object: 892d6da0  GrantedAccess: 001f03ff Entry: e1792698
Object: 892d6da0  Type: (89dd5710) Thread
    ObjectHeader: 892d6d88 (old version)
        HandleCount: 3  PointerCount: 5

       THREAD 892d6da0  Cid 01d4.03bc  Teb: 7ffdc000 Win32Thread: e10ecea8 RUNNING on processor 0
        IRP List:
            899d7838: (0006,01d8) Flags: 00000884  Mdl: 00000000
            8936dcd8: (0006,0190) Flags: 00000000  Mdl: 00000000
        Not impersonating
        DeviceMap                 e10026b8
        Owning Process            89ce3d88       Image:         winlogon.exe
        Attached Process          N/A            Image:         N/A
        Wait Start TickCount      274695963      Ticks: 0
        Context Switch Count      441            IdealProcessor: 0                 LargeStack
        UserTime                  00:00:00.156
        KernelTime                00:00:00.156
        Win32 Start Address sfc_os!SfcQueueValidationThread (0x7683856f)
        Stack Init b9af1000 Current b9af0924 Base b9af1000 Limit b9aec000 Call 00000000
        Priority 14 BasePriority 13 PriorityDecrement 0 IoPriority 0 PagePriority 0
        ChildEBP RetAddr  
        b9af06f4 80aed4e8 nt!ExpAssertResource+0x71 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\ex\resource.c @ 2913]
        b9af0718 f713659e nt!ExReleaseResourceLite+0x18 (FPO: [Non-Fpo]) (CONV: fastcall) [d:\srv03rtm\base\ntos\ex\resource.c @ 1410]
        b9af071c f7135f80 Ntfs!NtfsCommonCreate+0x1da0 (FPO: [SEH]) (CONV: stdcall) [d:\srv03rtm\base\fs\ntfs\create.c @ 4202]
        b9af0908 f712f53e Ntfs!NtfsCommonCreate+0x1782 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\fs\ntfs\create.c @ 4210]
        b9af0a08 80a2675c Ntfs!NtfsFsdCreate+0x1f6 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\fs\ntfs\create.c @ 904]
        b9af0a24 80c75af1 nt!IofCallDriver+0x62 (FPO: [Non-Fpo]) (CONV: fastcall) [d:\srv03rtm\base\ntos\io\iomgr\iosubs.c @ 2237]
        b9af0b20 80c7607c nt!IopParseDevice+0xd7d (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\io\iomgr\parse.c @ 1317]
        b9af0b58 80d1cb2c nt!IopParseFile+0x78 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\io\iomgr\parse.c @ 2014]
        b9af0bd4 80d16798 nt!ObpLookupObjectName+0x14a (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\ob\obdir.c @ 1834]
        b9af0c28 80c61f73 nt!ObOpenObjectByName+0x13e (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\ob\obref.c @ 767]
        b9af0ca4 80c63967 nt!IopCreateFile+0x44d (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\io\iomgr\iosubs.c @ 5494]
        b9af0cf0 80c6892f nt!IoCreateFile+0x73 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\io\iomgr\iosubs.c @ 4788]
        b9af0d38 80afbcb2 nt!NtOpenFile+0x57 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\io\iomgr\open.c @ 95]
        b9af0d38 7ffe0304 nt!_KiSystemService+0x13f (FPO: [0,3] TrapFrame @ b9af0d64) (CONV: cdecl) [d:\srv03rtm\base\ntos\ke\i386\trap.asm @ 1328]
        007cf674 77f2f1d8 SharedUserData!SystemCallStub+0x4 (FPO: [0,0,0])
        007cf678 7682f536 ntdll!NtOpenFile+0xc (FPO: [6,0,0]) [d:\srv03rtm\base\ntdll\daytona\obj\i386\usrstubs.asm @ 1099]
        007cf6c4 76837870 sfc_os!SfcOpenFile+0x8c (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\subsys\sm\sfc\dll\fileio.c @ 87]
        007cf6ec 7683297d sfc_os!SfcGetValidationData+0x8b (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\subsys\sm\sfc\dll\validate.c @ 2126]
        007cf724 76838b81 sfc_os!SfcRestoreFromCache+0x2fa (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\subsys\sm\sfc\dll\restore.c @ 1483]
        007cffb8 77e41be7 sfc_os!SfcQueueValidationThread+0x612 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\subsys\sm\sfc\dll\validate.c @ 1702]
        007cffec 00000000 kernel32!BaseThreadStart+0x34 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\win32\client\support.c @ 533]

第五部分:changtype=3

Breakpoint 4 hit
sfc_os!SfcQueueValidationRequest:
001b:76838e29 6a1c            push    1Ch
1: kd> dv
         RegVal = 0x01129164
     ChangeType = 3
            vrd = 0x012bfef0
         Status = 0n1988337684
    vrdexisting = 0x012bffdc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值