internal SmbComNtCreateAndX(string name, int flags, int access, int shareAccess,
int extFileAttributes, int createOptions, ServerMessageBlock andx) : base(andx)
{
// share access specified in SmbFile
// create disposition
// create options
// security flags
Path = name;
Command = SmbComNtCreateAndx;
DesiredAccess = access;
DesiredAccess |= SmbConstants.FileReadData | SmbConstants.FileReadEa | SmbConstants.FileReadAttributes;
// extFileAttributes
this._extFileAttributes = extFileAttributes;
// shareAccess
this._shareAccess = shareAccess;
// createDisposition
if ((flags & SmbFile.OTrunc) == SmbFile.OTrunc)
{
// truncate the file
if ((flags & SmbFile.OCreat) == SmbFile.OCreat)
{
// create it if necessary
_createDisposition = FileOverwriteIf;
}
else
{
_createDisposition = FileOverwrite;
}
}
else
{
// don't truncate the file
if ((flags & SmbFile.OCreat) == SmbFile.OCreat)
{
// create it if necessary
if ((flags & SmbFile.OExcl) == SmbFile.OExcl)
{
// fail if already exists
_createDisposition = FileCreate;
}
else
{
_createDisposition = FileOpenIf;
}
}
else
{
_createDisposition = FileOpen;
}
}
if ((createOptions & unchecked(0x0001)) == 0)
{
this._createOptions = createOptions | unchecked(0x0040);
}
else
{
this._createOptions = createOptions;
}
_impersonationLevel = unchecked(0x02);
// As seen on NT :~)
_securityFlags = unchecked(unchecked(0x03));
}