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.