KsepDbGetDriverShims

NTSTATUS __stdcall KsepDbGetDriverShims(
        _UNICODE_STRING *DriverImageName,
        VOID *BaseAddress,
        UINT64 ImageSize,
        _UNICODE_STRING **ShimsOut,
        UINT64 *ShimCount){
  _UNICODE_STRING *v7; 
  size_t v8; 
  NTSTATUS v9; 
  _QWORD *v10; 
  NTSTATUS v11; 
  NTSTATUS DriverShimsInternal; 
  __int64 v13; 
  VOID *v14; 
  _UNICODE_STRING *v16; 
  INT64 a5; 
  INT64 a5a; 
  INT64 a7; 
  INT64 a6; 
  INT64 v21; 
  PVOID DbHandleOut; 
  _UNICODE_STRING *a3a; 
  int v26; 

  v26 = ImageSize;
  a6 = 0i64;
  v21 = 0i64;
  v7 = 0i64;
  v8 = 0;
  a7 = 0i64;
  DbHandleOut = 0i64;
  if( !DriverImageName || !ShimsOut )
    return -1073741811;
  *ShimsOut = 0i64;
  *(_DWORD *)ShimCount = 0;
  v9 = KseShimDatabaseOpen(&DbHandleOut);
  v10 = DbHandleOut;
  v11 = v9;
  if( v9 >= 0 )
  {
    LODWORD(a5) = v26;
    DriverShimsInternal = KsepDbGetDriverShimsInternal(
                            *(VOID **)DbHandleOut,
                            (INT64)&KsepMatchMachineInfo,
                            (INT64)DriverImageName,
                            BaseAddress,
                            a5,
                            (INT64)&a6,
                            (INT64)&a7 + 4);
    v13 = HIDWORD(a7);
    v11 = DriverShimsInternal;
    if( (int)(DriverShimsInternal + 0x80000000) >= 0 && DriverShimsInternal != -1073741275 )
      goto LABEL_9;
    v14 = (VOID *)v10[7];
    if( v14 )
    {
      LODWORD(a5a) = v26;
      v11 = KsepDbGetDriverShimsInternal(
              v14,
              (INT64)&KsepMatchMachineInfo,
              (INT64)DriverImageName,
              BaseAddress,
              a5a,
              (INT64)&v21,
              (INT64)&a7);
      if( (int)(v11 + 0x80000000) >= 0 && v11 != -1073741275 )
      {
        v7 = (_UNICODE_STRING *)v21;
        v8 = a7;
        goto LABEL_9;
      }
      v7 = (_UNICODE_STRING *)v21;
      v8 = a7;
    }
    if( (_DWORD)v13 )
    {
      if( v8 )
      {
        a3a = (_UNICODE_STRING *)KsepPoolAllocatePaged(80i64 * (v8 + (unsigned int)v13));
        if( !a3a )
        {
          v11 = -1073741801;
          goto LABEL_9;
        }
        memmove(a3a, (const VOID *)a6, 80 * v13);
        memmove(&a3a[5 * v13], v7, v8);
        *ShimsOut = a3a;
        *(_DWORD *)ShimCount = v8 + v13;
      }
      else
      {
        v16 = (_UNICODE_STRING *)a6;
        a6 = 0i64;
        *ShimsOut = v16;
        *(_DWORD *)ShimCount = v13;
      }
    }
    else
    {
      if( !v8 )
      {
        v11 = -1073741275;
LABEL_9:
        if( a6 )
          KsepDbFreeDriverShims((_KSE_SHIM_INFO *)a6, (unsigned int)v13);
        if( v7 )
          KsepDbFreeDriverShims((_KSE_SHIM_INFO *)v7, v8);
        goto LABEL_13;
      }
      *ShimsOut = v7;
      v7 = 0i64;
      *(_DWORD *)ShimCount = v8;
    }
    v11 = 0;
    goto LABEL_9;
  }
LABEL_13:
  if( v10 )
    KseShimDatabaseClose(v10);
  return v11;
}

Referenced by:

KsepGetShimsForDriver