RawCreate
NTSTATUS __stdcall RawCreate(_VCB *Vcb, PIRP Irp, _IO_STACK_LOCATION *IrpSp){
_FAST_MUTEX *v3;
_FILE_OBJECT *FileObject;
unsigned int Options;
_VCB v9;
UINT32 ShareAccess;
unsigned int DesiredAccess;
_VCB v12;
int v13;
_CCHAR v14;
v3 = (_FAST_MUTEX *)(Vcb + 56);
ExAcquireFastMutex((PFAST_MUTEX)Vcb + 4);
FileObject = IrpSp->FileObject;
if( FileObject && (FileObject->FileName.Length || FileObject->RelatedFileObject)
|| (Options = IrpSp->Parameters.Options, (Options & 0xFF000000) != 0x1000000)
|| (Options & 1) != 0 )
{
v13 = -1073741811;
goto LABEL_15;
}
v9 = Vcb[26];
if( (v9 & 1) != 0 )
{
v13 = -1073741790;
goto LABEL_15;
}
if( (v9 & 2) != 0 )
{
v13 = -1073741202;
goto LABEL_15;
}
ShareAccess = IrpSp->Parameters.ShareAccess;
DesiredAccess = IrpSp->Parameters.SecurityContext->DesiredAccess;
if( Vcb[27] )
{
v13 = IoCheckLinkShareAccess(DesiredAccess, ShareAccess, FileObject, (PSHARE_ACCESS)(Vcb + 29), 0i64, 1u);
if( v13 >= 0 )
{
v12 = Vcb[27];
if( v12 )
goto LABEL_10;
goto LABEL_9;
}
LABEL_15:
Irp->IoStatus.Information = 0i64;
goto LABEL_11;
}
LABEL_9:
IoSetLinkShareAccess(DesiredAccess, ShareAccess, IrpSp->FileObject, (PSHARE_ACCESS)(Vcb + 29), 0i64, 0);
v12 = Vcb[27];
LABEL_10:
++Vcb[28];
Vcb[27] = v12 + 1;
v13 = 0;
IrpSp->FileObject->Vpb = (_VPB *)*((_QWORD *)Vcb + 23);
Irp->IoStatus.Information = 1i64;
IrpSp->FileObject->Flags |= 8u;
IrpSp->FileObject->FsContext = Vcb;
LABEL_11:
if( Vcb[27] || !RawInitiateDeleteVolume(Vcb, 0i64, 1ui64) )
KeReleaseGuardedMutex(v3);
LOBYTE(v14) = 1;
Irp->IoStatus.Status = v13;
IofCompleteRequest(Irp, v14);
return v13;
}Referenced by:
RawDispatch