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