RawReadWriteDeviceControl
NTSTATUS __stdcall RawReadWriteDeviceControl(PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader, INT64 Irp, PSTR a3){
BOOLEAN v6;
CHAR v7;
NTSTATUS v8;
__int64 v9;
__int64 v10;
v6 = RawBeginOperation((INT64)AdvancedHeader, *((_QWORD *)a3 + 6));
v7 = *a3;
v8 = 0;
if( v6 )
{
if( (unsigned __int8)(v7 - 3) > 1u || *((_DWORD *)a3 + 2) )
{
v9 = *(_QWORD *)(Irp + 184);
*(_OWORD *)(v9 - 72) = *(_OWORD *)a3;
*(_OWORD *)(v9 - 56) = *((_OWORD *)a3 + 1);
*(_OWORD *)(v9 - 40) = *((_OWORD *)a3 + 2);
*(_OWORD *)(v9 - 24) = *((_OWORD *)a3 + 3);
*(_QWORD *)(v9 - 8) = *((_QWORD *)a3 + 8);
*(_BYTE *)(v9 - 70) |= 2u;
v10 = *(_QWORD *)(Irp + 184);
*(_QWORD *)(v10 - 16) = RawCompletionRoutine;
*(_QWORD *)(v10 - 8) = AdvancedHeader;
*(_BYTE *)(v10 - 69) = -32;
return IofCallDriver((PDEVICE_OBJECT)AdvancedHeader[1].PushLock.Value, (PIRP)Irp);
}
RawEndOperation((INT64)AdvancedHeader, *((_QWORD *)a3 + 6));
}
else
{
if( v7 == 27 )
{
ExAcquireFastMutex((FAST_MUTEX *)&AdvancedHeader[2].PagingIoResource);
--LODWORD(AdvancedHeader[1].Resource);
if( *(_DWORD *)&AdvancedHeader[1].Flags || !RawInitiateDeleteVolume((INT64)AdvancedHeader, 0i64, 0i64) )
KeReleaseGuardedMutex((_FAST_MUTEX *)&AdvancedHeader[2].PagingIoResource);
}
v8 = -1073741202;
}
*(_DWORD *)(Irp + 48) = v8;
IofCompleteRequest((_IRP *)Irp, 1);
return v8;
}Referenced by:
RawDispatch