SPCallServerHandleFileUsnQuery
NTSTATUS __stdcall SPCallServerHandleFileUsnQuery(INT64 a1, VOID *a2, INT64 a3, INT64 a4){
VOID *v4;
VOID *v5;
int v6;
__int128 v7;
unsigned int *v9;
unsigned int *v10;
unsigned int i;
__int64 v12;
unsigned int *v13;
signed int v14;
VOID **v15;
unsigned int *v16;
unsigned int j;
__int64 v18;
unsigned int *v19;
VOID **v20;
unsigned int k;
unsigned int v22;
unsigned int *v23;
unsigned int v24;
VOID **v25;
unsigned int v26;
int *v27;
NTSTATUS v28;
_FILE_OBJECT *v29;
VOID **PoolWithTag;
VOID **v31;
unsigned int v32;
__int64 v33;
unsigned int v34;
unsigned __int64 m;
unsigned int v36;
VOID *v37;
VOID *v39;
__int64 v40;
unsigned int *v41;
unsigned int v42;
int v43;
unsigned int v44;
UINT64 OutputBufferLength;
UINT64 OutputBufferLengtha;
__int128 v47;
PVOID Object;
UINT64 RetOutputBufferSize;
LODWORD(RetOutputBufferSize) = a3;
Object = a2;
v4 = 0i64;
v5 = 0i64;
v6 = 0;
v7 = 0i64;
if( !a1 || !a4 )
return -1073741811;
v9 = *(unsigned int **)(a1 + 8);
if( v9 && *(_DWORD *)a1 > 3u )
{
v10 = *(unsigned int **)(a1 + 8);
for( i = 0; i < 3; ++i )
{
v12 = *v10;
v13 = v10 + 1;
if( v10 + 1 < v10 )
goto LABEL_7;
v10 = (unsigned int *)((char *)v13 + v12);
if( (unsigned int *)((char *)v13 + v12) < v13 )
goto LABEL_7;
}
v22 = *v10;
v23 = v10 + 1;
if( v10 + 1 < v10 )
{
LABEL_7:
v14 = -1073741675;
goto LABEL_12;
}
v15 = 0i64;
if( v22 )
v15 = (VOID **)v23;
v14 = 0;
if( v22 != 8 )
return -1073741789;
v4 = *v15;
}
else
{
v14 = -1073741811;
}
LABEL_12:
if( v14 < 0 )
return v14;
if( v9 && *(_DWORD *)a1 > 4u )
{
v16 = *(unsigned int **)(a1 + 8);
for( j = 0; j < 4; ++j )
{
v18 = *v16;
v19 = v16 + 1;
if( v16 + 1 < v16 )
goto LABEL_17;
v16 = (unsigned int *)((char *)v19 + v18);
if( (unsigned int *)((char *)v19 + v18) < v19 )
goto LABEL_17;
}
v24 = *v16;
v25 = (VOID **)(v16 + 1);
if( v16 + 1 < v16 )
{
LABEL_17:
v14 = -1073741675;
goto LABEL_22;
}
v20 = 0i64;
if( v24 )
v20 = v25;
v14 = 0;
if( v24 != 8 )
return -1073741762;
v5 = *v20;
}
else
{
v14 = -1073741811;
}
LABEL_22:
if( v14 < 0 )
return v14;
if( v9 && *(_DWORD *)a1 > 5u )
{
for( k = 0; k < 5; ++k )
{
v40 = *v9;
v41 = v9 + 1;
if( v9 + 1 < v9 )
goto LABEL_85;
v9 = (unsigned int *)((char *)v41 + v40);
if( (unsigned int *)((char *)v41 + v40) < v41 )
goto LABEL_85;
}
v26 = *v9;
if( v9 + 1 < v9 )
{
LABEL_85:
v14 = -1073741675;
goto LABEL_39;
}
v27 = 0i64;
if( v26 )
v27 = (int *)(v9 + 1);
v14 = 0;
if( v26 == 4 )
{
v6 = *v27;
goto LABEL_39;
}
return -1073741789;
}
v14 = -1073741811;
LABEL_39:
if( v14 < 0 )
return v14;
if( v6 != 16 )
return -1073741762;
if( !v5 )
return -1073741811;
Object = 0i64;
v28 = ObReferenceObjectByHandle(v5, 0i64, (_OBJECT_TYPE *)IoFileObjectType, 1, &Object, 0i64);
v29 = (_FILE_OBJECT *)Object;
v14 = v28;
if( v28 >= 0 )
{
LODWORD(RetOutputBufferSize) = 0;
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x248ui64, 542329939i64);
if( !PoolWithTag )
{
v14 = -1073741801;
goto LABEL_45;
}
LODWORD(OutputBufferLength) = 584;
v14 = FsRtlKernelFsControlFile(v29, 0x900F4ui64, 0i64, 0i64, PoolWithTag, OutputBufferLength, &RetOutputBufferSize);
if( v14 < 0 )
goto LABEL_56;
if( (unsigned int)RetOutputBufferSize < 0x40 )
{
v14 = -1073741762;
LABEL_56:
ExFreePoolWithTag(PoolWithTag, 0x20534C53u);
goto LABEL_45;
}
v37 = *PoolWithTag;
LODWORD(OutputBufferLengtha) = 584;
if( v29->WriteAccess )
{
v14 = FsRtlKernelFsControlFile(
v29,
0x900EFui64,
0i64,
0i64,
PoolWithTag,
OutputBufferLengtha,
&RetOutputBufferSize);
if( v14 < 0 )
goto LABEL_56;
if( (unsigned int)RetOutputBufferSize < 8 )
{
LABEL_63:
v14 = -1073741762;
goto LABEL_56;
}
v39 = *PoolWithTag;
}
else
{
v14 = FsRtlKernelFsControlFile(
v29,
0x900EBui64,
0i64,
0i64,
PoolWithTag,
OutputBufferLengtha,
&RetOutputBufferSize);
if( v14 < 0 )
goto LABEL_56;
if( (unsigned int)RetOutputBufferSize < 0x40 )
goto LABEL_63;
v39 = PoolWithTag[3];
}
*(_QWORD *)&v47 = v37;
*((_QWORD *)&v47 + 1) = v39;
v7 = v47;
goto LABEL_56;
}
LABEL_45:
if( v29 )
HalPutDmaAdapter((PADAPTER_OBJECT)v29);
if( v14 >= 0 )
{
*(_DWORD *)(a4 + 4) = 32;
v31 = ExAllocatePoolWithTag(1ui64, 0x20ui64, 542329939i64);
if( !v31 )
return -1073741801;
*(_QWORD *)(a4 + 8) = v31;
*(_DWORD *)a4 = 0;
if( (VOID **)((char *)v31 + 4) < v31 )
return -1073741675;
if( (char *)v31 + 12 > (char *)v31 + *(unsigned int *)(a4 + 4) )
return -1073741789;
*(_DWORD *)v31 = 8;
*(VOID **)((char *)v31 + 4) = v4;
v32 = ++*(_DWORD *)a4;
v33 = *(_QWORD *)(a4 + 8);
if( v33 )
{
v34 = 0;
for( m = *(_QWORD *)(a4 + 8); v34 < v32; m += v36 )
{
v36 = *(_DWORD *)m + 4;
if( *(_DWORD *)m >= 0xFFFFFFFC || m + v36 < m )
return -1073741675;
++v34;
}
if( m + 4 < m )
return -1073741675;
v14 = 0;
if( m + 20 <= v33 + (unsigned __int64)*(unsigned int *)(a4 + 4) )
{
*(_DWORD *)m = 16;
*(_OWORD *)(m + 4) = v7;
++*(_DWORD *)a4;
return v14;
}
return -1073741789;
}
v42 = *(_DWORD *)(a4 + 4);
v43 = -1;
v44 = v42 + 20;
if( v42 + 20 >= v42 )
v43 = v42 + 20;
v14 = v44 < v42 ? 0xC0000095 : 0;
*(_DWORD *)(a4 + 4) = v43;
if( v44 >= v42 )
{
v14 = 0;
*(_DWORD *)a4 = v32 + 1;
}
}
return v14;
}Referenced by:
sub_1405F50F8