DrvDbDispatchDriverFile

INT64 __fastcall DrvDbDispatchDriverFile(INT64 rcx0, WCHAR *a2, INT64 a3, INT64 a4, INT64 arg20){
  signed int ObjectContext; 
  int v7; 
  INT64 *v8; 
  WCHAR *v9; 
  int v10; 
  int v11; 
  int v12; 
  int v13; 
  int v14; 
  int v15; 
  int v16; 
  INT64 v18; 
  INT64 a5; 
  INT64 DataSize; 
  INT64 v22; 
  INT64 v23; 
  INT64 *a1[3]; 
  a1[0] = 0i64;
  ObjectContext = PnpCtxGetObjectContext(rcx0, a3, a1);
  if( ObjectContext < 0 )
    return(unsigned int)ObjectContext;
  v8 = a1[0];
  v9 = (WCHAR *)*((unsigned int *)a1[0] + 3);
  if( ((unsigned int)v9 & 0x10000000) == 0 )
  {
    if( !(_DWORD)v9 )
      return(unsigned int)-1073740697;
    if( v7 == 2 )
    {
      if( *(_BYTE *)(arg20 + 4) )
      {
LABEL_13:
        v9 = (WCHAR *)((unsigned int)v9 >> 30);
        LOBYTE(v9) = (unsigned __int8)v9 & 1;
        goto LABEL_15;
      }
    }
    else
    {
      if( v7 <= 2 )
      {
LABEL_11:
        LOBYTE(v9) = 1;
        goto LABEL_15;
      }
      if( v7 <= 4 )
        goto LABEL_13;
      if( v7 > 6 && v7 != 8 )
      {
        if( v7 != 9 )
          goto LABEL_11;
        goto LABEL_13;
      }
    }
    v9 = (WCHAR *)((unsigned int)v9 >> 31);
LABEL_15:
    ObjectContext = (_BYTE)v9 == 0 ? 0xC0000022 : 0;
    if( !(_BYTE)v9 )
      return(unsigned int)ObjectContext;
  }
  v10 = v7 - 1;
  if( !v10 )
    return(unsigned int)DrvDbValidateDriverInfFileName(v9);
  v11 = v10 - 1;
  if( !v11 )
    return(unsigned int)DrvDbOpenDriverFileRegKey(
                           a1[0],
                           (INT64)a2,
                           *(unsigned int *)arg20,
                           *(_BYTE *)(arg20 + 4),
                           *(_QWORD *)(arg20 + 8),
                           arg20 + 16);
  v12 = v11 - 1;
  if( v12 )
  {
    v13 = v12 - 1;
    if( v13 )
    {
      v14 = v13 - 1;
      if( v14 )
      {
        v15 = v14 - 1;
        if( v15 )
        {
          v16 = v15 - 2;
          if( v16 )
          {
            if( v16 != 1 )
              return(unsigned int)-1073741811;
            LODWORD(v22) = *(_DWORD *)(arg20 + 40);
            LODWORD(a5) = *(_DWORD *)(arg20 + 24);
            return(unsigned int)DrvDbSetDriverFileMappedProperty(
                                   a1[0],
                                   (INT64)a2,
                                   *(VOID **)arg20,
                                   *(_QWORD *)(arg20 + 16),
                                   a5,
                                   *(VOID **)(arg20 + 32),
                                   v22);
          }
          else
          {
            return(unsigned int)DrvDbGetDriverFileMappedProperty(
                                   a1[0],
                                   (__int64)a2,
                                   *(HANDLE *)arg20,
                                   *(_QWORD *)(arg20 + 16),
                                   *(_DWORD **)(arg20 + 24),
                                   *(_WORD **)(arg20 + 32),
                                   *(_DWORD *)(arg20 + 40),
                                   *(unsigned int **)(arg20 + 48));
          }
        }
        else
        {
          LODWORD(a5) = *(_DWORD *)(arg20 + 32);
          return(unsigned int)DrvDbGetDriverFileMappedPropertyKeys(
                                 a1[0],
                                 (INT64)a2,
                                 *(VOID **)arg20,
                                 *(_QWORD *)(arg20 + 24),
                                 a5,
                                 *(_QWORD *)(arg20 + 40));
        }
      }
      else
      {
        LODWORD(v23) = 0;
        LODWORD(DataSize) = *(_DWORD *)(arg20 + 24);
        return(unsigned int)DrvDbGetObjectList(
                               a1[0],
                               4i64,
                               *(_QWORD *)arg20,
                               *(_QWORD *)(arg20 + 8),
                               *(_WORD **)(arg20 + 16),
                               DataSize,
                               *(UINT64 **)(arg20 + 32),
                               v23);
      }
    }
    else
    {
      return(unsigned int)DrvDbDeleteObjectRegKey(a1[0], 4, a2, 0);
    }
  }
  v18 = *(unsigned int *)arg20;
  LODWORD(a1[0]) = 0;
  ObjectContext = DrvDbOpenDriverFileRegKey(v8, (INT64)a2, v18, 1, arg20 + 8, (INT64)a1);
  if( ObjectContext >= 0 )
    *(_BYTE *)(arg20 + 16) = LODWORD(a1[0]) == 1;
  return(unsigned int)ObjectContext;
}

Referenced by:

No references.