IopSetEaOrQuotaInformationFile
NTSTATUS __stdcall IopSetEaOrQuotaInformationFile(
VOID *FileHandle,
_IO_STATUS_BLOCK *IoStatusBlock,
VOID *Buffer,
UINT64 Length){
UINT64 v4;
_KEVENT *v8;
INT8 PreviousMode;
__int64 v10;
NTSTATUS result;
_FILE_OBJECT *v12;
bool v13;
_ETHREAD *v14;
_FILE_OBJECT *v15;
_BYTE *v16;
NTSTATUS v17;
VOID **Pool_1;
_DEVICE_OBJECT *v19;
_IRP *v20;
_IRP *v21;
INT8 v22;
_IO_STATUS_BLOCK *p_LocalIoStatus;
_KEVENT *v24;
__int64 v25;
unsigned int Flags;
_FILE_QUOTA_INFORMATION *PoolWithQuota_1;
int v28;
_MDL *Mdl;
unsigned int *v30;
char v31;
char RequestorMode;
_FILE_OBJECT *pFileObject;
unsigned int *p_Flags;
unsigned int ErrorOffset;
PVOID KernelEvent;
PDEVICE_OBJECT DeviceObject;
PIRP Irp;
_ETHREAD *CurrentThread;
_IO_STATUS_BLOCK LocalIoStatus;
VOID *retaddr;
size_t Size;
INT64 SynchronousIo;
Size = Length;
v4 = (unsigned int)Length;
pFileObject = 0i64;
v8 = 0i64;
KernelEvent = 0i64;
LocalIoStatus = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
PreviousMode = CurrentThread->Tcb.PreviousMode;
RequestorMode = PreviousMode;
if( PreviousMode )
{
v10 = 0x7FFFFFFF0000i64;
if( (unsigned __int64)IoStatusBlock < 0x7FFFFFFF0000i64 )
v10 = (__int64)IoStatusBlock;
*(_DWORD *)v10 = *(_DWORD *)v10;
if( (_DWORD)Length )
{
if( ((unsigned __int8)Buffer & 3) != 0 )
ExRaiseDatatypeMisalignment();
if( (unsigned __int64)Buffer + (unsigned int)Length > 0x7FFFFFFF0000i64
|| (char *)Buffer + (unsigned int)Length < Buffer )
{
MEMORY[0x7FFFFFFF0000] = 0;
}
}
}
result = IopReferenceFileObject(FileHandle, 2ui64, PreviousMode, &pFileObject, 0i64);
if( result >= 0 )
{
v12 = pFileObject;
p_Flags = &pFileObject->Flags;
if( (pFileObject->Flags & 2) != 0 )
{
v13 = (pFileObject->Flags & 4) != 0;
v14 = (_ETHREAD *)KeGetCurrentThread();
--v14->Tcb.KernelApcDisable;
v15 = pFileObject;
v16 = KeAbPreAcquire(pFileObject->gap80, 0i64, 0i64);
LOBYTE(SynchronousIo) = 0;
if( _InterlockedExchange((volatile __int32 *)&v15->Busy, 1) )
{
v12 = pFileObject;
v17 = IopWaitAndAcquireFileObjectLock(pFileObject, PreviousMode, v13, v16, (INT64)&SynchronousIo);
}
else
{
if( v16 )
v16[26] |= 1u;
v12 = pFileObject;
ObfReferenceObject(pFileObject);
v17 = 0;
}
if( !(_BYTE)SynchronousIo )
{
LOBYTE(SynchronousIo) = 1;
v4 = Size;
goto LABEL_23;
}
}
else
{
Pool_1 = IopVerifierExAllocatePool_1(0x200ui64, 0x18ui64);
v8 = (_KEVENT *)Pool_1;
KernelEvent = Pool_1;
if( Pool_1 )
{
KeInitializeEvent((INT64)Pool_1, 1, 0);
LOBYTE(SynchronousIo) = 0;
LABEL_23:
IopResetEvent(v12);
LODWORD(v19) = IoGetRelatedDeviceObject((INT64)v12);
DeviceObject = v19;
v20 = IopAllocateIrpExReturn(v19, v19->StackSize, 0, retaddr);
v21 = v20;
Irp = v20;
if( !v20 )
{
if( (*p_Flags & 2) == 0 )
ExFreePoolWithTag(v8, 0);
IopAllocateIrpCleanup(v12, 0i64);
return -1073741670;
}
v20->Tail.OriginalFileObject = v12;
v20->Tail.Thread = CurrentThread;
v22 = RequestorMode;
v20->RequestorMode = RequestorMode;
if( (_BYTE)SynchronousIo )
{
v20->AllocationFlags |= 2u;
p_LocalIoStatus = IoStatusBlock;
v24 = 0i64;
}
else
{
v20->Flags = 4;
p_LocalIoStatus = &LocalIoStatus;
v24 = v8;
}
v21->UserEvent = v24;
v21->UserIosb = p_LocalIoStatus;
v21->Overlay.UserApcRoutine = 0i64;
v25 = (__int64)&v21->Tail.CurrentStackLocation[-1];
p_Flags = (unsigned int *)v25;
*(_BYTE *)v25 = 26;
*(_QWORD *)(v25 + 48) = v12;
Flags = DeviceObject->Flags;
if( (Flags & 4) != 0 )
{
ErrorOffset = 0;
if( (_DWORD)v4 )
{
PoolWithQuota_1 = (_FILE_QUOTA_INFORMATION *)IopVerifierExAllocatePoolWithQuota_1(NonPagedPoolNx, v4);
v21->AssociatedIrp.MasterIrp = (_IRP *)PoolWithQuota_1;
memmove(PoolWithQuota_1, Buffer, v4);
LODWORD(v4) = Size;
v28 = IoCheckQuotaBufferValidity(PoolWithQuota_1, Size, &ErrorOffset);
if( v28 < 0 )
{
IoStatusBlock->Status = v28;
IoStatusBlock->Information = ErrorOffset;
RtlRaiseStatus(v28);
}
v21->Flags |= 0x30u;
v22 = RequestorMode;
goto LABEL_42;
}
v21->AssociatedIrp.MasterIrp = 0i64;
}
else if( (Flags & 0x10) != 0 )
{
if( (_DWORD)v4 )
{
Mdl = IoAllocateMdl(Buffer, (unsigned int)v4, 0, 1u, v21);
if( !Mdl )
RtlRaiseStatus(-1073741670);
v30 = p_Flags;
IopProbeAndLockPages_0(Mdl, RequestorMode, 0, DeviceObject, *(unsigned __int8 *)p_Flags);
goto LABEL_43;
}
LABEL_42:
v30 = p_Flags;
LABEL_43:
v30[2] = v4;
v31 = SynchronousIo;
result = IopSynchronousServiceTail(DeviceObject, v21, v12, 0, v22, SynchronousIo, OtherTransfer);
if( !v31 )
return IopSynchronousApiServiceTail((unsigned int)result, v8, v21, v22, &LocalIoStatus, IoStatusBlock);
return result;
}
v21->UserBuffer = Buffer;
goto LABEL_42;
}
v17 = -1073741670;
}
HalPutDmaAdapter((PADAPTER_OBJECT)v12);
return v17;
}
return result;
}Referenced by:
NtSetQuotaInformationFile