RawDispatch
NTSTATUS __stdcall RawDispatch(_VOLUME_DEVICE_OBJECT *VolumeDeviceObject, _IRP *Irp){
_IRP *v2;
_IO_STACK_LOCATION *CurrentStackLocation;
_ETHREAD *CurrentThread;
_FAST_MUTEX *v5;
unsigned int MajorFunction;
NTSTATUS VolumeInformation;
unsigned int v8;
unsigned int v9;
unsigned int v10;
_CCHAR v11;
_CCHAR v12;
unsigned __int8 v14;
int v15;
NTSTATUS v16;
v2 = Irp;
CurrentStackLocation = Irp->Tail.CurrentStackLocation;
if( *((_WORD *)VolumeDeviceObject + 1) != 336
|| (v14 = CurrentStackLocation->MajorFunction, CurrentStackLocation->MajorFunction == 13)
&& CurrentStackLocation->MinorFunction == 1 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
v5 = (_FAST_MUTEX *)(VolumeDeviceObject + 84);
MajorFunction = CurrentStackLocation->MajorFunction;
if( MajorFunction > 9 )
{
v8 = MajorFunction - 10;
if( !v8 )
{
VolumeInformation = RawQueryVolumeInformation(VolumeDeviceObject + 84, v2, CurrentStackLocation);
goto LABEL_9;
}
v9 = v8 - 3;
if( !v9 )
{
VolumeInformation = RawFileSystemControl(VolumeDeviceObject + 84, v2, CurrentStackLocation);
goto LABEL_9;
}
v10 = v9 - 1;
if( !v10 )
goto LABEL_8;
v11 = v10 - 4;
if( !v11 )
{
VolumeInformation = RawCleanup(VolumeDeviceObject + 84, v2, CurrentStackLocation);
goto LABEL_9;
}
if( v11 == 9 )
{
if( CurrentStackLocation->MinorFunction == 1 )
{
v16 = -2147483631;
v2->IoStatus.Status = -2147483631;
LOBYTE(v11) = 1;
IofCompleteRequest(v2, v11);
goto LABEL_30;
}
ExAcquireFastMutex((PFAST_MUTEX)VolumeDeviceObject + 10);
if( (v5[1].OldIrql & 2) != 0 )
{
v16 = -1073741202;
v2->IoStatus.Status = -1073741202;
LOBYTE(v12) = 1;
IofCompleteRequest(v2, v12);
KeReleaseGuardedMutex(v5 + 4);
goto LABEL_30;
}
++v5[2].Count;
KeReleaseGuardedMutex(v5 + 4);
goto LABEL_8;
}
}
else
{
if( MajorFunction == 9 )
{
LABEL_8:
VolumeInformation = RawReadWriteDeviceControl(&v5->Count, v2, CurrentStackLocation);
LABEL_9:
v16 = VolumeInformation;
LABEL_30:
KeLeaveCriticalRegionThread(KeGetCurrentThread());
return v16;
}
if( !CurrentStackLocation->MajorFunction )
{
VolumeInformation = RawCreate(VolumeDeviceObject + 84, v2, CurrentStackLocation);
goto LABEL_9;
}
if( MajorFunction == 2 )
{
VolumeInformation = RawClose(VolumeDeviceObject + 84, v2, CurrentStackLocation);
goto LABEL_9;
}
if( MajorFunction > 2 )
{
if( MajorFunction <= 4 )
goto LABEL_8;
if( MajorFunction == 5 )
{
VolumeInformation = RawQueryInformation(VolumeDeviceObject + 84, v2, CurrentStackLocation);
goto LABEL_9;
}
if( MajorFunction == 6 )
{
VolumeInformation = RawSetInformation(VolumeDeviceObject + 84, v2, CurrentStackLocation);
goto LABEL_9;
}
}
}
KeBugCheckEx(0x22u, 0i64, 0i64, 0i64, 0i64);
}
if( (v14 & 0xED) != 0 || v14 == 16 )
v15 = -1073741808;
else
v15 = 0;
Irp->IoStatus.Status = v15;
LOBYTE(Irp) = 1;
IofCompleteRequest(v2, (_CCHAR)Irp);
return v15;
}Referenced by:
No references.