NtSetEaFile
NTSTATUS __stdcall NtSetEaFile(PVOID FileHandle, IO_STATUS_BLOCK *IoStatusBlock, PVOID Buffer, UINT64 a4){
IO_STATUS_BLOCK *v5;
_KEVENT *v7;
INT8 v8;
__int64 v9;
char *v10;
NTSTATUS result;
struct _DMA_ADAPTER *v12;
_DWORD *v13;
_ETHREAD *v14;
volatile __int32 *v15;
__int64 v16;
INT64 v17;
IRP *v18;
IRP *Irp;
CHAR v20;
_KEVENT *v21;
_ETHREAD *v22;
int v23;
ULONG v24;
_KEVENT *Pool_3;
UINT8 *PoolWithQuota;
int v27;
MDL *Mdl;
UINT64 v29;
CHAR a2;
char a2_1;
PVOID Object;
ULONG ErrorOffset;
PVOID P;
PDEVICE_OBJECT DeviceObject;
_ETHREAD *CurrentThread;
PIRP v37;
int v38[6];
VOID *retaddr;
ULONG Size;
Size = a4;
v5 = IoStatusBlock;
Object = 0i64;
v7 = 0i64;
P = 0i64;
*(_OWORD *)v38 = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v8 = *((_BYTE *)CurrentThread + 562);
a2_1 = v8;
if( v8 )
{
v9 = 0x7FFFFFFF0000i64;
if( (unsigned __int64)IoStatusBlock < 0x7FFFFFFF0000i64 )
v9 = (__int64)IoStatusBlock;
*(_DWORD *)v9 = *(_DWORD *)v9;
if( (_DWORD)a4 )
{
if( ((unsigned __int8)Buffer & 3) != 0 )
ExRaiseDatatypeMisalignment();
v10 = (char *)Buffer + (unsigned int)a4;
if( (unsigned __int64)v10 > 0x7FFFFFFF0000i64 || v10 < Buffer )
MEMORY[0x7FFFFFFF0000] = 0;
}
}
result = IopReferenceFileObject(FileHandle, 0x10ui64, v8, (FILE_OBJECT **)&Object, 0i64);
if( result >= 0 )
{
v12 = (struct _DMA_ADAPTER *)Object;
v13 = (char *)Object + 80;
if( (*((_DWORD *)Object + 20) & 2) != 0 )
{
v14 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v14 + 242);
v15 = (volatile __int32 *)Object;
LODWORD(v16) = KeAbPreAcquire((char *)Object + 128, 0i64, 0i64);
if( _InterlockedExchange(v15 + 29, 1) )
{
LOBYTE(v17) = v8;
v12 = (struct _DMA_ADAPTER *)Object;
IopWaitAndAcquireFileObjectLock(Object, v17);
}
else
{
if( v16 )
*(_BYTE *)(v16 + 26) |= 1u;
v12 = (struct _DMA_ADAPTER *)Object;
ObfReferenceObject(Object);
}
a2 = 1;
v5 = IoStatusBlock;
}
else
{
Pool_3 = (_KEVENT *)IopVerifierExAllocatePool_3();
v7 = Pool_3;
P = Pool_3;
if( !Pool_3 )
{
HalPutDmaAdapter(v12);
return -1073741670;
}
KeInitializeEvent(Pool_3, SynchronizationEvent, 0);
a2 = 0;
}
IopResetEvent((FILE_OBJECT *)v12);
DeviceObject = IoGetRelatedDeviceObject((_FILE_OBJECT *)v12);
v18 = IopAllocateIrpExReturn(DeviceObject, *((_BYTE *)DeviceObject + 76), 0, retaddr);
Irp = v18;
v37 = v18;
if( v18 )
{
*((_QWORD *)v18 + 24) = v12;
*((_QWORD *)v18 + 19) = CurrentThread;
v20 = a2_1;
*((_BYTE *)v18 + 64) = a2_1;
if( a2 )
{
v21 = 0i64;
}
else
{
*((_DWORD *)v18 + 4) = 4;
v5 = (IO_STATUS_BLOCK *)v38;
v21 = v7;
}
*((_QWORD *)Irp + 10) = v21;
*((_QWORD *)Irp + 9) = v5;
*((_QWORD *)Irp + 11) = 0i64;
v22 = (_ETHREAD *)(*((_QWORD *)Irp + 23) - 72i64);
CurrentThread = v22;
*(_BYTE *)v22 = 8;
*((_QWORD *)v22 + 6) = v12;
v23 = *((_DWORD *)DeviceObject + 12);
if( (v23 & 4) != 0 )
{
ErrorOffset = 0;
v24 = Size;
if( Size )
{
PoolWithQuota = (UINT8 *)IopVerifierExAllocatePoolWithQuota(NonPagedPool, Size);
*((_QWORD *)Irp + 3) = PoolWithQuota;
memmove(PoolWithQuota, (UINT8 *)Buffer, Size);
v27 = IoCheckEaBufferValidity((PFILE_FULL_EA_INFORMATION)PoolWithQuota, Size, &ErrorOffset);
if( v27 < 0 )
{
IoStatusBlock->Status = v27;
IoStatusBlock->Information = ErrorOffset;
RtlRaiseStatus(v27);
}
*((_DWORD *)Irp + 4) |= 0x30u;
v20 = a2_1;
v22 = CurrentThread;
}
else
{
*((_QWORD *)Irp + 3) = 0i64;
}
}
else
{
v24 = Size;
if( (v23 & 0x10) != 0 )
{
if( Size )
{
Mdl = IoAllocateMdl(Buffer, Size, 0, 1u, Irp);
if( !Mdl )
RtlRaiseStatus(-1073741670);
IopProbeAndLockPages_2(Mdl, a2_1, 0, DeviceObject, *(_BYTE *)v22);
}
}
else
{
*((_QWORD *)Irp + 14) = Buffer;
}
}
*((_DWORD *)v22 + 2) = v24;
LODWORD(v29) = 2;
result = IopSynchronousServiceTail(DeviceObject, Irp, (FILE_OBJECT *)v12, 0, v20, a2, v29);
if( !a2 )
return IopSynchronousApiServiceTail((unsigned int)result, v7, Irp, v20, (_IO_STATUS_BLOCK *)v38, IoStatusBlock);
}
else
{
if( (*v13 & 2) == 0 )
ExFreePoolWithTag(v7, 0);
IopAllocateIrpCleanup((PUNICODE_STRING)v12);
return -1073741670;
}
}
return result;
}Referenced by:
No references.