FsRtlKernelFsControlFile
NTSTATUS __stdcall FsRtlKernelFsControlFile(
FILE_OBJECT *FileObject,
UINT64 FsControlCode,
PVOID InputBuffer,
UINT64 InputBufferLength,
PVOID OutputBuffer,
UINT64 OutputBufferLength,
UINT64 *RetOutputBufferSize){
UINT64 v7;
int v9;
_IRP *v11;
unsigned int v12;
_IRP *v13;
__int64 v14;
unsigned int v15;
__int64 v16;
NTSTATUS v17;
unsigned int v18;
_MDL *Mdl;
void *v20;
void *v21;
void *v22;
struct _MDL *v23;
PIRP Irp;
__int64 *v26;
_DEVICE_OBJECT *DeviceObject;
PVOID ObjectArray;
_KEVENT Object;
v7 = (unsigned int)InputBufferLength;
v9 = FsControlCode;
v11 = 0i64;
memset(&Object, 0, sizeof(Object));
KeInitializeEvent(&Object, NotificationEvent, 0);
v12 = v9 & 3;
if( (FileObject->Flags & 0x800) != 0 )
{
v17 = -1073741808;
goto LABEL_32;
}
DeviceObject = IoGetRelatedDeviceObject(FileObject);
v13 = IoAllocateIrpEx(DeviceObject, *((_BYTE *)DeviceObject + 76), 0);
v11 = v13;
Irp = v13;
if( !v13 )
goto LABEL_21;
v26 = (__int64 *)((char *)v13 + 184);
v14 = *((_QWORD *)v13 + 23);
*(_WORD *)(v14 - 72) = 1037;
*(_QWORD *)(v14 - 24) = FileObject;
v15 = OutputBufferLength;
*(_DWORD *)(v14 - 64) = OutputBufferLength;
*(_DWORD *)(v14 - 56) = v7;
*(_DWORD *)(v14 - 48) = v9;
if( (v9 & 3) == 0 )
{
if( (_DWORD)v7 || (_DWORD)OutputBufferLength )
{
if( (unsigned int)v7 >= (unsigned int)OutputBufferLength )
{
*((_QWORD *)v13 + 3) = InputBuffer;
}
else
{
*((_QWORD *)v13 + 3) = OutputBuffer;
memmove((UINT8 *)OutputBuffer, (UINT8 *)InputBuffer, v7);
}
*((_DWORD *)v11 + 4) = 16;
*((_QWORD *)v11 + 14) = OutputBuffer;
if( OutputBuffer )
*((_DWORD *)v11 + 4) |= 0x40u;
}
else
{
*((_DWORD *)v13 + 4) = 0;
*((_QWORD *)v13 + 14) = 0i64;
}
goto LABEL_10;
}
if( v12 > 2 )
{
if( v12 == 3 )
{
*((_QWORD *)v13 + 14) = OutputBuffer;
*(_QWORD *)(v14 - 40) = InputBuffer;
}
goto LABEL_10;
}
if( InputBuffer )
{
*((_QWORD *)v13 + 3) = InputBuffer;
*((_DWORD *)v13 + 4) = 16;
}
else
{
*((_DWORD *)v13 + 4) = 0;
}
if( OutputBuffer )
{
Mdl = IoAllocateMdl(OutputBuffer, OutputBufferLength, 0, 0, 0i64);
*((_QWORD *)v11 + 1) = Mdl;
if( Mdl )
{
MmProbeAndLockPages(Mdl, 0, (_LOCK_OPERATION)(v12 != 1));
goto LABEL_10;
}
LABEL_21:
v17 = -1073741670;
goto LABEL_32;
}
LABEL_10:
v11 = Irp;
*((_QWORD *)Irp + 19) = KeGetCurrentThread();
*((_DWORD *)Irp + 4) |= 4u;
*((_BYTE *)Irp + 64) = 0;
v16 = *v26;
*(_QWORD *)(v16 - 16) = SmKmGenericCompletion;
*(_QWORD *)(v16 - 8) = &Object;
*(_BYTE *)(v16 - 69) = 0;
*(_BYTE *)(v16 - 69) = 64;
*(_BYTE *)(v16 - 69) = -64;
*(_BYTE *)(v16 - 69) = -32;
if( IofCallDriver(DeviceObject, Irp) == 259 )
{
ObjectArray = &Object;
if( (unsigned int)FsRtlCancellableWaitForMultipleObjects(1ui64, &ObjectArray, WaitAll, 0i64, 0i64, 0i64) == -1073741749 )
{
IoCancelIrp((KDPC *)Irp, v20, v21, v22);
KeWaitForSingleObject(&Object, Executive, 0, 0, 0i64);
}
}
v17 = *((_DWORD *)Irp + 12);
v18 = *((_DWORD *)Irp + 14);
*(_DWORD *)RetOutputBufferSize = v18;
if( v17 >= 0 && v18 && (unsigned int)v7 >= (unsigned int)OutputBufferLength )
{
if( v18 < (unsigned int)OutputBufferLength )
v15 = v18;
memmove((UINT8 *)OutputBuffer, (UINT8 *)InputBuffer, v15);
}
LABEL_32:
if( v11 )
{
v23 = (struct _MDL *)*((_QWORD *)v11 + 1);
if( v23 )
{
FsRtlpFreeMdlChain(v23);
*((_QWORD *)v11 + 1) = 0i64;
}
IoFreeIrp(v11);
}
return v17;
}Referenced by:
SPCallServerHandleFileIntegrityQuery
SPCallServerHandleFileIntegrityUpdate
SPCallServerHandleFileUsnQuery