WbAllocateUserMemory

_IRP *__stdcall WbAllocateUserMemory(
        UINT64 MajorFunction,
        _DEVICE_OBJECT *DeviceObject,
        VOID *Buffer,
        UINT64 Length,
        _LARGE_INTEGER *StartingOffset,
        _KEVENT *Event,
        _IO_STATUS_BLOCK *IoStatusBlock){
  int v7; 
  PVOID *v9; 
  PVOID *v10; 
  int v11; 
  _ETHREAD *CurrentThread; 
  _EX_PUSH_LOCK *v13; 
  _BYTE *v14; 
  int v15; 
  VOID *v16; 
  VOID *v17; 
  _MDL *v18; 
  _ETHREAD *v20; 
  _BYTE *v21; 
  INT64 v22; 
  _BYTE *v23; 
  char v24; 
  UINT64 v25; 
  UINT64 v26; 
  PVOID *BaseAddress; 
  _MDL *Mdl[3]; 

  v7 = (int)DeviceObject;
  BaseAddress = 0i64;
  Mdl[0] = 0i64;
  v9 = 0i64;
  v10 = 0i64;
  v11 = 0;
  if( (unsigned int)DeviceObject > 0x10000 )
  {
    v11 = -1073741811;
    goto LABEL_17;
  }
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.SpecialApcDisable;
  v13 = (_EX_PUSH_LOCK *)(MajorFunction + 224);
  v14 = KeAbPreAcquire((VOID *)(MajorFunction + 224), 0i64, 0i64);
  if( _InterlockedCompareExchange64(&v13->_bf_0, 17i64, 0i64) )
    ExfAcquirePushLockSharedEx(v13, v14, v13);
  if( v14 )
    v14[26] |= 1u;
  v15 = 0;
  if( *(_DWORD *)(MajorFunction + 188) )
  {
    while( 1 )
    {
      v9 = *(PVOID **)((unsigned int)(v15 * *(_DWORD *)(MajorFunction + 184)) + *(_QWORD *)(MajorFunction + 200));
      v11 = sub_14065FACC((INT64)v9, v7, (INT64 *)Mdl);
      if( v11 < 0 )
        goto LABEL_29;
      if( !Mdl[0] && (unsigned int)++v15 < *(_DWORD *)(MajorFunction + 188) )
        continue;
      break;
    }
  }
  if( _InterlockedCompareExchange64(&v13->_bf_0, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared(v13);
  KeAbPostRelease(v13);
  KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
  v18 = Mdl[0];
  if( Mdl[0] )
  {
    v10 = BaseAddress;
  }
  else
  {
    v11 = WbAllocateMemoryBlock(0i64, &BaseAddress, v16, v17, v25);
    if( v11 < 0 )
      goto LABEL_29;
    v10 = BaseAddress;
    v11 = sub_14065FACC((INT64)BaseAddress, v7, (INT64 *)Mdl);
    if( v11 < 0 )
      goto LABEL_17;
    v20 = (_ETHREAD *)KeGetCurrentThread();
    --v20->Tcb.SpecialApcDisable;
    v21 = KeAbPreAcquire(v13, 0i64, 0i64);
    v23 = v21;
    if( _interlockedbittestandset64((volatile signed __int32 *)v13, 0i64) )
      ExfAcquirePushLockExclusiveEx(v13, v21, v13);
    if( v23 )
      v23[26] |= 1u;
    LODWORD(v26) = -1;
    v11 = sub_14065FDF0((INT64 *)(MajorFunction + 184), (INT64)BaseAddress, v22, (__int64)BaseAddress[4], 8, v26);
    v24 = _InterlockedExchangeAdd64(&v13->_bf_0, 0xFFFFFFFFFFFFFFFFui64);
    if( (v24 & 2) != 0 && (v24 & 4) == 0 )
      ExfTryToWakePushLock(v13);
    KeAbPostRelease(v13);
    KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
    if( v11 < 0 )
    {
LABEL_29:
      v10 = BaseAddress;
      goto LABEL_17;
    }
    v9 = BaseAddress;
    v10 = 0i64;
    v18 = Mdl[0];
  }
  if( Buffer )
    *(_QWORD *)Buffer = v18;
  if( Length )
    *(_QWORD *)Length = (char *)v18 + (_BYTE *)*v9 - (_BYTE *)v9[4];
LABEL_17:
  WbFreeMemoryBlock(v10);
  return(_IRP *)(unsigned int)v11;
}

Referenced by:

WbCreateHeapExecutedBlock