IopSetLockOperationProcess
void __fastcall IopSetLockOperationProcess(__int64 a1, __int64 a2, char a3){
CHAR *v3;
char v4;
INT64 v8;
int v9;
CHAR *Pool_0;
UINT64 v11;
_QWORD *v12;
__int64 v13;
unsigned __int8 v14;
unsigned __int64 v15;
_QWORD *v16;
_QWORD *FileObjectExtension;
FileObjectExtension = 0i64;
v3 = 0i64;
v4 = 0;
if( a2 )
{
if( a3 )
{
FileObjectExtension = IopGetFileObjectExtension((_FILE_OBJECT *)a1, FoExtTypeInternal, 0i64);
v12 = FileObjectExtension;
if( !FileObjectExtension )
return;
}
else
{
IopGetSetSpecificExtension(
(_FILE_OBJECT *)a1,
FoExtTypeInternal,
0x20ui64,
1u,
(PVOID *)&FileObjectExtension,
0i64);
if( v9 < 0 )
return;
Pool_0 = IopVerifierExAllocatePool_0(v8, 0x10ui64);
v12 = FileObjectExtension;
v3 = Pool_0;
}
KeAcquireSpinLockRaiseToDpc((UINT64 *)(a1 + 184), v11);
v13 = v12[2];
v15 = v14;
if( v13 )
{
v16 = (_QWORD *)v12[2];
while( v16[1] != a2 )
{
v16 = (_QWORD *)*v16;
if( !v16 )
goto LABEL_15;
}
v4 = 1;
}
else
{
LABEL_15:
if( !a3 && v3 )
{
*(_QWORD *)v3 = v13;
v12[2] = v3;
*((_QWORD *)v3 + 1) = a2;
}
}
KxReleaseSpinLock((UINT64 *)(a1 + 184));
__writecr8(v15);
if( v4 )
{
if( v3 )
ExFreePoolWithTag(v3, 0);
}
}
}Referenced by:
IopCloseFile
NtLockFile