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