CcPinFileData
__int64 __fastcall CcPinFileData(
__int64 a1,
__int64 *a2,
unsigned int a3,
char a4,
char a5,
__int64 a6,
_QWORD *a7,
__int64 *a8,
_QWORD *a9){
char v10;
__int64 v11;
_SHARED_CACHE_MAP *v12;
__int64 *v13;
__int64 v14;
_FAST_MUTEX *p_BcbLock;
_ETHREAD *CurrentThread;
unsigned __int8 v17;
__int64 v18;
int SessionId;
bool v20;
unsigned __int8 CurrentIrql;
__int64 v22;
unsigned __int64 v23;
unsigned int v24;
__int64 v25;
__int64 v26;
__int64 QuadPart;
unsigned __int64 v28;
_VACB **p_BcbList;
char *v30;
__int16 v31;
unsigned int v32;
unsigned int v33;
char v34;
__int64 v35;
__int64 *v36;
_FAST_MUTEX *v37;
unsigned __int64 OldIrql_low;
unsigned __int32 v39;
ERESOURCE *v40;
__int16 v41;
__int64 v42;
_ETHREAD *v43;
NTSTATUS v44;
unsigned __int64 v45;
char *v46;
unsigned int v47;
_ETHREAD *v48;
unsigned __int8 v49;
__int64 v50;
__int64 v51;
int v52;
__int16 v53;
unsigned __int8 v54;
unsigned __int64 v55;
unsigned __int32 v56;
__int64 v57;
struct _KEVENT *v58;
unsigned int v59;
UINT64 v60;
int v61;
ERESOURCE *v62;
int v63;
__int64 v64;
unsigned int v65;
__int16 v66;
unsigned int v67;
unsigned int v68;
__int64 v69;
ERESOURCE *v70;
unsigned __int8 v71;
_ETHREAD *v72;
char v73;
__int64 v74;
__int64 v76;
struct _KEVENT *v77;
char v78;
ULONG_PTR BugCheckParameter4;
UINT64 PerformingReadAhead;
unsigned __int8 v81;
int v82;
char *P;
_VACB *Vacb;
UINT64 ReceivedLength;
__int64 v86;
__int64 v87;
int v88;
unsigned int v89;
__int64 v90;
char *v91;
int v92;
unsigned int v93;
int v94;
int v95;
int v96;
char *v97;
__int64 v98;
__int64 v99;
_SHARED_CACHE_MAP *v100;
int v101;
_ETHREAD *v102;
_ETHREAD *v103;
UINT8 ReturnResult;
__int64 *v105;
unsigned int v106;
char v107;
v107 = a4;
v106 = a3;
v105 = a2;
v10 = a6;
v11 = 0i64;
v90 = 0i64;
ReceivedLength = 0i64;
Vacb = 0i64;
v12 = *(_SHARED_CACHE_MAP **)(*(_QWORD *)(a1 + 40) + 8i64);
v100 = v12;
if( *a2 + a3 > v12->SectionSize.QuadPart )
KeBugCheckEx(0x34u, 0x128ui64, 0xFFFFFFFFC0000420ui64, 0i64, 0i64);
*a7 = 0i64;
v13 = a8;
*a8 = 0i64;
if( (v10 & 4) != 0 )
{
LODWORD(ReceivedLength) = 0x40000 - (*(_DWORD *)a2 & 0x3FFFF);
CcReferenceFileOffset(v12, *(_LARGE_INTEGER *)a2);
}
else
{
LODWORD(PerformingReadAhead) = 0;
LODWORD(BugCheckParameter4) = (v10 & 0x40) != 0;
LODWORD(v14) = CcGetVirtualAddress(
v12,
*(_LARGE_INTEGER *)a2,
&Vacb,
&ReceivedLength,
BugCheckParameter4,
PerformingReadAhead);
*v13 = v14;
}
p_BcbLock = &v12->BcbLock;
v93 = 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 243);
if( ++*((_BYTE *)CurrentThread + 794) != 1 )
KeBugCheckEx(0x192u, (ULONG_PTR)CurrentThread, (ULONG_PTR)&v12->BcbLock, KeGetCurrentIrql(), 0i64);
v92 = 0;
v17 = *((_BYTE *)CurrentThread + 792);
if( v17 )
goto LABEL_6;
if( *((_BYTE *)CurrentThread + 870) )
{
v78 = *((_BYTE *)CurrentThread + 870);
*((_BYTE *)CurrentThread + 870) = 0;
v17 = *((_BYTE *)CurrentThread + 792) | v78;
LABEL_6:
_BitScanForward((unsigned int *)&v18, v17);
v92 = v18;
*((_BYTE *)CurrentThread + 792) = v17 & ~(1 << v18);
v11 = *((_QWORD *)CurrentThread + 100) + 96 * v18;
}
if( v11 )
{
if( (unsigned __int64)p_BcbLock >= 0xFFFF800000000000ui64
&& MiState[(((unsigned __int64)p_BcbLock >> 39) & 0x1FF) + 12296] == 1 )
{
SessionId = MmGetSessionIdEx(*((_QWORD *)CurrentThread + 23));
}
else
{
SessionId = -1;
}
*(_DWORD *)(v11 + 40) = SessionId;
*(_QWORD *)(v11 + 32) = (unsigned __int64)p_BcbLock & 0x7FFFFFFFFFFFFFFCi64;
}
else
{
_interlockedbittestandset((volatile signed __int32 *)CurrentThread + 30, 0x10u);
}
--*((_BYTE *)CurrentThread + 794);
KiAbThreadRemoveBoosts((ULONG_PTR)CurrentThread, (__int64)&v12->BcbLock, &v93);
v20 = (*((_WORD *)CurrentThread + 243))++ == 0xFFFF;
if( v20 && *((_ETHREAD **)CurrentThread + 19) != (_ETHREAD *)((char *)CurrentThread + 152) )
KiCheckForKernelApcDelivery();
CurrentIrql = KeGetCurrentIrql();
__writecr8(1ui64);
if( !_interlockedbittestandreset(&p_BcbLock->Count, 0) )
ExpAcquireFastMutexContended(&v12->BcbLock, (PVOID)v11);
if( v11 )
*(_BYTE *)(v11 + 26) |= 1u;
v12->BcbLock.Owner = KeGetCurrentThread();
v12->BcbLock.OldIrql = CurrentIrql;
v82 = 1;
v87 = 0i64;
v86 = 0i64;
v22 = *a2;
v23 = HIDWORD(*a2);
v24 = v106;
v25 = *a2 + v106;
v90 = v25;
v97 = 0i64;
v26 = v22 + 0x80000;
QuadPart = v12->SectionSize.QuadPart;
v28 = HIDWORD(v22);
if( QuadPart <= 0x200000 || (LODWORD(v28) = v23, (v12->Flags & 0x200) == 0) )
{
LODWORD(v23) = v28;
goto LABEL_113;
}
if( QuadPart <= 0x2000000 )
{
if( v26 < QuadPart )
{
p_BcbList = &v12->Vacbs[2 * (v26 >> 19)] + ((unsigned __int64)(unsigned int)QuadPart >> 18);
goto LABEL_23;
}
LABEL_113:
p_BcbList = (_VACB **)&v12->BcbList;
goto LABEL_23;
}
p_BcbList = (_VACB **)CcGetBcbListHeadLargeOffset((INT64)v12, v22 + 0x80000, 1);
v24 = v106;
LABEL_23:
v30 = (char *)*p_BcbList - 16;
v97 = v30;
if( (_DWORD)v23 || (v31 = *(_WORD *)v30, *(_WORD *)v30 != 765) || *((_DWORD *)v30 + 9) )
{
while( *(_WORD *)v30 == 765 && v22 < *((_QWORD *)v30 + 4) )
{
v74 = *((_QWORD *)v30 + 1);
if( v22 >= v74 )
{
v34 = 1;
goto LABEL_34;
}
if( v25 >= v74 )
v25 = *((_QWORD *)v30 + 1);
v90 = v25;
v30 = (char *)(*((_QWORD *)v30 + 2) - 16i64);
v97 = v30;
}
}
else
{
v32 = v90;
while( v31 == 765 && (unsigned int)v22 < *((_DWORD *)v30 + 8) )
{
v33 = *((_DWORD *)v30 + 2);
if( (unsigned int)v22 >= v33 )
{
v34 = 1;
goto LABEL_34;
}
if( v32 >= v33 )
{
v32 = *((_DWORD *)v30 + 2);
LODWORD(v90) = v32;
v25 = v90;
}
v30 = (char *)(*((_QWORD *)v30 + 2) - 16i64);
v97 = v30;
v31 = *(_WORD *)v30;
}
}
v34 = 0;
LABEL_34:
P = v30;
if( !v34 )
{
if( (v10 & 8) != 0 )
{
v30 = 0i64;
P = 0i64;
v81 = 0;
v36 = a8;
goto LABEL_72;
}
v87 = v22;
v64 = v25 - v22;
v63 = v22 & 0xFFF;
LODWORD(v64) = v63 + v64;
v86 = v64;
v65 = v63 + ReceivedLength;
LODWORD(ReceivedLength) = v63 + ReceivedLength;
if( (v107 || (v12->Flags & 4) != 0) && (v66 = v22, !a5) )
{
v67 = HIDWORD(ReceivedLength);
}
else
{
v66 = v22;
v67 = 2;
HIDWORD(ReceivedLength) = 2;
if( !v63 )
{
if( v24 >= 0x1000 )
v67 = 3;
HIDWORD(ReceivedLength) = v67;
}
if( (v64 & 0xFFF) == 0 )
{
v67 |= 4u;
HIDWORD(ReceivedLength) = v67;
}
}
if( (v12->Flags & 0x200) == 0 )
v107 = 1;
v68 = (v64 + 4095) & 0xFFFFF000;
LODWORD(v86) = v68;
*a8 -= v66 & 0xFFF;
LODWORD(v87) = v87 & 0xFFFFF000;
if( v68 > v65 )
{
v68 = v65;
LODWORD(v86) = v65;
}
v69 = CcAllocateInitializeBcb(v12, v30, &v87, &v86);
v30 = (char *)v69;
P = (char *)v69;
if( (v10 & 1) != 0 )
{
if( !v69 )
{
KeReleaseGuardedMutex(&v12->BcbLock);
RtlRaiseStatus(-1073741670);
}
if( !v107 )
{
v70 = (ERESOURCE *)(v69 + 72);
if( (v10 & 2) != 0 )
{
if( !ExAcquireResourceExclusiveLite(v70, 0) )
KeBugCheckEx(0x34u, 0x201F6ui64, (ULONG_PTR)v30, 0i64, 0i64);
}
else if( !ExAcquireSharedStarveExclusive(v70, 0) )
{
KeBugCheckEx(0x34u, 0x201FDui64, (ULONG_PTR)v30, 0i64, 0i64);
}
}
KeReleaseGuardedMutex(&v12->BcbLock);
v82 = 0;
if( (v10 & 4) == 0 )
{
CcMapAndRead(v68, v67, 1u, (VOID *)*a8);
ExAcquireFastMutex(&v12->BcbLock);
if( !*((_QWORD *)v30 + 23) )
{
*((_QWORD *)v30 + 23) = *a8;
*((_QWORD *)v30 + 7) = Vacb;
Vacb = 0i64;
}
KeReleaseGuardedMutex(&v12->BcbLock);
*a8 = *((_QWORD *)v30 + 23) + (unsigned int)(*(_DWORD *)a2 - *((_DWORD *)v30 + 2));
}
v36 = a8;
goto LABEL_71;
}
if( !v69 )
{
v81 = 0;
v36 = a8;
goto LABEL_72;
}
if( !v107 && !ExAcquireSharedStarveExclusive((ERESOURCE *)(v69 + 72), 0) )
KeBugCheckEx(0x34u, 0x2025Dui64, (ULONG_PTR)v30, 0i64, 0i64);
KeReleaseGuardedMutex(&v12->BcbLock);
v82 = 0;
if( !CcMapAndRead(v68, v67, 0, (VOID *)*a8) )
{
v81 = 0;
v36 = a8;
goto LABEL_72;
}
ExAcquireFastMutex(&v12->BcbLock);
v36 = a8;
if( !*((_QWORD *)v30 + 23) )
{
*((_QWORD *)v30 + 23) = *a8;
*((_QWORD *)v30 + 7) = Vacb;
Vacb = 0i64;
}
goto LABEL_132;
}
if( (v12->Flags & 0x200) == 0 )
v107 = 1;
if( *((_QWORD *)v30 + 23) )
{
if( (v10 & 1) != 0 )
{
++*((_DWORD *)v30 + 16);
KeReleaseGuardedMutex(&v12->BcbLock);
v82 = 0;
if( !v107 )
{
v62 = (ERESOURCE *)(v30 + 72);
if( (v10 & 2) != 0 )
ExAcquireResourceExclusiveLite(v62, 1u);
else
ExAcquireSharedStarveExclusive(v62, 1u);
}
}
else
{
if( !v107 && !ExAcquireSharedStarveExclusive((ERESOURCE *)(v30 + 72), 0) )
{
v30 = 0i64;
P = 0i64;
v81 = 0;
v36 = a8;
goto LABEL_72;
}
++*((_DWORD *)v30 + 16);
KeReleaseGuardedMutex(&v12->BcbLock);
v82 = 0;
}
v36 = a8;
*a8 = *((_QWORD *)v30 + 23) + (unsigned int)(*(_DWORD *)a2 - *((_DWORD *)v30 + 2));
goto LABEL_71;
}
v35 = (unsigned int)(v22 - *((_DWORD *)v30 + 2));
v36 = a8;
*a8 -= v35;
v87 = *((_QWORD *)v30 + 1);
v86 = *((unsigned int *)v30 + 1);
if( (v10 & 1) == 0 )
{
if( !v107 && !ExAcquireSharedStarveExclusive((ERESOURCE *)(v30 + 72), 0) )
{
v30 = 0i64;
P = 0i64;
v81 = 0;
goto LABEL_72;
}
++*((_DWORD *)v30 + 16);
KeReleaseGuardedMutex(&v12->BcbLock);
v82 = 0;
if( !CcMapAndRead(*((unsigned int *)v30 + 1), 0i64, 0, (VOID *)*v36) )
{
v81 = 0;
goto LABEL_72;
}
ExAcquireFastMutex(&v12->BcbLock);
if( !*((_QWORD *)v30 + 23) )
{
*((_QWORD *)v30 + 23) = *v36;
*((_QWORD *)v30 + 7) = Vacb;
Vacb = 0i64;
}
LABEL_132:
KeReleaseGuardedMutex(&v12->BcbLock);
*v36 = *((_QWORD *)v30 + 23) + (unsigned int)(*(_DWORD *)a2 - *((_DWORD *)v30 + 2));
goto LABEL_71;
}
++*((_DWORD *)v30 + 16);
v37 = &v12->BcbLock;
v12->BcbLock.Owner = 0i64;
OldIrql_low = LOBYTE(v12->BcbLock.OldIrql);
v39 = _InterlockedCompareExchange(&v12->BcbLock.Count, 1, 0);
if( v39 )
ExpReleaseFastMutexContended(&v12->BcbLock, v39);
__writecr8(OldIrql_low);
KeAbPostRelease(&v12->BcbLock);
v82 = 0;
if( !v107 )
{
v40 = (ERESOURCE *)(v30 + 72);
if( (v10 & 2) != 0 )
{
ExAcquireResourceExclusiveLite(v40, 1u);
}
else
{
if( (v40->Flag & 0x41) == 1 )
KeBugCheckEx(0x1C6u, 0xFui64, (ULONG_PTR)v40, 0i64, 0i64);
v41 = v40->Flag & 1;
if( v41 )
{
v71 = KeGetCurrentIrql();
v72 = (_ETHREAD *)KeGetCurrentThread();
if( v71 > 1u )
KeBugCheckEx(0x1C6u, 0i64, v71, 1ui64, 0i64);
if( (*((_BYTE *)v72 + 192) & 2) != 0 )
KeBugCheckEx(0x1C6u, 6ui64, 0i64, 0i64, 0i64);
if( !v71 && (*((_DWORD *)v72 + 29) & 0x400) == 0 && !*((_DWORD *)v72 + 121) )
KeBugCheckEx(0x1C6u, 7ui64, 0i64, 0i64, 0i64);
}
if( v41 )
ExpFastResourceLegacyAcquireSharedStarveExclusive(v40);
else
ExpAcquireSharedStarveExclusive(v40, 1);
}
}
if( (v10 & 4) == 0 )
{
v42 = *a8;
v43 = (_ETHREAD *)KeGetCurrentThread();
v102 = v43;
v94 = 0;
v101 = 0;
v44 = 0;
v95 = 0;
ReturnResult = 1;
v45 = ((v42 & 0xFFF) + (unsigned __int64)(unsigned int)v86 + 4095) >> 12;
v88 = v45;
v46 = (char *)(v42 & 0xFFFFFFFFFFFFF000ui64);
v91 = v46;
v47 = *((unsigned __int8 *)v43 + 1308) + 4 * *((_DWORD *)v43 + 322);
while( (_DWORD)v45 )
{
*((_BYTE *)v43 + 1308) = 1;
v59 = v45 - 1;
if( (unsigned int)(v45 - 1) > *((_DWORD *)v43 + 322) )
{
if( v59 > 0xF )
v59 = 15;
*((_DWORD *)v43 + 322) = v59;
}
v94 = 0;
v60 = (unsigned int)((_DWORD)v45 << 12);
v91 = (char *)(unsigned int)v60;
MmCheckCachedPageStates(v46, v60, 0i64, &ReturnResult);
v44 = v61;
v95 = v61;
if( v61 < 0 )
break;
v46 = &v46[(_QWORD)v91];
v91 = v46;
LODWORD(v45) = 0;
v88 = 0;
}
*((_BYTE *)v43 + 1308) = v47 & 3;
*((_DWORD *)v43 + 322) = v47 >> 2;
if( v44 < 0 )
RtlRaiseStatus(v44);
v99 = 0i64;
v89 = 0;
v48 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v48 + 243);
if( ++*((_BYTE *)v48 + 794) != 1 )
KeBugCheckEx(0x192u, (ULONG_PTR)v48, (ULONG_PTR)&v12->BcbLock, KeGetCurrentIrql(), 0i64);
v99 = 0i64;
v98 = 0i64;
v96 = 0;
v49 = *((_BYTE *)v48 + 792);
if( !v49 )
{
if( !*((_BYTE *)v48 + 870) )
{
v51 = 0i64;
v98 = 0i64;
goto LABEL_54;
}
v73 = *((_BYTE *)v48 + 870);
*((_BYTE *)v48 + 870) = 0;
*((_BYTE *)v48 + 792) |= v73;
v49 = *((_BYTE *)v48 + 792);
}
_BitScanForward((unsigned int *)&v50, v49);
v96 = v50;
*((_BYTE *)v48 + 792) = v49 & ~(1 << v50);
v51 = *((_QWORD *)v48 + 100) + 96 * v50;
v98 = v51;
LABEL_54:
v99 = v51;
if( v51 )
{
if( (unsigned __int64)v37 >= 0xFFFF800000000000ui64
&& MiState[(((unsigned __int64)v37 >> 39) & 0x1FF) + 12296] == 1 )
{
v52 = MmGetSessionIdEx(*((_QWORD *)v48 + 23));
}
else
{
v52 = -1;
}
*(_DWORD *)(v51 + 40) = v52;
*(_QWORD *)(v51 + 32) = (unsigned __int64)v37 & 0x7FFFFFFFFFFFFFFCi64;
}
else
{
_interlockedbittestandset((volatile signed __int32 *)v48 + 30, 0x10u);
}
--*((_BYTE *)v48 + 794);
KiAbThreadRemoveBoosts((ULONG_PTR)v48, (__int64)&v12->BcbLock, &v89);
v53 = *((_WORD *)v48 + 243);
*((_WORD *)v48 + 243) = v53 + 1;
if( v53 == -1 && *((_ETHREAD **)v48 + 19) != (_ETHREAD *)((char *)v48 + 152) )
KiCheckForKernelApcDelivery();
v54 = KeGetCurrentIrql();
__writecr8(1ui64);
if( !_interlockedbittestandreset(&v37->Count, 0) )
ExpAcquireFastMutexContended(&v12->BcbLock, (PVOID)v51);
if( v51 )
*(_BYTE *)(v51 + 26) |= 1u;
v103 = (_ETHREAD *)KeGetCurrentThread();
v12->BcbLock.Owner = v103;
v12->BcbLock.OldIrql = v54;
if( !*((_QWORD *)P + 23) )
{
*((_QWORD *)P + 23) = *a8;
*((_QWORD *)P + 7) = Vacb;
Vacb = 0i64;
}
v12->BcbLock.Owner = 0i64;
v55 = LOBYTE(v12->BcbLock.OldIrql);
v56 = _InterlockedCompareExchange(&v37->Count, 1, 0);
if( v56 )
ExpReleaseFastMutexContended(&v12->BcbLock, v56);
__writecr8(v55);
KeAbPostRelease(&v12->BcbLock);
v30 = P;
v36 = a8;
*a8 = *((_QWORD *)P + 23) + (unsigned int)(*(_DWORD *)a2 - *((_DWORD *)P + 2));
goto LABEL_71;
}
v30 = P;
v36 = a8;
LABEL_71:
v81 = 1;
LABEL_72:
if( (v10 & 6) == 6 && v30 && *((_QWORD *)v30 + 23) )
{
v57 = *(_QWORD *)(*((_QWORD *)v30 + 7) + 8i64);
if( !(unsigned __int16)_InterlockedDecrement((volatile signed __int32 *)(*((_QWORD *)v30 + 7) + 16i64)) )
{
v58 = *(struct _KEVENT **)(v57 + 184);
if( v58 )
KeSetEvent(v58, 0);
_InterlockedDecrement((volatile signed __int32 *)(v57 + 544));
}
*((_QWORD *)v30 + 23) = 0i64;
*((_QWORD *)v30 + 7) = 0i64;
v30 = P;
}
if( v82 )
KeReleaseGuardedMutex(&v12->BcbLock);
if( Vacb )
{
v76 = *((_QWORD *)Vacb + 1);
if( !(unsigned __int16)_InterlockedDecrement((volatile signed __int32 *)Vacb + 4) )
{
v77 = *(struct _KEVENT **)(v76 + 184);
if( v77 )
KeSetEvent(v77, 0);
_InterlockedDecrement((volatile signed __int32 *)(v76 + 544));
}
v30 = P;
}
if( (v10 & 4) != 0 )
CcDereferenceFileOffset((INT64)v12, *a2);
if( v81 )
{
*a7 = v30;
*a9 = *((_QWORD *)v30 + 4);
}
else
{
*v36 = 0i64;
if( v30 )
CcUnpinFileDataEx(v30, v107, 0);
}
return v81;
}Referenced by:
CcMapData
CcMapDataCommon
CcPinMappedData
CcPinRead
CcPreparePinWrite
CcZeroDataInCache