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