PspCopyAndFixupParameters

NTSTATUS __stdcall PspCopyAndFixupParameters(
        VOID *ParentProcess,
        VOID **DuplicateHandleList,
        PSP_CREATE_PROCESS_CONTEXT *CreateContext){
  unsigned int *v4; 
  __int64 v5; 
  _RTL_USER_PROCESS_PARAMETERS *v6; 
  _EPROCESS *Process; 
  char PreviousMode; 
  NTSTATUS v9; 
  signed __int64 v10; 
  wchar_t *Buffer; 
  wchar_t *v12; 
  wchar_t *v13; 
  wchar_t *v14; 
  wchar_t *v15; 
  wchar_t *v16; 
  wchar_t *v17; 
  wchar_t *v18; 
  wchar_t *v19; 
  wchar_t *v20; 
  unsigned __int64 *DefaultThreadpoolCpuSetMasks; 
  char *Environment; 
  NTSTATUS result; 
  UINT64 *v24; 
  unsigned int v25; 
  VOID **v26; 
  UINT64 v27; 
  UINT64 v28; 
  INT64 v29; 
  INT64 v30; 
  INT64 v31; 
  int v32; 
  VOID *v33; 
  char v34; 
  UINT64 v35; 
  _EPROCESS *v36; 

  v33 = ParentProcess;
  v35 = 0i64;
  v4 = (unsigned int *)*((_QWORD *)CreateContext + 26);
  v5 = *((_QWORD *)v4 + 126) + *v4;
  v32 = v5;
  v6 = (_RTL_USER_PROCESS_PARAMETERS *)*((_QWORD *)CreateContext + 27);
  Process = KeGetCurrentThread()->ApcState.Process;
  v36 = Process;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  v34 = PreviousMode;
  if( (CreateContext[2] & 0x40) != 0 && (*((_BYTE *)CreateContext + 9) & 1) == 0 )
    v4[2] |= 0x4000u;
  if( CreateContext[20] == 3 && (int)v4[4] > 0 )
  {
    LODWORD(v31) = 6;
    LODWORD(v30) = 0;
    LODWORD(v29) = 0;
    v9 = ObDuplicateObject((INT64)ParentProcess, *((_QWORD *)v4 + 2), (INT64)Process, &v35, v29, v30, v31, PreviousMode);
    ParentProcess = v33;
    Process = v36;
    PreviousMode = v34;
    if( v9 >= 0 )
      *((_QWORD *)v4 + 2) = v35;
  }
  if( DuplicateHandleList )
  {
    v24 = (UINT64 *)(v4 + 8);
    v25 = 0;
    v26 = DuplicateHandleList;
    while( 1 )
    {
      v27 = (UINT64)*v26;
      if( *v26 )
      {
        if( (v27 & 0x80000000) != 0i64 )
        {
          v28 = 0i64;
          v35 = 0i64;
          result = -1073741816;
        }
        else
        {
          LODWORD(v31) = 6;
          LODWORD(v30) = 0;
          LODWORD(v29) = 0;
          result = ObDuplicateObject((INT64)ParentProcess, v27, (INT64)Process, &v35, v29, v30, v31, PreviousMode);
          v28 = v35;
        }
        if( result < 0 )
        {
          if( DuplicateHandleList == (VOID **)(v4 + 8) )
            return result;
        }
        else
        {
          *v24 = v28;
        }
      }
      ++v24;
      ++v25;
      ++v26;
      if( v25 >= 3 )
        break;
      ParentProcess = v33;
      Process = v36;
      PreviousMode = v34;
    }
    LODWORD(v5) = v32;
  }
  v10 = (char *)v6 - (char *)v4;
  memmove(v6, v4, v5);
  Buffer = v6->CurrentDirectory.DosPath.Buffer;
  if( Buffer )
    v6->CurrentDirectory.DosPath.Buffer = (wchar_t *)((char *)Buffer + v10);
  v12 = v6->DllPath.Buffer;
  if( v12 )
    v6->DllPath.Buffer = (wchar_t *)((char *)v12 + v10);
  v13 = v6->ImagePathName.Buffer;
  if( v13 )
    v6->ImagePathName.Buffer = (wchar_t *)((char *)v13 + v10);
  v14 = v6->CommandLine.Buffer;
  if( v14 )
    v6->CommandLine.Buffer = (wchar_t *)((char *)v14 + v10);
  v15 = v6->WindowTitle.Buffer;
  if( v15 )
    v6->WindowTitle.Buffer = (wchar_t *)((char *)v15 + v10);
  v16 = v6->DesktopInfo.Buffer;
  if( v16 )
    v6->DesktopInfo.Buffer = (wchar_t *)((char *)v16 + v10);
  v17 = v6->ShellInfo.Buffer;
  if( v17 )
    v6->ShellInfo.Buffer = (wchar_t *)((char *)v17 + v10);
  v18 = v6->RuntimeData.Buffer;
  if( v18 )
    v6->RuntimeData.Buffer = (wchar_t *)((char *)v18 + v10);
  v19 = v6->RedirectionDllName.Buffer;
  if( v19 )
    v6->RedirectionDllName.Buffer = (wchar_t *)((char *)v19 + v10);
  v20 = v6->HeapPartitionName.Buffer;
  if( v20 )
    v6->HeapPartitionName.Buffer = (wchar_t *)((char *)v20 + v10);
  DefaultThreadpoolCpuSetMasks = v6->DefaultThreadpoolCpuSetMasks;
  if( DefaultThreadpoolCpuSetMasks )
    v6->DefaultThreadpoolCpuSetMasks = (unsigned __int64 *)((char *)DefaultThreadpoolCpuSetMasks + v10);
  Environment = (char *)v6->Environment;
  if( Environment )
    v6->Environment = &Environment[v10];
  KeGetCurrentThread()->ApcState.Process->Peb->ProcessParameters = v6;
  return 0;
}

Referenced by:

PspSetupUserProcessAddressSpace