NtManagePartition

INT64 __fastcall NtManagePartition(
        VOID *TargetHandle,
        VOID *SourceHandle,
        INT64 PartitionInformationClass,
        VOID *PartitionInformation,
        INT64 PartitionInformationLength,
        INT64 a6,
        INT64 a7,
        INT64 a8){
  __int64 v9; 
  INT8 v12; 
  NTSTATUS v13; 
  __int64 v14; 
  int v15; 
  int v16; 
  int v17; 
  int v18; 
  int v19; 
  int v20; 
  int PagingFile; 
  _QWORD *a5; 
  char v24; 
  char v25; 
  INT64 a1; 
  INT64 **a2; 
  INT64 Src[4]; 
  UINT64 Flags; 
  v9 = (unsigned int)PartitionInformationClass;
  memset((INT64)Src, 0i64);
  v25 = 0;
  v24 = 0;
  v12 = *((_BYTE *)KeGetCurrentThread() + 562);
  a2 = 0i64;
  a1 = 0i64;
  if( (unsigned int)v9 >= 9 )
  {
    v13 = -1073741821;
    goto LABEL_47;
  }
  v14 = v9;
  if( (_DWORD)PartitionInformationLength != WORD2(PspPartitionInfoDetails[v9]) )
  {
    v13 = -1073741820;
    goto LABEL_47;
  }
  if( (PspPartitionInfoDetails[v9] & 0x100000000000000i64) != 0 )
  {
    if( v12 && (_DWORD)PartitionInformationLength )
    {
      if( ((BYTE6(PspPartitionInfoDetails[v9]) - 1i64) & (unsigned __int64)PartitionInformation) != 0 )
        ExRaiseDatatypeMisalignment();
      if( (unsigned __int64)PartitionInformation + (unsigned int)PartitionInformationLength > 0x7FFFFFFF0000i64
        || (char *)PartitionInformation + (unsigned int)PartitionInformationLength < PartitionInformation )
      {
        MEMORY[0x7FFFFFFF0000] = 0;
      }
    }
    memmove((UINT8 *)Src, (UINT8 *)PartitionInformation, (unsigned int)PartitionInformationLength);
  }
  v13 = PsReferencePartitionByHandle(TargetHandle, LODWORD(PspPartitionInfoDetails[v9]), v12, 0x704D7350ui64, &a1);
  if( v13 >= 0 )
  {
    v24 = 1;
    if( (PspPartitionInfoDetails[v9] & 0x400000000000000i64) != 0 )
    {
      v13 = PsReferencePartitionByHandle(SourceHandle, LODWORD(PspPartitionInfoDetails[v9]), v12, 0x704D7350ui64, &a2);
      if( v13 < 0 )
        goto LABEL_47;
      v25 = 1;
      if( a2 == (INT64 **)a1 )
        goto LABEL_17;
    }
    else if( SourceHandle )
    {
      v13 = -1073741584;
      goto LABEL_47;
    }
    if( !(_DWORD)v9 )
    {
      PagingFile = MmManagePartitionMemoryInformation((UINT16 **)a1, (INT64)Src);
      goto LABEL_41;
    }
    v15 = v9 - 1;
    if( !v15 )
    {
      PagingFile = MmManagePartitionMoveMemory((INT64 **)a1, a2, (INT64)Src, v12);
      goto LABEL_41;
    }
    v16 = v15 - 1;
    if( !v16 )
    {
      LODWORD(a5) = Flags;
      PagingFile = MiCreatePagingFile(
                     (UNICODE_STRING *)PartitionInformation,
                     (LARGE_INTEGER *)PartitionInformation + 2,
                     (LARGE_INTEGER *)PartitionInformation + 3,
                     v12,
                     (UINT64)a5);
      goto LABEL_41;
    }
    v17 = v16 - 1;
    if( !v17 )
    {
      PagingFile = MmManagePartitionCombineMemory((UINT64 **)a1, (INT64)Src, (INT64)PartitionInformation, v12);
      goto LABEL_41;
    }
    v18 = v17 - 1;
    if( !v18 )
    {
      PagingFile = MmManagePartitionInitialAddMemory((UINT64 *)a1, Src, (INT64)PartitionInformation, v12);
      goto LABEL_41;
    }
    v19 = v18 - 1;
    if( !v19 )
    {
      PagingFile = MmManagePartitionGetMemoryEvents((PVOID **)a1, (INT64)Src, v12);
      goto LABEL_41;
    }
    v20 = v19 - 1;
    if( v20 )
    {
      if( v20 == 1 )
        PagingFile = MmManagePartitionNodeInformation(a1, (UINT64 *)Src, v12);
      else
        PagingFile = MmManagePartitionCreateLargePages(a1, (INT64)Src, v12);
LABEL_41:
      v13 = PagingFile;
      if( PagingFile < 0 )
        goto LABEL_47;
      goto LABEL_42;
    }
    if( !Src[0] )
    {
      v13 = 0;
LABEL_42:
      if( (PspPartitionInfoDetails[v14] & 0x200000000000000i64) != 0 )
      {
        if( v12 )
          ProbeForWrite(
            PartitionInformation,
            (unsigned int)PartitionInformationLength,
            BYTE6(PspPartitionInfoDetails[v14]));
        memmove((UINT8 *)PartitionInformation, (UINT8 *)Src, (unsigned int)PartitionInformationLength);
      }
      goto LABEL_47;
    }
    if( (Src[0] & 0xFFFFFFFFFFFFFFFCui64) != 0 || *(ULONG_PTR **)a1 == &MiSystemPartition )
    {
LABEL_17:
      v13 = -1073741811;
      goto LABEL_47;
    }
    v13 = v12 != 0 ? -1073741727 : -1073741637;
  }
LABEL_47:
  if( v24 )
    PsDereferencePartition(a1);
  if( v25 )
    PsDereferencePartition((INT64)a2);
  return(unsigned int)v13;
}

Referenced by:

No references.