NtSetEaFile
NTSTATUS __fastcall NtSetEaFile(UINT64 a1, UINT64 a2, UINT64 a3, UINT64 a4){
_IO_STATUS_BLOCK *p_LocalIoStatus;
_KEVENT *v7;
INT8 PreviousMode;
UINT64 v9;
UINT64 v10;
NTSTATUS result;
_FILE_OBJECT *v12;
unsigned int *p_Flags;
bool v14;
_ETHREAD *v15;
_FILE_OBJECT *v16;
_BYTE *v17;
int v18;
_DEVICE_OBJECT *v19;
_IRP *v20;
_IRP *v21;
char RequestorMode;
_KEVENT *v23;
_IO_STACK_LOCATION *v24;
unsigned int Flags;
size_t v26;
UINT8 v27;
VOID **Pool_3;
_FILE_FULL_EA_INFORMATION *PoolWithQuota;
int v30;
_MDL *Mdl;
UINT8 SynchronousIo;
INT8 v33;
char v34;
NTSTATUS v35;
_FILE_OBJECT *pFileObject;
unsigned int ErrorOffset;
PVOID KernelEvent;
PDEVICE_OBJECT DeviceObject;
_ETHREAD *CurrentThread;
PIRP Irp;
_IO_STATUS_BLOCK LocalIoStatus;
VOID *retaddr;
size_t Size;
Size = a4;
p_LocalIoStatus = (_IO_STATUS_BLOCK *)a2;
pFileObject = 0i64;
v7 = 0i64;
KernelEvent = 0i64;
LocalIoStatus = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
PreviousMode = CurrentThread->Tcb.PreviousMode;
v33 = PreviousMode;
if( PreviousMode )
{
v9 = 0x7FFFFFFF0000i64;
if( a2 < 0x7FFFFFFF0000i64 )
v9 = a2;
*(_DWORD *)v9 = *(_DWORD *)v9;
if( (_DWORD)a4 )
{
if( (a3 & 3) != 0 )
ExRaiseDatatypeMisalignment();
v10 = a3 + (unsigned int)a4;
if( v10 > 0x7FFFFFFF0000i64 || v10 < a3 )
MEMORY[0x7FFFFFFF0000] = 0;
}
}
result = IopReferenceFileObject((VOID *)a1, 0x10ui64, PreviousMode, &pFileObject, 0i64);
v35 = result;
if( result >= 0 )
{
v12 = pFileObject;
p_Flags = &pFileObject->Flags;
if( (pFileObject->Flags & 2) != 0 )
{
v14 = (pFileObject->Flags & 4) != 0;
v15 = (_ETHREAD *)KeGetCurrentThread();
--v15->Tcb.KernelApcDisable;
v16 = pFileObject;
v17 = KeAbPreAcquire(pFileObject->gap80, 0i64, 0i64);
SynchronousIo = 0;
if( _InterlockedExchange((volatile __int32 *)&v16->Busy, 1) )
{
v12 = pFileObject;
v18 = IopWaitAndAcquireFileObjectLock(pFileObject, PreviousMode, v14, v17, (INT64)&SynchronousIo);
}
else
{
if( v17 )
v17[26] |= 1u;
v12 = pFileObject;
ObfReferenceObject(pFileObject);
v18 = 0;
}
v35 = v18;
if( !SynchronousIo )
{
SynchronousIo = 1;
p_LocalIoStatus = (_IO_STATUS_BLOCK *)a2;
goto LABEL_18;
}
}
else
{
Pool_3 = IopVerifierExAllocatePool_3();
v7 = (_KEVENT *)Pool_3;
KernelEvent = Pool_3;
if( Pool_3 )
{
KeInitializeEvent((INT64)Pool_3, 1, 0);
SynchronousIo = 0;
LABEL_18:
IopResetEvent(v12);
LODWORD(v19) = IoGetRelatedDeviceObject((INT64)v12);
DeviceObject = v19;
v20 = IopAllocateIrpExReturn(v19, v19->StackSize, 0, retaddr);
v21 = v20;
Irp = v20;
if( v20 )
{
v20->Tail.OriginalFileObject = v12;
v20->Tail.Thread = CurrentThread;
RequestorMode = v33;
v20->RequestorMode = v33;
if( SynchronousIo )
{
v23 = 0i64;
}
else
{
v20->Flags = 4;
p_LocalIoStatus = &LocalIoStatus;
v23 = v7;
}
v21->UserEvent = v23;
v21->UserIosb = p_LocalIoStatus;
v21->Overlay.UserApcRoutine = 0i64;
v24 = v21->Tail.CurrentStackLocation - 1;
CurrentThread = (_ETHREAD *)v24;
v24->MajorFunction = 8;
v24->FileObject = v12;
Flags = DeviceObject->Flags;
if( (Flags & 4) != 0 )
{
ErrorOffset = 0;
v26 = Size;
if( Size )
{
v34 = 0;
PoolWithQuota = (_FILE_FULL_EA_INFORMATION *)IopVerifierExAllocatePoolWithQuota(0i64, Size);
v21->AssociatedIrp.MasterIrp = (_IRP *)PoolWithQuota;
memmove(PoolWithQuota, (const VOID *)a3, Size);
v30 = IoCheckEaBufferValidity(PoolWithQuota, Size, &ErrorOffset);
v35 = v30;
if( v30 < 0 )
{
v34 = 1;
*(_DWORD *)a2 = v30;
*(_QWORD *)(a2 + 8) = ErrorOffset;
RtlRaiseStatus(v30);
}
v21->Flags |= 0x30u;
RequestorMode = v33;
v24 = (_IO_STACK_LOCATION *)CurrentThread;
}
else
{
v21->AssociatedIrp.MasterIrp = 0i64;
}
}
else
{
v26 = Size;
if( (Flags & 0x10) != 0 )
{
if( Size )
{
Mdl = IoAllocateMdl((VOID *)a3, Size, 0, 1u, v21);
if( !Mdl )
RtlRaiseStatus(-1073741670);
IopProbeAndLockPages_2(Mdl, RequestorMode, 0, DeviceObject, v24->MajorFunction);
}
}
else
{
v21->UserBuffer = (void *)a3;
}
}
LODWORD(v24->Parameters.SecurityContext) = v26;
v27 = SynchronousIo;
result = IopSynchronousServiceTail(DeviceObject, v21, v12, 0, RequestorMode, SynchronousIo, OtherTransfer);
if( !v27 )
return IopSynchronousApiServiceTail(
(unsigned int)result,
v7,
v21,
RequestorMode,
&LocalIoStatus,
(_IO_STATUS_BLOCK *)a2);
}
else
{
if( (*p_Flags & 2) == 0 )
ExFreePoolWithTag(v7, 0);
IopAllocateIrpCleanup(v12, 0i64);
return -1073741670;
}
return result;
}
v18 = -1073741670;
}
HalPutDmaAdapter((PADAPTER_OBJECT)v12);
return v18;
}
return result;
}Referenced by:
No references.