FsRtlpRegisterProviderWithMUP

__int64 __fastcall FsRtlpRegisterProviderWithMUP(HANDLE Handle, const void **a2, __int64 a3, __int64 a4){
  ULONG InputBufferLength; 
  UINT8 *PoolWithTag; 
  UINT8 *InputBuffer; 
  unsigned int Status; 
  struct _IO_STATUS_BLOCK IoStatusBlock; 
  InputBufferLength = *(unsigned __int16 *)a2 + 32;
  IoStatusBlock = 0i64;
  PoolWithTag = (UINT8 *)ExAllocatePoolWithTag(NonPagedPoolNx, InputBufferLength, 0x6E755346ui64);
  InputBuffer = PoolWithTag;
  if( !PoolWithTag )
    return 3221225626i64;
  *((_QWORD *)PoolWithTag + 1) = PoolWithTag + 32;
  *(_WORD *)PoolWithTag = *(_WORD *)a2;
  *((_WORD *)PoolWithTag + 1) = *(_WORD *)a2;
  *((_QWORD *)PoolWithTag + 2) = a3;
  *((_QWORD *)PoolWithTag + 3) = a4;
  memmove(PoolWithTag + 32, (UINT8 *)a2[1], *(unsigned __int16 *)a2);
  Status = ZwFsControlFile(Handle, 0i64, 0i64, 0i64, &IoStatusBlock, 0x100004u, InputBuffer, InputBufferLength, 0i64, 0);
  if( Status == 259 )
  {
    ZwWaitForSingleObject(Handle, 0, 0i64);
    Status = IoStatusBlock.Status;
  }
  ExFreePoolWithTag(InputBuffer, 0);
  return Status;
}

Referenced by:

FsRtlpRegisterUncProvider