RawDispatch
INT64 __fastcall RawDispatch(INT64 a1, IRP *a2){
IO_STACK_LOCATION *v3;
_ETHREAD *CurrentThread;
INT64 v5;
unsigned int v6;
unsigned int VolumeInformation;
unsigned int v8;
unsigned int v9;
unsigned int v10;
unsigned int v11;
char v13;
unsigned int v14;
unsigned int v15;
v3 = (IO_STACK_LOCATION *)*((_QWORD *)a2 + 23);
if( *(_WORD *)(a1 + 2) != 336 || (v13 = *(_BYTE *)v3, *(_BYTE *)v3 == 13) && *((_BYTE *)v3 + 1) == 1 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v5 = a1 + 336;
v6 = *(_BYTE *)v3;
if( v6 > 9 )
{
v8 = v6 - 10;
if( !v8 )
{
VolumeInformation = RawQueryVolumeInformation(a1 + 336, a2, (INT64)v3);
goto LABEL_9;
}
v9 = v8 - 3;
if( !v9 )
{
VolumeInformation = RawFileSystemControl(a1 + 336, a2, v3);
goto LABEL_9;
}
v10 = v9 - 1;
if( !v10 )
goto LABEL_8;
v11 = v10 - 4;
if( !v11 )
{
VolumeInformation = RawCleanup((PFSRTL_ADVANCED_FCB_HEADER)(a1 + 336), a2, (__int64)v3);
goto LABEL_9;
}
if( v11 == 9 )
{
if( *((_BYTE *)v3 + 1) == 1 )
{
v15 = -2147483631;
*((_DWORD *)a2 + 12) = -2147483631;
IofCompleteRequest(a2, 1);
goto LABEL_30;
}
ExAcquireFastMutex((FAST_MUTEX *)(a1 + 560));
if( (*(_DWORD *)(v5 + 104) & 2) != 0 )
{
v15 = -1073741202;
*((_DWORD *)a2 + 12) = -1073741202;
IofCompleteRequest(a2, 1);
KeReleaseGuardedMutex((_FAST_MUTEX *)(v5 + 224));
goto LABEL_30;
}
++*(_DWORD *)(v5 + 112);
KeReleaseGuardedMutex((_FAST_MUTEX *)(v5 + 224));
goto LABEL_8;
}
}
else
{
if( v6 == 9 )
{
LABEL_8:
VolumeInformation = RawReadWriteDeviceControl((PFSRTL_ADVANCED_FCB_HEADER)v5, (INT64)a2, (PSTR)v3);
LABEL_9:
v15 = VolumeInformation;
LABEL_30:
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
return v15;
}
if( !*(_BYTE *)v3 )
{
VolumeInformation = RawCreate((PFSRTL_ADVANCED_FCB_HEADER)(a1 + 336), a2);
goto LABEL_9;
}
if( v6 == 2 )
{
VolumeInformation = RawClose((PFSRTL_ADVANCED_FCB_HEADER)(a1 + 336), a2, (__int64)v3);
goto LABEL_9;
}
if( v6 > 2 )
{
if( v6 <= 4 )
goto LABEL_8;
if( v6 == 5 )
{
VolumeInformation = RawQueryInformation(a1 + 336, (INT64)a2, (INT64)v3);
goto LABEL_9;
}
if( v6 == 6 )
{
VolumeInformation = RawSetInformation(a1 + 336, a2, (INT64)v3);
goto LABEL_9;
}
}
}
KeBugCheckEx(0x22u, 0i64, 0i64, 0i64, 0i64);
}
if( (v13 & 0xED) != 0 || v13 == 16 )
v14 = -1073741808;
else
v14 = 0;
*((_DWORD *)a2 + 12) = v14;
IofCompleteRequest(a2, 1);
return v14;
}Referenced by:
No references.