SdbpGetProcessHistory

WCHAR *__stdcall SdbpGetProcessHistory(WCHAR *pEnvironment, WCHAR *szDir, WCHAR *szName){
  unsigned __int64 v3; 
  WCHAR *v4; 
  __int64 v5; 
  __int64 v6; 
  WCHAR *v7; 
  unsigned __int64 v8; 
  INT64 v9; 
  WCHAR *NtSystemRoot; 
  __int64 v11; 
  WCHAR *v12; 
  UINT16 *v13; 
  UINT16 v14; 
  UINT16 v15; 
  __int16 v16; 
  WCHAR *v17; 
  int v18; 
  unsigned __int64 v19; 
  unsigned __int64 v20; 
  WCHAR *v21; 
  WCHAR *v22; 
  WCHAR *result; 
  unsigned __int64 v24; 
  WCHAR *v25; 
  WCHAR *v26; 
  WCHAR *v27; 
  WCHAR *v28; 
  WCHAR *v29; 
  const wchar_t *v30; 
  UINT16 *v31; 
  UINT16 v32; 
  __int16 v33; 
  int v34; 
  WCHAR *v35; 
  __int64 v36; 
  WCHAR *v37; 

  v3 = -1i64;
  v4 = pEnvironment;
  v5 = -1i64;
  do
    ++v5;
  while( szDir[v5] );
  v6 = -1i64;
  do
    ++v6;
  while( szName[v6] );
  v7 = pEnvironment;
  if( wcsnicmp(L"__PROCESS_HISTORY", L"systemroot", 0xAu) )
  {
    if( v4 && *v4 )
    {
      do
      {
        v12 = v7;
        v13 = (UINT16 *)L"__PROCESS_HISTORY";
        do
        {
          if( !*v7 )
            break;
          NLS_UPCASE(*v13);
          v15 = NLS_UPCASE(v14);
          if( v15 != v16 )
            break;
          ++v7;
          ++v13;
        }
        while( v13 < L"" );
        if( v13 == L"" && *v7 == 61 )
        {
          v9 = 1i64;
LABEL_18:
          v17 = v7;
          if( *v7 )
          {
            v8 = 0i64;
            do
            {
              if( (__int64)(v8 & 0xFFFFFFFFFFFFFFFEui64) >= 65534 )
                break;
              ++v7;
              v8 += 2i64;
            }
            while( *v7 );
          }
          if( (_DWORD)v9 )
          {
            v11 = v7 - (v17 + 1);
            goto LABEL_34;
          }
        }
        else
        {
          v9 = 0i64;
          while( *v7 )
          {
            if( *v7 == 61 && v7 != v12 )
              goto LABEL_18;
            ++v7;
          }
        }
        ++v7;
      }
      while( *v7 );
    }
    v18 = -1073741568;
    v19 = (unsigned int)(v6 + v5 + 1);
  }
  else
  {
    NtSystemRoot = RtlGetNtSystemRoot();
    v11 = -1i64;
    do
      ++v11;
    while( NtSystemRoot[v11] );
LABEL_34:
    v8 = (unsigned int)(v6 + v5 + 2);
    v18 = -1073741789;
    v19 = v8 + v11 + 1;
  }
  v20 = 2 * v19;
  v21 = (WCHAR *)AslAlloc((VOID *)v8, v20, v9);
  v22 = v21;
  if( !v21 )
  {
    AslLogCallPrintf(
      1ui64,
      (INT8 *)"SdbpGetProcessHistory",
      0x8BDui64,
      (INT8 *)"Unable to allocate process history buffer");
    return 0i64;
  }
  *v21 = 0;
  if( v18 != -1073741789 )
    goto LABEL_69;
  v24 = v20 >> 1;
  if( !wcsnicmp(L"__PROCESS_HISTORY", L"systemroot", 0xAu) )
  {
    v25 = RtlGetNtSystemRoot();
    do
      ++v3;
    while( v25[v3] );
    if( v3 >= v24 )
      goto LABEL_67;
    v26 = v25;
    goto LABEL_41;
  }
  if( !v4 || !*v4 )
    goto LABEL_69;
  while( 1 )
  {
    v29 = v4;
    v30 = L"__PROCESS_HISTORY";
    do
    {
      if( !*v4 )
        break;
      NLS_UPCASE(*v4);
      v32 = NLS_UPCASE(*v31);
      if( v33 != v32 )
        break;
      ++v4;
      ++v30;
    }
    while( v30 < L"" );
    if( v30 != L"" || *v4 != 61 )
    {
      v34 = 0;
      while( *v4 )
      {
        if( *v4 == 61 && v4 != v29 )
          goto LABEL_53;
        ++v4;
      }
      goto LABEL_58;
    }
    v34 = 1;
LABEL_53:
    v35 = v4;
    if( *v4 )
    {
      v36 = 0i64;
      do
      {
        if( (__int64)(v36 & 0xFFFFFFFFFFFFFFFEui64) >= 65534 )
          break;
        ++v4;
        v36 += 2i64;
      }
      while( *v4 );
    }
    if( v34 )
      break;
LABEL_58:
    if( !*++v4 )
      goto LABEL_69;
  }
  v26 = v35 + 1;
  v3 = v4 - v26;
  if( v3 < v24 )
  {
LABEL_41:
    memmove(v21, v26, 2 * v3);
    v27 = &v21[v3];
    *v27 = 0;
    v28 = v27 - 1;
    if( *(v27 - 1) != 59 )
    {
      v28 = &v22[v3];
      *v27 = 59;
    }
    v21 = v28 + 1;
    goto LABEL_69;
  }
LABEL_67:
  if( v24 )
    *v21 = 0;
LABEL_69:
  memmove(v21, szDir, 2 * v5);
  v37 = &v21[(unsigned int)v5];
  memmove(v37, szName, 2 * v6);
  result = v22;
  v37[(unsigned int)v6] = 0;
  return result;
}

Referenced by:

SdbpInitializeSearchDBContext