FsRtlpRegisterProviderWithMUP

NTSTATUS __stdcall FsRtlpRegisterProviderWithMUP(
        VOID *MupHandle,
        const VOID **RedirDevName,
        _DEVICE_OBJECT *DeviceObject,
        _FSRTL_UNC_PROVIDER_REGISTRATION *Registration){
  ULONG InputBufferLength; 
  VOID **PoolWithTag; 
  VOID **InputBuffer; 
  NTSTATUS Status; 
  _IO_STATUS_BLOCK IoStatusBlock; 

  InputBufferLength = *(unsigned __int16 *)RedirDevName + 32;
  IoStatusBlock = 0i64;
  PoolWithTag = ExAllocatePoolWithTag(0x200ui64, InputBufferLength, 1853182790i64);
  InputBuffer = PoolWithTag;
  if( !PoolWithTag )
    return -1073741670;
  PoolWithTag[1] = PoolWithTag + 4;
  *(_WORD *)PoolWithTag = *(_WORD *)RedirDevName;
  *((_WORD *)PoolWithTag + 1) = *(_WORD *)RedirDevName;
  PoolWithTag[2] = DeviceObject;
  PoolWithTag[3] = Registration;
  memmove(PoolWithTag + 4, RedirDevName[1], *(unsigned __int16 *)RedirDevName);
  Status = ZwFsControlFile(
             (_HANDLE)MupHandle,
             0,
             0i64,
             0i64,
             &IoStatusBlock,
             0x100004u,
             InputBuffer,
             InputBufferLength,
             0i64,
             0);
  if( Status == 259 )
  {
    ZwWaitForSingleObject((UINT64)MupHandle, 0, 0i64);
    Status = IoStatusBlock.Status;
  }
  ExFreePoolWithTag(InputBuffer, 0);
  return Status;
}

Referenced by:

FsRtlpRegisterUncProvider