SmKmStoreFileGetExtents
NTSTATUS __stdcall SmKmStoreFileGetExtents(
_HANDLE FileHandle,
INT64 a2,
INT64 a3,
INT64 a4,
INT64 a5,
INT64 a6,
INT64 a7){
_PRIVILEGE_SET *v8;
unsigned __int64 v11;
unsigned int v12;
char v13;
char v14;
__int64 v15;
__int64 *v16;
int Status;
int v18;
__int64 v19;
unsigned int v20;
__int64 v21;
__int64 v22;
__int64 v23;
__int64 v24;
unsigned __int64 v25;
unsigned __int64 v26;
int v27;
char v29;
PVOID P;
UINT64 EntryCountMax;
VOID *Array;
__int64 v33;
_QWORD *v34;
_DWORD *v35;
_PRIVILEGE_SET **v36;
unsigned int *v37;
_IO_STATUS_BLOCK IoStatusBlock;
__int64 v39;
__int128 v40;
__int64 v41;
_DWORD *v42;
_PRIVILEGE_SET **v43;
unsigned int *v44;
P = 0i64;
v35 = v42;
v8 = 0i64;
v36 = v43;
v11 = (unsigned int)a4;
v12 = 0x10000;
v37 = v44;
HIDWORD(EntryCountMax) = a4;
v34 = (_QWORD *)a3;
IoStatusBlock = 0i64;
Array = 0i64;
IoSetThreadHardErrorMode(0);
v14 = v13;
v29 = v13;
if( (_DWORD)a7 )
{
v15 = *(_QWORD *)a3;
v16 = &v39;
v41 = 0i64;
v40 = 0i64;
v39 = v15;
P = &v39;
}
else
{
Status = ZwFsControlFile(FileHandle, 0, 0i64, 0i64, &IoStatusBlock, 0x9003Bu, (PVOID)a3, 8u, &P, 8u);
if( Status == 259 )
{
KeWaitForSingleObject(a2 + 152, 0, 0, 0, 0i64);
Status = IoStatusBlock.Status;
}
v16 = (__int64 *)P;
if( Status < 0 )
goto LABEL_29;
}
LODWORD(EntryCountMax) = 0;
v18 = 0;
v19 = *v16;
v20 = 0;
v21 = 0i64;
if( *v16 )
{
while( 1 )
{
v22 = v16[1];
v21 += v19;
if( v22 < 0 )
break;
if( v12 )
{
if( v19 >= v12 )
v23 = v12;
else
v23 = *(unsigned int *)v16;
v22 += v23;
v12 -= v23;
v19 -= v23;
v16[1] = v22;
*v16 = v19;
}
if( v19 >= (__int64)v11 )
{
v24 = (unsigned int)a5 - ((unsigned int)(a5 - 1) & (v22 + (unsigned int)a5 - 1i64));
v33 = v24 + v22 - 1;
v25 = (v19 + 1 - v24) % v11;
v26 = (v19 + 1 - v24) / v11;
if( (_DWORD)v26 )
{
v27 = SmArrayGrow(v20, v25, &EntryCountMax, &Array);
v8 = (_PRIVILEGE_SET *)Array;
if( !v27 )
{
Status = -1073741670;
goto LABEL_24;
}
v18 += v26;
v15 = 2i64 * v20++;
*((_QWORD *)Array + v15 + 1) = v33;
*(&v8->PrivilegeCount + 2 * v15) = v26;
}
}
v16 += 2;
v19 = *v16;
if( !*v16 )
{
v16 = (__int64 *)P;
goto LABEL_21;
}
v11 = HIDWORD(EntryCountMax);
}
Status = -1073741453;
LABEL_24:
v16 = (__int64 *)P;
goto LABEL_25;
}
LABEL_21:
if( v21 < *v34 )
{
Status = -1073741453;
LABEL_25:
v14 = v29;
goto LABEL_29;
}
v14 = v29;
if( v18 )
{
*v35 = v18;
*v36 = v8;
v8 = 0i64;
*v37 = v20;
Status = 0;
}
else
{
Status = -1073741672;
}
LABEL_29:
if( v16 && v16 != &v39 )
ExFreePoolWithTag(v16, 0);
if( v8 )
CmSiFreeMemory(v8);
LOBYTE(v15) = v14;
IoSetThreadHardErrorMode(v15);
return Status;
}Referenced by:
SmKmStoreFileCreate