mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 23:22:57 +00:00
[FASTFAT]
More FastFAT cleanup. Except a light performances boost due to useless checks removal in read/write and to some functions inlining More to follow... svn path=/trunk/; revision=73819
This commit is contained in:
parent
2667ff688f
commit
92922765ac
16 changed files with 150 additions and 138 deletions
|
@ -56,7 +56,7 @@ VfatReadWritePartialCompletion(
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 == InterlockedDecrement((PLONG)&IrpContext->RefCount) &&
|
if (0 == InterlockedDecrement((PLONG)&IrpContext->RefCount) &&
|
||||||
IrpContext->Flags & IRPCONTEXT_PENDINGRETURNED)
|
BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_PENDINGRETURNED))
|
||||||
{
|
{
|
||||||
KeSetEvent(&IrpContext->Event, IO_NO_INCREMENT, FALSE);
|
KeSetEvent(&IrpContext->Event, IO_NO_INCREMENT, FALSE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,7 @@ VfatCleanupFile(
|
||||||
if (!pFcb)
|
if (!pFcb)
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
|
|
||||||
if (pFcb->Flags & FCB_IS_VOLUME)
|
if (BooleanFlagOn(pFcb->Flags, FCB_IS_VOLUME))
|
||||||
{
|
{
|
||||||
pFcb->OpenHandleCount--;
|
pFcb->OpenHandleCount--;
|
||||||
|
|
||||||
|
@ -76,12 +76,12 @@ VfatCleanupFile(
|
||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pFcb->Flags & FCB_IS_DIRTY)
|
if (BooleanFlagOn(pFcb->Flags, FCB_IS_DIRTY))
|
||||||
{
|
{
|
||||||
VfatUpdateEntry (pFcb);
|
VfatUpdateEntry (pFcb);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pFcb->Flags & FCB_DELETE_PENDING &&
|
if (BooleanFlagOn(pFcb->Flags, FCB_DELETE_PENDING) &&
|
||||||
pFcb->OpenHandleCount == 0)
|
pFcb->OpenHandleCount == 0)
|
||||||
{
|
{
|
||||||
if (vfatFCBIsDirectory(pFcb) &&
|
if (vfatFCBIsDirectory(pFcb) &&
|
||||||
|
@ -109,7 +109,7 @@ VfatCleanupFile(
|
||||||
/* Uninitialize the cache (should be done even if caching was never initialized) */
|
/* Uninitialize the cache (should be done even if caching was never initialized) */
|
||||||
CcUninitializeCacheMap(FileObject, &pFcb->RFCB.FileSize, NULL);
|
CcUninitializeCacheMap(FileObject, &pFcb->RFCB.FileSize, NULL);
|
||||||
|
|
||||||
if (pFcb->Flags & FCB_DELETE_PENDING &&
|
if (BooleanFlagOn(pFcb->Flags, FCB_DELETE_PENDING) &&
|
||||||
pFcb->OpenHandleCount == 0)
|
pFcb->OpenHandleCount == 0)
|
||||||
{
|
{
|
||||||
VfatDelEntry(DeviceExt, pFcb, NULL);
|
VfatDelEntry(DeviceExt, pFcb, NULL);
|
||||||
|
@ -120,8 +120,8 @@ VfatCleanupFile(
|
||||||
pFcb->PathNameU.Length - pFcb->LongNameU.Length,
|
pFcb->PathNameU.Length - pFcb->LongNameU.Length,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
((*pFcb->Attributes & FILE_ATTRIBUTE_DIRECTORY) ?
|
VfatIsDirectoryEmpty(pFcb) ?
|
||||||
FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME),
|
FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME,
|
||||||
FILE_ACTION_REMOVED,
|
FILE_ACTION_REMOVED,
|
||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
@ -138,7 +138,7 @@ VfatCleanupFile(
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_SWAPOUT
|
#ifdef ENABLE_SWAPOUT
|
||||||
if (DeviceExt->Flags & VCB_DISMOUNT_PENDING)
|
if (BooleanFlagOn(DeviceExt->Flags, VCB_DISMOUNT_PENDING))
|
||||||
{
|
{
|
||||||
VfatCheckForDismount(DeviceExt, FALSE);
|
VfatCheckForDismount(DeviceExt, FALSE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,7 @@ VfatCloseFile(
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pFcb->Flags & FCB_IS_VOLUME)
|
if (BooleanFlagOn(pFcb->Flags, FCB_IS_VOLUME))
|
||||||
{
|
{
|
||||||
DPRINT("Volume\n");
|
DPRINT("Volume\n");
|
||||||
FileObject->FsContext2 = NULL;
|
FileObject->FsContext2 = NULL;
|
||||||
|
|
|
@ -57,7 +57,7 @@ vfat8Dot3ToString(
|
||||||
|
|
||||||
RtlOemStringToUnicodeString(NameU, &StringA, FALSE);
|
RtlOemStringToUnicodeString(NameU, &StringA, FALSE);
|
||||||
|
|
||||||
if (pEntry->lCase & VFAT_CASE_LOWER_BASE)
|
if (BooleanFlagOn(pEntry->lCase, VFAT_CASE_LOWER_BASE))
|
||||||
{
|
{
|
||||||
RtlDowncaseUnicodeString(NameU, NameU, FALSE);
|
RtlDowncaseUnicodeString(NameU, NameU, FALSE);
|
||||||
}
|
}
|
||||||
|
@ -81,7 +81,7 @@ vfat8Dot3ToString(
|
||||||
StringA.Length++);
|
StringA.Length++);
|
||||||
StringA.MaximumLength = StringA.Length;
|
StringA.MaximumLength = StringA.Length;
|
||||||
RtlOemStringToUnicodeString(NameU, &StringA, FALSE);
|
RtlOemStringToUnicodeString(NameU, &StringA, FALSE);
|
||||||
if (pEntry->lCase & VFAT_CASE_LOWER_EXT)
|
if (BooleanFlagOn(pEntry->lCase, VFAT_CASE_LOWER_EXT))
|
||||||
{
|
{
|
||||||
RtlDowncaseUnicodeString(NameU, NameU, FALSE);
|
RtlDowncaseUnicodeString(NameU, NameU, FALSE);
|
||||||
}
|
}
|
||||||
|
@ -119,7 +119,7 @@ ReadVolumeLabel(
|
||||||
*(Vpb->VolumeLabel) = 0;
|
*(Vpb->VolumeLabel) = 0;
|
||||||
Vpb->VolumeLabelLength = 0;
|
Vpb->VolumeLabelLength = 0;
|
||||||
|
|
||||||
if (DeviceExt->Flags & VCB_IS_FATX)
|
if (BooleanFlagOn(DeviceExt->Flags, VCB_IS_FATX))
|
||||||
{
|
{
|
||||||
SizeDirEntry = sizeof(FATX_DIR_ENTRY);
|
SizeDirEntry = sizeof(FATX_DIR_ENTRY);
|
||||||
EntriesPerPage = FATX_ENTRIES_PER_PAGE;
|
EntriesPerPage = FATX_ENTRIES_PER_PAGE;
|
||||||
|
@ -151,7 +151,7 @@ ReadVolumeLabel(
|
||||||
if (ENTRY_VOLUME(DeviceExt, Entry))
|
if (ENTRY_VOLUME(DeviceExt, Entry))
|
||||||
{
|
{
|
||||||
/* copy volume label */
|
/* copy volume label */
|
||||||
if (DeviceExt->Flags & VCB_IS_FATX)
|
if (BooleanFlagOn(DeviceExt->Flags, VCB_IS_FATX))
|
||||||
{
|
{
|
||||||
StringO.Buffer = (PCHAR)Entry->FatX.Filename;
|
StringO.Buffer = (PCHAR)Entry->FatX.Filename;
|
||||||
StringO.MaximumLength = StringO.Length = Entry->FatX.FilenameLength;
|
StringO.MaximumLength = StringO.Length = Entry->FatX.FilenameLength;
|
||||||
|
@ -259,7 +259,7 @@ FindFile(
|
||||||
if (rcFcb)
|
if (rcFcb)
|
||||||
{
|
{
|
||||||
ULONG startIndex = rcFcb->startIndex;
|
ULONG startIndex = rcFcb->startIndex;
|
||||||
if ((rcFcb->Flags & FCB_IS_FATX_ENTRY) && !vfatFCBIsRoot(Parent))
|
if (BooleanFlagOn(rcFcb->Flags, FCB_IS_FATX_ENTRY) && !vfatFCBIsRoot(Parent))
|
||||||
{
|
{
|
||||||
startIndex += 2;
|
startIndex += 2;
|
||||||
}
|
}
|
||||||
|
@ -436,7 +436,7 @@ VfatOpenFile(
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fail, if we try to overwrite an existing directory */
|
/* Fail, if we try to overwrite an existing directory */
|
||||||
if ((!(RequestedOptions & FILE_DIRECTORY_FILE) && (*Fcb->Attributes & FILE_ATTRIBUTE_DIRECTORY)) &&
|
if ((!BooleanFlagOn(RequestedOptions, FILE_DIRECTORY_FILE) && vfatFCBIsDirectory(Fcb)) &&
|
||||||
(RequestedDisposition == FILE_OVERWRITE ||
|
(RequestedDisposition == FILE_OVERWRITE ||
|
||||||
RequestedDisposition == FILE_OVERWRITE_IF ||
|
RequestedDisposition == FILE_OVERWRITE_IF ||
|
||||||
RequestedDisposition == FILE_SUPERSEDE))
|
RequestedDisposition == FILE_SUPERSEDE))
|
||||||
|
@ -445,14 +445,14 @@ VfatOpenFile(
|
||||||
return STATUS_OBJECT_NAME_COLLISION;
|
return STATUS_OBJECT_NAME_COLLISION;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Fcb->Flags & FCB_DELETE_PENDING)
|
if (BooleanFlagOn(Fcb->Flags, FCB_DELETE_PENDING))
|
||||||
{
|
{
|
||||||
vfatReleaseFCB(DeviceExt, Fcb);
|
vfatReleaseFCB(DeviceExt, Fcb);
|
||||||
return STATUS_DELETE_PENDING;
|
return STATUS_DELETE_PENDING;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fail, if we try to overwrite a read-only file */
|
/* Fail, if we try to overwrite a read-only file */
|
||||||
if ((*Fcb->Attributes & FILE_ATTRIBUTE_READONLY) &&
|
if (vfatFCBIsReadOnly(Fcb) &&
|
||||||
(RequestedDisposition == FILE_OVERWRITE ||
|
(RequestedDisposition == FILE_OVERWRITE ||
|
||||||
RequestedDisposition == FILE_OVERWRITE_IF))
|
RequestedDisposition == FILE_OVERWRITE_IF))
|
||||||
{
|
{
|
||||||
|
@ -460,7 +460,7 @@ VfatOpenFile(
|
||||||
return STATUS_ACCESS_DENIED;
|
return STATUS_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((*Fcb->Attributes & FILE_ATTRIBUTE_READONLY) &&
|
if (vfatFCBIsReadOnly(Fcb) &&
|
||||||
(RequestedOptions & FILE_DELETE_ON_CLOSE))
|
(RequestedOptions & FILE_DELETE_ON_CLOSE))
|
||||||
{
|
{
|
||||||
vfatReleaseFCB(DeviceExt, Fcb);
|
vfatReleaseFCB(DeviceExt, Fcb);
|
||||||
|
@ -470,7 +470,7 @@ VfatOpenFile(
|
||||||
if ((vfatFCBIsRoot(Fcb) ||
|
if ((vfatFCBIsRoot(Fcb) ||
|
||||||
(Fcb->LongNameU.Length == sizeof(WCHAR) && Fcb->LongNameU.Buffer[0] == L'.') ||
|
(Fcb->LongNameU.Length == sizeof(WCHAR) && Fcb->LongNameU.Buffer[0] == L'.') ||
|
||||||
(Fcb->LongNameU.Length == 2 * sizeof(WCHAR) && Fcb->LongNameU.Buffer[0] == L'.' && Fcb->LongNameU.Buffer[1] == L'.')) &&
|
(Fcb->LongNameU.Length == 2 * sizeof(WCHAR) && Fcb->LongNameU.Buffer[0] == L'.' && Fcb->LongNameU.Buffer[1] == L'.')) &&
|
||||||
(RequestedOptions & FILE_DELETE_ON_CLOSE))
|
BooleanFlagOn(RequestedOptions, FILE_DELETE_ON_CLOSE))
|
||||||
{
|
{
|
||||||
// we cannot delete a '.', '..' or the root directory
|
// we cannot delete a '.', '..' or the root directory
|
||||||
vfatReleaseFCB(DeviceExt, Fcb);
|
vfatReleaseFCB(DeviceExt, Fcb);
|
||||||
|
@ -513,32 +513,32 @@ VfatCreateFile(
|
||||||
Stack = IoGetCurrentIrpStackLocation(Irp);
|
Stack = IoGetCurrentIrpStackLocation(Irp);
|
||||||
RequestedDisposition = ((Stack->Parameters.Create.Options >> 24) & 0xff);
|
RequestedDisposition = ((Stack->Parameters.Create.Options >> 24) & 0xff);
|
||||||
RequestedOptions = Stack->Parameters.Create.Options & FILE_VALID_OPTION_FLAGS;
|
RequestedOptions = Stack->Parameters.Create.Options & FILE_VALID_OPTION_FLAGS;
|
||||||
PagingFileCreate = (Stack->Flags & SL_OPEN_PAGING_FILE) ? TRUE : FALSE;
|
PagingFileCreate = BooleanFlagOn(Stack->Flags, SL_OPEN_PAGING_FILE);
|
||||||
OpenTargetDir = (Stack->Flags & SL_OPEN_TARGET_DIRECTORY) ? TRUE : FALSE;
|
OpenTargetDir = BooleanFlagOn(Stack->Flags, SL_OPEN_TARGET_DIRECTORY);
|
||||||
|
|
||||||
FileObject = Stack->FileObject;
|
FileObject = Stack->FileObject;
|
||||||
DeviceExt = DeviceObject->DeviceExtension;
|
DeviceExt = DeviceObject->DeviceExtension;
|
||||||
|
|
||||||
if (Stack->Parameters.Create.Options & FILE_OPEN_BY_FILE_ID)
|
if (BooleanFlagOn(Stack->Parameters.Create.Options, FILE_OPEN_BY_FILE_ID))
|
||||||
{
|
{
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check their validity. */
|
/* Check their validity. */
|
||||||
if (RequestedOptions & FILE_DIRECTORY_FILE &&
|
if (BooleanFlagOn(RequestedOptions, FILE_DIRECTORY_FILE) &&
|
||||||
RequestedDisposition == FILE_SUPERSEDE)
|
RequestedDisposition == FILE_SUPERSEDE)
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RequestedOptions & FILE_DIRECTORY_FILE &&
|
if (BooleanFlagOn(RequestedOptions, FILE_DIRECTORY_FILE) &&
|
||||||
RequestedOptions & FILE_NON_DIRECTORY_FILE)
|
BooleanFlagOn(RequestedOptions, FILE_NON_DIRECTORY_FILE))
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Deny create if the volume is locked */
|
/* Deny create if the volume is locked */
|
||||||
if (DeviceExt->Flags & VCB_VOLUME_LOCKED)
|
if (BooleanFlagOn(DeviceExt->Flags, VCB_VOLUME_LOCKED))
|
||||||
{
|
{
|
||||||
return STATUS_ACCESS_DENIED;
|
return STATUS_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
|
@ -569,7 +569,7 @@ VfatCreateFile(
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RequestedOptions & FILE_DELETE_ON_CLOSE)
|
if (BooleanFlagOn(RequestedOptions, FILE_DELETE_ON_CLOSE))
|
||||||
{
|
{
|
||||||
return STATUS_CANNOT_DELETE;
|
return STATUS_CANNOT_DELETE;
|
||||||
}
|
}
|
||||||
|
@ -798,11 +798,11 @@ VfatCreateFile(
|
||||||
RequestedDisposition == FILE_SUPERSEDE)
|
RequestedDisposition == FILE_SUPERSEDE)
|
||||||
{
|
{
|
||||||
Attributes = Stack->Parameters.Create.FileAttributes & ~FILE_ATTRIBUTE_NORMAL;
|
Attributes = Stack->Parameters.Create.FileAttributes & ~FILE_ATTRIBUTE_NORMAL;
|
||||||
if (!(RequestedOptions & FILE_DIRECTORY_FILE))
|
if (!BooleanFlagOn(RequestedOptions, FILE_DIRECTORY_FILE))
|
||||||
Attributes |= FILE_ATTRIBUTE_ARCHIVE;
|
Attributes |= FILE_ATTRIBUTE_ARCHIVE;
|
||||||
vfatSplitPathName(&PathNameU, NULL, &FileNameU);
|
vfatSplitPathName(&PathNameU, NULL, &FileNameU);
|
||||||
Status = VfatAddEntry(DeviceExt, &FileNameU, &pFcb, ParentFcb, RequestedOptions,
|
Status = VfatAddEntry(DeviceExt, &FileNameU, &pFcb, ParentFcb, RequestedOptions,
|
||||||
(UCHAR)(Attributes & FILE_ATTRIBUTE_VALID_FLAGS), NULL);
|
(UCHAR)FlagOn(Attributes, FILE_ATTRIBUTE_VALID_FLAGS), NULL);
|
||||||
vfatReleaseFCB(DeviceExt, ParentFcb);
|
vfatReleaseFCB(DeviceExt, ParentFcb);
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
|
@ -875,22 +875,22 @@ VfatCreateFile(
|
||||||
/*
|
/*
|
||||||
* Check the file has the requested attributes
|
* Check the file has the requested attributes
|
||||||
*/
|
*/
|
||||||
if (RequestedOptions & FILE_NON_DIRECTORY_FILE &&
|
if (BooleanFlagOn(RequestedOptions, FILE_NON_DIRECTORY_FILE) &&
|
||||||
*pFcb->Attributes & FILE_ATTRIBUTE_DIRECTORY)
|
vfatFCBIsDirectory(pFcb))
|
||||||
{
|
{
|
||||||
VfatCloseFile (DeviceExt, FileObject);
|
VfatCloseFile (DeviceExt, FileObject);
|
||||||
return STATUS_FILE_IS_A_DIRECTORY;
|
return STATUS_FILE_IS_A_DIRECTORY;
|
||||||
}
|
}
|
||||||
if (RequestedOptions & FILE_DIRECTORY_FILE &&
|
if (BooleanFlagOn(RequestedOptions, FILE_DIRECTORY_FILE) &&
|
||||||
!(*pFcb->Attributes & FILE_ATTRIBUTE_DIRECTORY))
|
!vfatFCBIsDirectory(pFcb))
|
||||||
{
|
{
|
||||||
VfatCloseFile (DeviceExt, FileObject);
|
VfatCloseFile (DeviceExt, FileObject);
|
||||||
return STATUS_NOT_A_DIRECTORY;
|
return STATUS_NOT_A_DIRECTORY;
|
||||||
}
|
}
|
||||||
#ifndef USE_ROS_CC_AND_FS
|
#ifndef USE_ROS_CC_AND_FS
|
||||||
if (!(*pFcb->Attributes & FILE_ATTRIBUTE_DIRECTORY))
|
if (!vfatFCBIsDirectory(pFcb))
|
||||||
{
|
{
|
||||||
if (Stack->Parameters.Create.SecurityContext->DesiredAccess & FILE_WRITE_DATA ||
|
if (BooleanFlagOn(Stack->Parameters.Create.SecurityContext->DesiredAccess, FILE_WRITE_DATA) ||
|
||||||
RequestedDisposition == FILE_OVERWRITE ||
|
RequestedDisposition == FILE_OVERWRITE ||
|
||||||
RequestedDisposition == FILE_OVERWRITE_IF ||
|
RequestedDisposition == FILE_OVERWRITE_IF ||
|
||||||
(RequestedOptions & FILE_DELETE_ON_CLOSE))
|
(RequestedOptions & FILE_DELETE_ON_CLOSE))
|
||||||
|
@ -901,7 +901,7 @@ VfatCreateFile(
|
||||||
DPRINT1("%d %d %d\n", Stack->Parameters.Create.SecurityContext->DesiredAccess & FILE_WRITE_DATA,
|
DPRINT1("%d %d %d\n", Stack->Parameters.Create.SecurityContext->DesiredAccess & FILE_WRITE_DATA,
|
||||||
RequestedDisposition == FILE_OVERWRITE, RequestedDisposition == FILE_OVERWRITE_IF);
|
RequestedDisposition == FILE_OVERWRITE, RequestedDisposition == FILE_OVERWRITE_IF);
|
||||||
VfatCloseFile (DeviceExt, FileObject);
|
VfatCloseFile (DeviceExt, FileObject);
|
||||||
return (RequestedOptions & FILE_DELETE_ON_CLOSE) ? STATUS_CANNOT_DELETE
|
return (BooleanFlagOn(RequestedOptions, FILE_DELETE_ON_CLOSE)) ? STATUS_CANNOT_DELETE
|
||||||
: STATUS_SHARING_VIOLATION;
|
: STATUS_SHARING_VIOLATION;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -919,7 +919,7 @@ VfatCreateFile(
|
||||||
*/
|
*/
|
||||||
if (pFcb->RefCount > 1)
|
if (pFcb->RefCount > 1)
|
||||||
{
|
{
|
||||||
if(!(pFcb->Flags & FCB_IS_PAGE_FILE))
|
if(!BooleanFlagOn(pFcb->Flags, FCB_IS_PAGE_FILE))
|
||||||
{
|
{
|
||||||
VfatCloseFile(DeviceExt, FileObject);
|
VfatCloseFile(DeviceExt, FileObject);
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
@ -932,7 +932,7 @@ VfatCreateFile(
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (pFcb->Flags & FCB_IS_PAGE_FILE)
|
if (BooleanFlagOn(pFcb->Flags, FCB_IS_PAGE_FILE))
|
||||||
{
|
{
|
||||||
VfatCloseFile(DeviceExt, FileObject);
|
VfatCloseFile(DeviceExt, FileObject);
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
@ -943,7 +943,7 @@ VfatCreateFile(
|
||||||
RequestedDisposition == FILE_OVERWRITE_IF ||
|
RequestedDisposition == FILE_OVERWRITE_IF ||
|
||||||
RequestedDisposition == FILE_SUPERSEDE)
|
RequestedDisposition == FILE_SUPERSEDE)
|
||||||
{
|
{
|
||||||
if (!(*pFcb->Attributes & FILE_ATTRIBUTE_DIRECTORY))
|
if (!vfatFCBIsDirectory(pFcb))
|
||||||
{
|
{
|
||||||
*pFcb->Attributes = Stack->Parameters.Create.FileAttributes & ~FILE_ATTRIBUTE_NORMAL;
|
*pFcb->Attributes = Stack->Parameters.Create.FileAttributes & ~FILE_ATTRIBUTE_NORMAL;
|
||||||
*pFcb->Attributes |= FILE_ATTRIBUTE_ARCHIVE;
|
*pFcb->Attributes |= FILE_ATTRIBUTE_ARCHIVE;
|
||||||
|
@ -999,7 +999,7 @@ VfatCreateFile(
|
||||||
pFcb->PathNameU.Length - pFcb->LongNameU.Length,
|
pFcb->PathNameU.Length - pFcb->LongNameU.Length,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
((*pFcb->Attributes & FILE_ATTRIBUTE_DIRECTORY) ?
|
(vfatFCBIsDirectory(pFcb) ?
|
||||||
FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME),
|
FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME),
|
||||||
FILE_ACTION_ADDED,
|
FILE_ACTION_ADDED,
|
||||||
NULL);
|
NULL);
|
||||||
|
@ -1034,7 +1034,7 @@ VfatCreate(
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(IrpContext->Flags & IRPCONTEXT_CANWAIT))
|
if (!BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT))
|
||||||
{
|
{
|
||||||
return VfatMarkIrpContextForQueue(IrpContext);
|
return VfatMarkIrpContextForQueue(IrpContext);
|
||||||
}
|
}
|
||||||
|
|
|
@ -127,7 +127,7 @@ VfatGetFileDirectoryInformation(
|
||||||
DirContext->LongNameU.Buffer,
|
DirContext->LongNameU.Buffer,
|
||||||
DirContext->LongNameU.Length);
|
DirContext->LongNameU.Length);
|
||||||
|
|
||||||
if (DeviceExt->Flags & VCB_IS_FATX)
|
if (BooleanFlagOn(DeviceExt->Flags, VCB_IS_FATX))
|
||||||
{
|
{
|
||||||
FsdDosDateTimeToSystemTime(DeviceExt,
|
FsdDosDateTimeToSystemTime(DeviceExt,
|
||||||
DirContext->DirEntry.FatX.CreationDate,
|
DirContext->DirEntry.FatX.CreationDate,
|
||||||
|
@ -144,7 +144,7 @@ VfatGetFileDirectoryInformation(
|
||||||
|
|
||||||
pInfo->ChangeTime = pInfo->LastWriteTime;
|
pInfo->ChangeTime = pInfo->LastWriteTime;
|
||||||
|
|
||||||
if (DirContext->DirEntry.FatX.Attrib & FILE_ATTRIBUTE_DIRECTORY)
|
if (BooleanFlagOn(DirContext->DirEntry.FatX.Attrib, FILE_ATTRIBUTE_DIRECTORY))
|
||||||
{
|
{
|
||||||
pInfo->EndOfFile.QuadPart = 0;
|
pInfo->EndOfFile.QuadPart = 0;
|
||||||
pInfo->AllocationSize.QuadPart = 0;
|
pInfo->AllocationSize.QuadPart = 0;
|
||||||
|
@ -178,7 +178,7 @@ VfatGetFileDirectoryInformation(
|
||||||
|
|
||||||
pInfo->ChangeTime = pInfo->LastWriteTime;
|
pInfo->ChangeTime = pInfo->LastWriteTime;
|
||||||
|
|
||||||
if (DirContext->DirEntry.Fat.Attrib & FILE_ATTRIBUTE_DIRECTORY)
|
if (BooleanFlagOn(DirContext->DirEntry.Fat.Attrib, FILE_ATTRIBUTE_DIRECTORY))
|
||||||
{
|
{
|
||||||
pInfo->EndOfFile.QuadPart = 0;
|
pInfo->EndOfFile.QuadPart = 0;
|
||||||
pInfo->AllocationSize.QuadPart = 0;
|
pInfo->AllocationSize.QuadPart = 0;
|
||||||
|
@ -220,7 +220,7 @@ VfatGetFileFullDirectoryInformation(
|
||||||
DirContext->LongNameU.Buffer,
|
DirContext->LongNameU.Buffer,
|
||||||
DirContext->LongNameU.Length);
|
DirContext->LongNameU.Length);
|
||||||
|
|
||||||
if (DeviceExt->Flags & VCB_IS_FATX)
|
if (BooleanFlagOn(DeviceExt->Flags, VCB_IS_FATX))
|
||||||
{
|
{
|
||||||
FsdDosDateTimeToSystemTime(DeviceExt,
|
FsdDosDateTimeToSystemTime(DeviceExt,
|
||||||
DirContext->DirEntry.FatX.CreationDate,
|
DirContext->DirEntry.FatX.CreationDate,
|
||||||
|
@ -285,7 +285,7 @@ VfatGetFileBothInformation(
|
||||||
|
|
||||||
pInfo->EaSize = 0;
|
pInfo->EaSize = 0;
|
||||||
|
|
||||||
if (DeviceExt->Flags & VCB_IS_FATX)
|
if (BooleanFlagOn(DeviceExt->Flags, VCB_IS_FATX))
|
||||||
{
|
{
|
||||||
pInfo->FileNameLength = DirContext->LongNameU.Length;
|
pInfo->FileNameLength = DirContext->LongNameU.Length;
|
||||||
|
|
||||||
|
@ -314,7 +314,7 @@ VfatGetFileBothInformation(
|
||||||
|
|
||||||
pInfo->ChangeTime = pInfo->LastWriteTime;
|
pInfo->ChangeTime = pInfo->LastWriteTime;
|
||||||
|
|
||||||
if (DirContext->DirEntry.FatX.Attrib & FILE_ATTRIBUTE_DIRECTORY)
|
if (BooleanFlagOn(DirContext->DirEntry.FatX.Attrib, FILE_ATTRIBUTE_DIRECTORY))
|
||||||
{
|
{
|
||||||
pInfo->EndOfFile.QuadPart = 0;
|
pInfo->EndOfFile.QuadPart = 0;
|
||||||
pInfo->AllocationSize.QuadPart = 0;
|
pInfo->AllocationSize.QuadPart = 0;
|
||||||
|
@ -364,7 +364,7 @@ VfatGetFileBothInformation(
|
||||||
|
|
||||||
pInfo->ChangeTime = pInfo->LastWriteTime;
|
pInfo->ChangeTime = pInfo->LastWriteTime;
|
||||||
|
|
||||||
if (DirContext->DirEntry.Fat.Attrib & FILE_ATTRIBUTE_DIRECTORY)
|
if (BooleanFlagOn(DirContext->DirEntry.Fat.Attrib, FILE_ATTRIBUTE_DIRECTORY))
|
||||||
{
|
{
|
||||||
pInfo->EndOfFile.QuadPart = 0;
|
pInfo->EndOfFile.QuadPart = 0;
|
||||||
pInfo->AllocationSize.QuadPart = 0;
|
pInfo->AllocationSize.QuadPart = 0;
|
||||||
|
@ -497,11 +497,11 @@ DoQuery(
|
||||||
pCcb->SearchPattern.Length = sizeof(WCHAR);
|
pCcb->SearchPattern.Length = sizeof(WCHAR);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IrpContext->Stack->Flags & SL_INDEX_SPECIFIED)
|
if (BooleanFlagOn(IrpContext->Stack->Flags, SL_INDEX_SPECIFIED))
|
||||||
{
|
{
|
||||||
DirContext.DirIndex = pCcb->Entry = Stack->Parameters.QueryDirectory.FileIndex;
|
DirContext.DirIndex = pCcb->Entry = Stack->Parameters.QueryDirectory.FileIndex;
|
||||||
}
|
}
|
||||||
else if (FirstQuery || (IrpContext->Stack->Flags & SL_RESTART_SCAN))
|
else if (FirstQuery || BooleanFlagOn(IrpContext->Stack->Flags, SL_RESTART_SCAN))
|
||||||
{
|
{
|
||||||
DirContext.DirIndex = pCcb->Entry = 0;
|
DirContext.DirIndex = pCcb->Entry = 0;
|
||||||
}
|
}
|
||||||
|
@ -579,7 +579,7 @@ DoQuery(
|
||||||
pCcb->Entry = ++DirContext.DirIndex;
|
pCcb->Entry = ++DirContext.DirIndex;
|
||||||
BufferLength -= Buffer0->NextEntryOffset;
|
BufferLength -= Buffer0->NextEntryOffset;
|
||||||
|
|
||||||
if (IrpContext->Stack->Flags & SL_RETURN_SINGLE_ENTRY)
|
if (BooleanFlagOn(IrpContext->Stack->Flags, SL_RETURN_SINGLE_ENTRY))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
Buffer += Buffer0->NextEntryOffset;
|
Buffer += Buffer0->NextEntryOffset;
|
||||||
|
@ -653,7 +653,7 @@ VfatDirectoryControl(
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Status == STATUS_PENDING && IrpContext->Flags & IRPCONTEXT_COMPLETE)
|
if (Status == STATUS_PENDING && BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_COMPLETE))
|
||||||
{
|
{
|
||||||
return VfatMarkIrpContextForQueue(IrpContext);
|
return VfatMarkIrpContextForQueue(IrpContext);
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@ vfatDirEntryGetFirstCluster(
|
||||||
cluster = pFatDirEntry->Fat.FirstCluster |
|
cluster = pFatDirEntry->Fat.FirstCluster |
|
||||||
(pFatDirEntry->Fat.FirstClusterHigh << 16);
|
(pFatDirEntry->Fat.FirstClusterHigh << 16);
|
||||||
}
|
}
|
||||||
else if (pDeviceExt->Flags & VCB_IS_FATX)
|
else if (BooleanFlagOn(pDeviceExt->Flags, VCB_IS_FATX))
|
||||||
{
|
{
|
||||||
cluster = pFatDirEntry->FatX.FirstCluster;
|
cluster = pFatDirEntry->FatX.FirstCluster;
|
||||||
}
|
}
|
||||||
|
@ -172,7 +172,7 @@ BOOLEAN
|
||||||
VfatIsDirectoryEmpty(
|
VfatIsDirectoryEmpty(
|
||||||
PVFATFCB Fcb)
|
PVFATFCB Fcb)
|
||||||
{
|
{
|
||||||
if (Fcb->Flags & FCB_IS_FATX_ENTRY)
|
if (BooleanFlagOn(Fcb->Flags, FCB_IS_FATX_ENTRY))
|
||||||
return FATXIsDirectoryEmpty(Fcb);
|
return FATXIsDirectoryEmpty(Fcb);
|
||||||
else
|
else
|
||||||
return FATIsDirectoryEmpty(Fcb);
|
return FATIsDirectoryEmpty(Fcb);
|
||||||
|
|
|
@ -31,7 +31,7 @@ VfatUpdateEntry(
|
||||||
|
|
||||||
ASSERT(pFcb);
|
ASSERT(pFcb);
|
||||||
|
|
||||||
if (pFcb->Flags & FCB_IS_FATX_ENTRY)
|
if (BooleanFlagOn(pFcb->Flags, FCB_IS_FATX_ENTRY))
|
||||||
{
|
{
|
||||||
SizeDirEntry = sizeof(FATX_DIR_ENTRY);
|
SizeDirEntry = sizeof(FATX_DIR_ENTRY);
|
||||||
dirIndex = pFcb->startIndex;
|
dirIndex = pFcb->startIndex;
|
||||||
|
@ -44,7 +44,7 @@ VfatUpdateEntry(
|
||||||
|
|
||||||
DPRINT("updEntry dirIndex %u, PathName \'%wZ\'\n", dirIndex, &pFcb->PathNameU);
|
DPRINT("updEntry dirIndex %u, PathName \'%wZ\'\n", dirIndex, &pFcb->PathNameU);
|
||||||
|
|
||||||
if (vfatFCBIsRoot(pFcb) || (pFcb->Flags & (FCB_IS_FAT|FCB_IS_VOLUME)))
|
if (vfatFCBIsRoot(pFcb) || BooleanFlagOn(pFcb->Flags, FCB_IS_FAT | FCB_IS_VOLUME))
|
||||||
{
|
{
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -90,7 +90,7 @@ vfatRenameEntry(
|
||||||
|
|
||||||
DPRINT("vfatRenameEntry(%p, %p, %wZ, %d)\n", DeviceExt, pFcb, FileName, CaseChangeOnly);
|
DPRINT("vfatRenameEntry(%p, %p, %wZ, %d)\n", DeviceExt, pFcb, FileName, CaseChangeOnly);
|
||||||
|
|
||||||
if (pFcb->Flags & FCB_IS_FATX_ENTRY)
|
if (BooleanFlagOn(pFcb->Flags, FCB_IS_FATX_ENTRY))
|
||||||
{
|
{
|
||||||
VFAT_DIRENTRY_CONTEXT DirContext;
|
VFAT_DIRENTRY_CONTEXT DirContext;
|
||||||
|
|
||||||
|
@ -162,7 +162,7 @@ vfatFindDirSpace(
|
||||||
ULONG SizeDirEntry;
|
ULONG SizeDirEntry;
|
||||||
FileOffset.QuadPart = 0;
|
FileOffset.QuadPart = 0;
|
||||||
|
|
||||||
if (DeviceExt->Flags & VCB_IS_FATX)
|
if (BooleanFlagOn(DeviceExt->Flags, VCB_IS_FATX))
|
||||||
SizeDirEntry = sizeof(FATX_DIR_ENTRY);
|
SizeDirEntry = sizeof(FATX_DIR_ENTRY);
|
||||||
else
|
else
|
||||||
SizeDirEntry = sizeof(FAT_DIR_ENTRY);
|
SizeDirEntry = sizeof(FAT_DIR_ENTRY);
|
||||||
|
@ -304,6 +304,7 @@ FATAddEntry(
|
||||||
BOOLEAN BaseAllLower, BaseAllUpper;
|
BOOLEAN BaseAllLower, BaseAllUpper;
|
||||||
BOOLEAN ExtensionAllLower, ExtensionAllUpper;
|
BOOLEAN ExtensionAllLower, ExtensionAllUpper;
|
||||||
BOOLEAN InExtension;
|
BOOLEAN InExtension;
|
||||||
|
BOOLEAN IsDirectory;
|
||||||
WCHAR c;
|
WCHAR c;
|
||||||
ULONG CurrentCluster;
|
ULONG CurrentCluster;
|
||||||
LARGE_INTEGER SystemTime, FileOffset;
|
LARGE_INTEGER SystemTime, FileOffset;
|
||||||
|
@ -323,6 +324,7 @@ FATAddEntry(
|
||||||
DPRINT("addEntry: Name='%wZ', Dir='%wZ'\n", NameU, &ParentFcb->PathNameU);
|
DPRINT("addEntry: Name='%wZ', Dir='%wZ'\n", NameU, &ParentFcb->PathNameU);
|
||||||
|
|
||||||
DirContext.LongNameU = *NameU;
|
DirContext.LongNameU = *NameU;
|
||||||
|
IsDirectory = BooleanFlagOn(RequestedOptions, FILE_DIRECTORY_FILE);
|
||||||
|
|
||||||
/* nb of entry needed for long name+normal entry */
|
/* nb of entry needed for long name+normal entry */
|
||||||
nbSlots = (DirContext.LongNameU.Length / sizeof(WCHAR) + 12) / 13 + 1;
|
nbSlots = (DirContext.LongNameU.Length / sizeof(WCHAR) + 12) / 13 + 1;
|
||||||
|
@ -480,7 +482,7 @@ FATAddEntry(
|
||||||
|
|
||||||
/* set attributes */
|
/* set attributes */
|
||||||
DirContext.DirEntry.Fat.Attrib = ReqAttr;
|
DirContext.DirEntry.Fat.Attrib = ReqAttr;
|
||||||
if (RequestedOptions & FILE_DIRECTORY_FILE)
|
if (IsDirectory)
|
||||||
{
|
{
|
||||||
DirContext.DirEntry.Fat.Attrib |= FILE_ATTRIBUTE_DIRECTORY;
|
DirContext.DirEntry.Fat.Attrib |= FILE_ATTRIBUTE_DIRECTORY;
|
||||||
}
|
}
|
||||||
|
@ -534,7 +536,7 @@ FATAddEntry(
|
||||||
return STATUS_DISK_FULL;
|
return STATUS_DISK_FULL;
|
||||||
}
|
}
|
||||||
DirContext.DirIndex = DirContext.StartIndex + nbSlots - 1;
|
DirContext.DirIndex = DirContext.StartIndex + nbSlots - 1;
|
||||||
if (RequestedOptions & FILE_DIRECTORY_FILE)
|
if (IsDirectory)
|
||||||
{
|
{
|
||||||
/* If we aren't moving, use next */
|
/* If we aren't moving, use next */
|
||||||
if (MoveContext == NULL)
|
if (MoveContext == NULL)
|
||||||
|
@ -653,7 +655,7 @@ FATAddEntry(
|
||||||
DPRINT("new : entry=%11.11s\n", (*Fcb)->entry.Fat.Filename);
|
DPRINT("new : entry=%11.11s\n", (*Fcb)->entry.Fat.Filename);
|
||||||
DPRINT("new : entry=%11.11s\n", DirContext.DirEntry.Fat.Filename);
|
DPRINT("new : entry=%11.11s\n", DirContext.DirEntry.Fat.Filename);
|
||||||
|
|
||||||
if (RequestedOptions & FILE_DIRECTORY_FILE)
|
if (IsDirectory)
|
||||||
{
|
{
|
||||||
FileOffset.QuadPart = 0;
|
FileOffset.QuadPart = 0;
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
|
@ -759,7 +761,7 @@ FATXAddEntry(
|
||||||
|
|
||||||
/* set attributes */
|
/* set attributes */
|
||||||
DirContext.DirEntry.FatX.Attrib = ReqAttr;
|
DirContext.DirEntry.FatX.Attrib = ReqAttr;
|
||||||
if (RequestedOptions & FILE_DIRECTORY_FILE)
|
if (BooleanFlagOn(RequestedOptions, FILE_DIRECTORY_FILE))
|
||||||
{
|
{
|
||||||
DirContext.DirEntry.FatX.Attrib |= FILE_ATTRIBUTE_DIRECTORY;
|
DirContext.DirEntry.FatX.Attrib |= FILE_ATTRIBUTE_DIRECTORY;
|
||||||
}
|
}
|
||||||
|
@ -822,7 +824,7 @@ VfatAddEntry(
|
||||||
IN UCHAR ReqAttr,
|
IN UCHAR ReqAttr,
|
||||||
IN PVFAT_MOVE_CONTEXT MoveContext)
|
IN PVFAT_MOVE_CONTEXT MoveContext)
|
||||||
{
|
{
|
||||||
if (DeviceExt->Flags & VCB_IS_FATX)
|
if (BooleanFlagOn(DeviceExt->Flags, VCB_IS_FATX))
|
||||||
return FATXAddEntry(DeviceExt, NameU, Fcb, ParentFcb, RequestedOptions, ReqAttr, MoveContext);
|
return FATXAddEntry(DeviceExt, NameU, Fcb, ParentFcb, RequestedOptions, ReqAttr, MoveContext);
|
||||||
else
|
else
|
||||||
return FATAddEntry(DeviceExt, NameU, Fcb, ParentFcb, RequestedOptions, ReqAttr, MoveContext);
|
return FATAddEntry(DeviceExt, NameU, Fcb, ParentFcb, RequestedOptions, ReqAttr, MoveContext);
|
||||||
|
@ -925,7 +927,7 @@ FATXDelEntry(
|
||||||
|
|
||||||
ASSERT(pFcb);
|
ASSERT(pFcb);
|
||||||
ASSERT(pFcb->parentFcb);
|
ASSERT(pFcb->parentFcb);
|
||||||
ASSERT(pFcb->Flags & FCB_IS_FATX_ENTRY);
|
ASSERT(BooleanFlagOn(pFcb->Flags, FCB_IS_FATX_ENTRY));
|
||||||
|
|
||||||
StartIndex = pFcb->startIndex;
|
StartIndex = pFcb->startIndex;
|
||||||
|
|
||||||
|
@ -981,7 +983,7 @@ VfatDelEntry(
|
||||||
IN PVFATFCB pFcb,
|
IN PVFATFCB pFcb,
|
||||||
OUT PVFAT_MOVE_CONTEXT MoveContext)
|
OUT PVFAT_MOVE_CONTEXT MoveContext)
|
||||||
{
|
{
|
||||||
if (DeviceExt->Flags & VCB_IS_FATX)
|
if (BooleanFlagOn(DeviceExt->Flags, VCB_IS_FATX))
|
||||||
return FATXDelEntry(DeviceExt, pFcb, MoveContext);
|
return FATXDelEntry(DeviceExt, pFcb, MoveContext);
|
||||||
else
|
else
|
||||||
return FATDelEntry(DeviceExt, pFcb, MoveContext);
|
return FATDelEntry(DeviceExt, pFcb, MoveContext);
|
||||||
|
|
|
@ -131,7 +131,7 @@ VfatFastIoQueryBasicInfo(
|
||||||
|
|
||||||
FsRtlEnterFileSystem();
|
FsRtlEnterFileSystem();
|
||||||
|
|
||||||
if (!(FCB->Flags & FCB_IS_PAGE_FILE))
|
if (!BooleanFlagOn(FCB->Flags, FCB_IS_PAGE_FILE))
|
||||||
{
|
{
|
||||||
if (!ExAcquireResourceSharedLite(&FCB->MainResource, Wait))
|
if (!ExAcquireResourceSharedLite(&FCB->MainResource, Wait))
|
||||||
{
|
{
|
||||||
|
@ -146,7 +146,7 @@ VfatFastIoQueryBasicInfo(
|
||||||
Buffer,
|
Buffer,
|
||||||
&BufferLength);
|
&BufferLength);
|
||||||
|
|
||||||
if (!(FCB->Flags & FCB_IS_PAGE_FILE))
|
if (!BooleanFlagOn(FCB->Flags, FCB_IS_PAGE_FILE))
|
||||||
{
|
{
|
||||||
ExReleaseResourceLite(&FCB->MainResource);
|
ExReleaseResourceLite(&FCB->MainResource);
|
||||||
}
|
}
|
||||||
|
@ -192,7 +192,7 @@ VfatFastIoQueryStandardInfo(
|
||||||
|
|
||||||
FsRtlEnterFileSystem();
|
FsRtlEnterFileSystem();
|
||||||
|
|
||||||
if (!(FCB->Flags & FCB_IS_PAGE_FILE))
|
if (!BooleanFlagOn(FCB->Flags, FCB_IS_PAGE_FILE))
|
||||||
{
|
{
|
||||||
if (!ExAcquireResourceSharedLite(&FCB->MainResource, Wait))
|
if (!ExAcquireResourceSharedLite(&FCB->MainResource, Wait))
|
||||||
{
|
{
|
||||||
|
@ -205,7 +205,7 @@ VfatFastIoQueryStandardInfo(
|
||||||
Buffer,
|
Buffer,
|
||||||
&BufferLength);
|
&BufferLength);
|
||||||
|
|
||||||
if (!(FCB->Flags & FCB_IS_PAGE_FILE))
|
if (!BooleanFlagOn(FCB->Flags, FCB_IS_PAGE_FILE))
|
||||||
{
|
{
|
||||||
ExReleaseResourceLite(&FCB->MainResource);
|
ExReleaseResourceLite(&FCB->MainResource);
|
||||||
}
|
}
|
||||||
|
@ -691,7 +691,7 @@ VfatAcquireForCcFlush(
|
||||||
UNREFERENCED_PARAMETER(DeviceObject);
|
UNREFERENCED_PARAMETER(DeviceObject);
|
||||||
|
|
||||||
/* Make sure it is not a volume lock */
|
/* Make sure it is not a volume lock */
|
||||||
ASSERT(!(Fcb->Flags & FCB_IS_VOLUME));
|
ASSERT(!BooleanFlagOn(Fcb->Flags, FCB_IS_VOLUME));
|
||||||
|
|
||||||
/* Acquire the resource */
|
/* Acquire the resource */
|
||||||
ExAcquireResourceExclusiveLite(&(Fcb->MainResource), TRUE);
|
ExAcquireResourceExclusiveLite(&(Fcb->MainResource), TRUE);
|
||||||
|
@ -715,7 +715,7 @@ VfatReleaseForCcFlush(
|
||||||
UNREFERENCED_PARAMETER(DeviceObject);
|
UNREFERENCED_PARAMETER(DeviceObject);
|
||||||
|
|
||||||
/* Make sure it is not a volume lock */
|
/* Make sure it is not a volume lock */
|
||||||
ASSERT(!(Fcb->Flags & FCB_IS_VOLUME));
|
ASSERT(!BooleanFlagOn(Fcb->Flags, FCB_IS_VOLUME));
|
||||||
|
|
||||||
/* Release the resource */
|
/* Release the resource */
|
||||||
ExReleaseResourceLite(&(Fcb->MainResource));
|
ExReleaseResourceLite(&(Fcb->MainResource));
|
||||||
|
|
|
@ -136,7 +136,7 @@ vfatNewFCB(
|
||||||
}
|
}
|
||||||
RtlZeroMemory(rcFCB, sizeof(VFATFCB));
|
RtlZeroMemory(rcFCB, sizeof(VFATFCB));
|
||||||
vfatInitFcb(rcFCB, pFileNameU);
|
vfatInitFcb(rcFCB, pFileNameU);
|
||||||
if (pVCB->Flags & VCB_IS_FATX)
|
if (BooleanFlagOn(pVCB->Flags, VCB_IS_FATX))
|
||||||
{
|
{
|
||||||
rcFCB->Flags |= FCB_IS_FATX_ENTRY;
|
rcFCB->Flags |= FCB_IS_FATX_ENTRY;
|
||||||
rcFCB->Attributes = &rcFCB->entry.FatX.Attrib;
|
rcFCB->Attributes = &rcFCB->entry.FatX.Attrib;
|
||||||
|
@ -280,13 +280,6 @@ vfatDestroyFCB(
|
||||||
ASSERT(IsListEmpty(&pFCB->ParentListHead));
|
ASSERT(IsListEmpty(&pFCB->ParentListHead));
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOLEAN
|
|
||||||
vfatFCBIsDirectory(
|
|
||||||
PVFATFCB FCB)
|
|
||||||
{
|
|
||||||
return ((*FCB->Attributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY);
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
vfatFCBIsRoot(
|
vfatFCBIsRoot(
|
||||||
PVFATFCB FCB)
|
PVFATFCB FCB)
|
||||||
|
@ -408,7 +401,7 @@ vfatInitFCBFromDirEntry(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (Fcb->Flags & FCB_IS_FATX_ENTRY)
|
else if (BooleanFlagOn(Fcb->Flags, FCB_IS_FATX_ENTRY))
|
||||||
{
|
{
|
||||||
Size = Fcb->entry.FatX.FileSize;
|
Size = Fcb->entry.FatX.FileSize;
|
||||||
}
|
}
|
||||||
|
@ -418,7 +411,7 @@ vfatInitFCBFromDirEntry(
|
||||||
}
|
}
|
||||||
Fcb->dirIndex = DirContext->DirIndex;
|
Fcb->dirIndex = DirContext->DirIndex;
|
||||||
Fcb->startIndex = DirContext->StartIndex;
|
Fcb->startIndex = DirContext->StartIndex;
|
||||||
if ((Fcb->Flags & FCB_IS_FATX_ENTRY) && !vfatFCBIsRoot(Fcb))
|
if (BooleanFlagOn(Fcb->Flags, FCB_IS_FATX_ENTRY) && !vfatFCBIsRoot(Fcb))
|
||||||
{
|
{
|
||||||
ASSERT(DirContext->DirIndex >= 2 && DirContext->StartIndex >= 2);
|
ASSERT(DirContext->DirIndex >= 2 && DirContext->StartIndex >= 2);
|
||||||
Fcb->dirIndex = DirContext->DirIndex-2;
|
Fcb->dirIndex = DirContext->DirIndex-2;
|
||||||
|
@ -460,7 +453,7 @@ vfatSetFCBNewDirName(
|
||||||
Fcb->DirNameU.Buffer = Fcb->PathNameU.Buffer;
|
Fcb->DirNameU.Buffer = Fcb->PathNameU.Buffer;
|
||||||
vfatSplitPathName(&Fcb->PathNameU, &Fcb->DirNameU, &Fcb->LongNameU);
|
vfatSplitPathName(&Fcb->PathNameU, &Fcb->DirNameU, &Fcb->LongNameU);
|
||||||
Fcb->Hash.Hash = vfatNameHash(0, &Fcb->PathNameU);
|
Fcb->Hash.Hash = vfatNameHash(0, &Fcb->PathNameU);
|
||||||
if (pVCB->Flags & VCB_IS_FATX)
|
if (BooleanFlagOn(pVCB->Flags, VCB_IS_FATX))
|
||||||
{
|
{
|
||||||
Fcb->ShortHash.Hash = Fcb->Hash.Hash;
|
Fcb->ShortHash.Hash = Fcb->Hash.Hash;
|
||||||
}
|
}
|
||||||
|
@ -644,7 +637,7 @@ vfatMakeRootFCB(
|
||||||
UNICODE_STRING NameU = RTL_CONSTANT_STRING(L"\\");
|
UNICODE_STRING NameU = RTL_CONSTANT_STRING(L"\\");
|
||||||
|
|
||||||
FCB = vfatNewFCB(pVCB, &NameU);
|
FCB = vfatNewFCB(pVCB, &NameU);
|
||||||
if (FCB->Flags & FCB_IS_FATX_ENTRY)
|
if (BooleanFlagOn(FCB->Flags, FCB_IS_FATX_ENTRY))
|
||||||
{
|
{
|
||||||
memset(FCB->entry.FatX.Filename, ' ', 42);
|
memset(FCB->entry.FatX.Filename, ' ', 42);
|
||||||
FCB->entry.FatX.FileSize = pVCB->FatInfo.rootDirectorySectors * pVCB->FatInfo.BytesPerSector;
|
FCB->entry.FatX.FileSize = pVCB->FatInfo.rootDirectorySectors * pVCB->FatInfo.BytesPerSector;
|
||||||
|
|
|
@ -338,7 +338,7 @@ VfatSetDispositionInformation(
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*FCB->Attributes & FILE_ATTRIBUTE_READONLY)
|
if (vfatFCBIsReadOnly(FCB))
|
||||||
{
|
{
|
||||||
return STATUS_CANNOT_DELETE;
|
return STATUS_CANNOT_DELETE;
|
||||||
}
|
}
|
||||||
|
@ -398,7 +398,7 @@ vfatPrepareTargetForRename(
|
||||||
if (ReplaceIfExists)
|
if (ReplaceIfExists)
|
||||||
{
|
{
|
||||||
/* If that's a directory or a read-only file, we're not allowed */
|
/* If that's a directory or a read-only file, we're not allowed */
|
||||||
if (vfatFCBIsDirectory(TargetFcb) || ((*TargetFcb->Attributes & FILE_ATTRIBUTE_READONLY) == FILE_ATTRIBUTE_READONLY))
|
if (vfatFCBIsDirectory(TargetFcb) || vfatFCBIsReadOnly(TargetFcb))
|
||||||
{
|
{
|
||||||
DPRINT("And this is a readonly file!\n");
|
DPRINT("And this is a readonly file!\n");
|
||||||
vfatReleaseFCB(DeviceExt, *ParentFCB);
|
vfatReleaseFCB(DeviceExt, *ParentFCB);
|
||||||
|
@ -791,7 +791,7 @@ VfatSetRenameInformation(
|
||||||
FCB->PathNameU.Length - FCB->LongNameU.Length,
|
FCB->PathNameU.Length - FCB->LongNameU.Length,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
((*FCB->Attributes & FILE_ATTRIBUTE_DIRECTORY) ?
|
(vfatFCBIsDirectory(FCB) ?
|
||||||
FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME),
|
FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME),
|
||||||
FILE_ACTION_RENAMED_OLD_NAME,
|
FILE_ACTION_RENAMED_OLD_NAME,
|
||||||
NULL);
|
NULL);
|
||||||
|
@ -804,7 +804,7 @@ VfatSetRenameInformation(
|
||||||
FCB->PathNameU.Length - FCB->LongNameU.Length,
|
FCB->PathNameU.Length - FCB->LongNameU.Length,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
((*FCB->Attributes & FILE_ATTRIBUTE_DIRECTORY) ?
|
(vfatFCBIsDirectory(FCB) ?
|
||||||
FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME),
|
FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME),
|
||||||
FILE_ACTION_RENAMED_NEW_NAME,
|
FILE_ACTION_RENAMED_NEW_NAME,
|
||||||
NULL);
|
NULL);
|
||||||
|
@ -834,7 +834,7 @@ VfatSetRenameInformation(
|
||||||
FCB->PathNameU.Length - FCB->LongNameU.Length,
|
FCB->PathNameU.Length - FCB->LongNameU.Length,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
((*FCB->Attributes & FILE_ATTRIBUTE_DIRECTORY) ?
|
(vfatFCBIsDirectory(FCB) ?
|
||||||
FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME),
|
FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME),
|
||||||
(DeletedTarget ? FILE_ACTION_REMOVED : FILE_ACTION_RENAMED_OLD_NAME),
|
(DeletedTarget ? FILE_ACTION_REMOVED : FILE_ACTION_RENAMED_OLD_NAME),
|
||||||
NULL);
|
NULL);
|
||||||
|
@ -862,7 +862,7 @@ VfatSetRenameInformation(
|
||||||
FCB->PathNameU.Length - FCB->LongNameU.Length,
|
FCB->PathNameU.Length - FCB->LongNameU.Length,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
((*FCB->Attributes & FILE_ATTRIBUTE_DIRECTORY) ?
|
(vfatFCBIsDirectory(FCB) ?
|
||||||
FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME),
|
FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME),
|
||||||
FILE_ACTION_RENAMED_NEW_NAME,
|
FILE_ACTION_RENAMED_NEW_NAME,
|
||||||
NULL);
|
NULL);
|
||||||
|
@ -905,7 +905,7 @@ VfatSetRenameInformation(
|
||||||
FCB->PathNameU.Length - FCB->LongNameU.Length,
|
FCB->PathNameU.Length - FCB->LongNameU.Length,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
((*FCB->Attributes & FILE_ATTRIBUTE_DIRECTORY) ?
|
(vfatFCBIsDirectory(FCB) ?
|
||||||
FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME),
|
FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME),
|
||||||
FILE_ACTION_REMOVED,
|
FILE_ACTION_REMOVED,
|
||||||
NULL);
|
NULL);
|
||||||
|
@ -933,7 +933,7 @@ VfatSetRenameInformation(
|
||||||
FCB->PathNameU.Length - FCB->LongNameU.Length,
|
FCB->PathNameU.Length - FCB->LongNameU.Length,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
((*FCB->Attributes & FILE_ATTRIBUTE_DIRECTORY) ?
|
(vfatFCBIsDirectory(FCB) ?
|
||||||
FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME),
|
FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME),
|
||||||
FILE_ACTION_ADDED,
|
FILE_ACTION_ADDED,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
|
@ -33,7 +33,7 @@ VfatFlushFile(
|
||||||
IoStatus.Status = STATUS_SUCCESS;
|
IoStatus.Status = STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Fcb->Flags & FCB_IS_DIRTY)
|
if (BooleanFlagOn(Fcb->Flags, FCB_IS_DIRTY))
|
||||||
{
|
{
|
||||||
Status = VfatUpdateEntry(Fcb);
|
Status = VfatUpdateEntry(Fcb);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
|
@ -157,7 +157,7 @@ VfatFlush(
|
||||||
Fcb = (PVFATFCB)IrpContext->FileObject->FsContext;
|
Fcb = (PVFATFCB)IrpContext->FileObject->FsContext;
|
||||||
ASSERT(Fcb);
|
ASSERT(Fcb);
|
||||||
|
|
||||||
if (Fcb->Flags & FCB_IS_VOLUME)
|
if (BooleanFlagOn(Fcb->Flags, FCB_IS_VOLUME))
|
||||||
{
|
{
|
||||||
ExAcquireResourceExclusiveLite(&IrpContext->DeviceExt->DirResource, TRUE);
|
ExAcquireResourceExclusiveLite(&IrpContext->DeviceExt->DirResource, TRUE);
|
||||||
Status = VfatFlushVolume(IrpContext->DeviceExt, Fcb);
|
Status = VfatFlushVolume(IrpContext->DeviceExt, Fcb);
|
||||||
|
|
|
@ -816,8 +816,8 @@ VfatIsVolumeDirty(
|
||||||
Flags = (PULONG)IrpContext->Irp->AssociatedIrp.SystemBuffer;
|
Flags = (PULONG)IrpContext->Irp->AssociatedIrp.SystemBuffer;
|
||||||
*Flags = 0;
|
*Flags = 0;
|
||||||
|
|
||||||
if ((IrpContext->DeviceExt->VolumeFcb->Flags & VCB_IS_DIRTY) &&
|
if (BooleanFlagOn(IrpContext->DeviceExt->VolumeFcb->Flags, VCB_IS_DIRTY) &&
|
||||||
!(IrpContext->DeviceExt->VolumeFcb->Flags & VCB_CLEAR_DIRTY))
|
!BooleanFlagOn(IrpContext->DeviceExt->VolumeFcb->Flags, VCB_CLEAR_DIRTY))
|
||||||
{
|
{
|
||||||
*Flags |= VOLUME_IS_DIRTY;
|
*Flags |= VOLUME_IS_DIRTY;
|
||||||
}
|
}
|
||||||
|
@ -837,7 +837,7 @@ VfatMarkVolumeDirty(
|
||||||
DPRINT("VfatMarkVolumeDirty(IrpContext %p)\n", IrpContext);
|
DPRINT("VfatMarkVolumeDirty(IrpContext %p)\n", IrpContext);
|
||||||
DeviceExt = IrpContext->DeviceExt;
|
DeviceExt = IrpContext->DeviceExt;
|
||||||
|
|
||||||
if (!(DeviceExt->VolumeFcb->Flags & VCB_IS_DIRTY))
|
if (!BooleanFlagOn(DeviceExt->VolumeFcb->Flags, VCB_IS_DIRTY))
|
||||||
{
|
{
|
||||||
Status = GetNextCluster(DeviceExt, 1, &eocMark);
|
Status = GetNextCluster(DeviceExt, 1, &eocMark);
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
|
@ -870,14 +870,14 @@ VfatLockOrUnlockVolume(
|
||||||
Fcb = FileObject->FsContext;
|
Fcb = FileObject->FsContext;
|
||||||
|
|
||||||
/* Only allow locking with the volume open */
|
/* Only allow locking with the volume open */
|
||||||
if (!(Fcb->Flags & FCB_IS_VOLUME))
|
if (!BooleanFlagOn(Fcb->Flags, FCB_IS_VOLUME))
|
||||||
{
|
{
|
||||||
return STATUS_ACCESS_DENIED;
|
return STATUS_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Bail out if it's already in the demanded state */
|
/* Bail out if it's already in the demanded state */
|
||||||
if (((DeviceExt->Flags & VCB_VOLUME_LOCKED) && Lock) ||
|
if ((BooleanFlagOn(DeviceExt->Flags, VCB_VOLUME_LOCKED) && Lock) ||
|
||||||
(!(DeviceExt->Flags & VCB_VOLUME_LOCKED) && !Lock))
|
(!BooleanFlagOn(DeviceExt->Flags, VCB_VOLUME_LOCKED) && !Lock))
|
||||||
{
|
{
|
||||||
return STATUS_ACCESS_DENIED;
|
return STATUS_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
|
@ -921,13 +921,13 @@ VfatDismountVolume(
|
||||||
/* We HAVE to be locked. Windows also allows dismount with no lock
|
/* We HAVE to be locked. Windows also allows dismount with no lock
|
||||||
* but we're here mainly for 1st stage, so KISS
|
* but we're here mainly for 1st stage, so KISS
|
||||||
*/
|
*/
|
||||||
if (!(DeviceExt->Flags & VCB_VOLUME_LOCKED))
|
if (!BooleanFlagOn(DeviceExt->Flags, VCB_VOLUME_LOCKED))
|
||||||
{
|
{
|
||||||
return STATUS_ACCESS_DENIED;
|
return STATUS_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Race condition? */
|
/* Race condition? */
|
||||||
if (DeviceExt->Flags & VCB_DISMOUNT_PENDING)
|
if (BooleanFlagOn(DeviceExt->Flags, VCB_DISMOUNT_PENDING))
|
||||||
{
|
{
|
||||||
return STATUS_VOLUME_DISMOUNTED;
|
return STATUS_VOLUME_DISMOUNTED;
|
||||||
}
|
}
|
||||||
|
@ -937,7 +937,7 @@ VfatDismountVolume(
|
||||||
|
|
||||||
ExAcquireResourceExclusiveLite(&DeviceExt->FatResource, TRUE);
|
ExAcquireResourceExclusiveLite(&DeviceExt->FatResource, TRUE);
|
||||||
|
|
||||||
if (DeviceExt->VolumeFcb->Flags & VCB_CLEAR_DIRTY)
|
if (BooleanFlagOn(DeviceExt->VolumeFcb->Flags, VCB_CLEAR_DIRTY))
|
||||||
{
|
{
|
||||||
/* Set clean shutdown bit */
|
/* Set clean shutdown bit */
|
||||||
Status = GetNextCluster(DeviceExt, 1, &eocMark);
|
Status = GetNextCluster(DeviceExt, 1, &eocMark);
|
||||||
|
|
|
@ -76,7 +76,7 @@ VfatLockControl(
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*Fcb->Attributes & FILE_ATTRIBUTE_DIRECTORY)
|
if (vfatFCBIsDirectory(Fcb))
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
@ -106,6 +106,7 @@ VfatDispatchRequest(
|
||||||
IN PVFAT_IRP_CONTEXT IrpContext)
|
IN PVFAT_IRP_CONTEXT IrpContext)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
BOOLEAN QueueIrp, CompleteIrp;
|
||||||
|
|
||||||
DPRINT("VfatDispatchRequest (IrpContext %p), is called for %s\n", IrpContext,
|
DPRINT("VfatDispatchRequest (IrpContext %p), is called for %s\n", IrpContext,
|
||||||
IrpContext->MajorFunction >= IRP_MJ_MAXIMUM_FUNCTION ? "????" : MajorFunctionNames[IrpContext->MajorFunction]);
|
IrpContext->MajorFunction >= IRP_MJ_MAXIMUM_FUNCTION ? "????" : MajorFunctionNames[IrpContext->MajorFunction]);
|
||||||
|
@ -181,17 +182,20 @@ VfatDispatchRequest(
|
||||||
Status = STATUS_DRIVER_INTERNAL_ERROR;
|
Status = STATUS_DRIVER_INTERNAL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT((!(IrpContext->Flags & IRPCONTEXT_COMPLETE) && !(IrpContext->Flags & IRPCONTEXT_QUEUE)) ||
|
QueueIrp = BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_QUEUE);
|
||||||
((IrpContext->Flags & IRPCONTEXT_COMPLETE) && !(IrpContext->Flags & IRPCONTEXT_QUEUE)) ||
|
CompleteIrp = BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_COMPLETE);
|
||||||
(!(IrpContext->Flags & IRPCONTEXT_COMPLETE) && (IrpContext->Flags & IRPCONTEXT_QUEUE)));
|
|
||||||
|
|
||||||
if (IrpContext->Flags & IRPCONTEXT_COMPLETE)
|
ASSERT((!CompleteIrp && !QueueIrp) ||
|
||||||
|
(CompleteIrp && !QueueIrp) ||
|
||||||
|
(!CompleteIrp && QueueIrp));
|
||||||
|
|
||||||
|
if (CompleteIrp)
|
||||||
{
|
{
|
||||||
IrpContext->Irp->IoStatus.Status = Status;
|
IrpContext->Irp->IoStatus.Status = Status;
|
||||||
IoCompleteRequest(IrpContext->Irp, IrpContext->PriorityBoost);
|
IoCompleteRequest(IrpContext->Irp, IrpContext->PriorityBoost);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IrpContext->Flags & IRPCONTEXT_QUEUE)
|
if (QueueIrp)
|
||||||
{
|
{
|
||||||
/* Reset our status flags before queueing the IRP */
|
/* Reset our status flags before queueing the IRP */
|
||||||
IrpContext->Flags |= IRPCONTEXT_COMPLETE;
|
IrpContext->Flags |= IRPCONTEXT_COMPLETE;
|
||||||
|
|
|
@ -155,7 +155,7 @@ VfatReadFileData(
|
||||||
ASSERT(Length % BytesPerSector == 0);
|
ASSERT(Length % BytesPerSector == 0);
|
||||||
|
|
||||||
/* Is this a read of the FAT? */
|
/* Is this a read of the FAT? */
|
||||||
if (Fcb->Flags & FCB_IS_FAT)
|
if (BooleanFlagOn(Fcb->Flags, FCB_IS_FAT))
|
||||||
{
|
{
|
||||||
ReadOffset.QuadPart += DeviceExt->FatInfo.FATStart * BytesPerSector;
|
ReadOffset.QuadPart += DeviceExt->FatInfo.FATStart * BytesPerSector;
|
||||||
Status = VfatReadDiskPartial(IrpContext, &ReadOffset, Length, 0, TRUE);
|
Status = VfatReadDiskPartial(IrpContext, &ReadOffset, Length, 0, TRUE);
|
||||||
|
@ -172,7 +172,7 @@ VfatReadFileData(
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Is this a read of the Volume ? */
|
/* Is this a read of the Volume ? */
|
||||||
if (Fcb->Flags & FCB_IS_VOLUME)
|
if (BooleanFlagOn(Fcb->Flags, FCB_IS_VOLUME))
|
||||||
{
|
{
|
||||||
Status = VfatReadDiskPartial(IrpContext, &ReadOffset, Length, 0, TRUE);
|
Status = VfatReadDiskPartial(IrpContext, &ReadOffset, Length, 0, TRUE);
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
|
@ -367,7 +367,7 @@ VfatWriteFileData(
|
||||||
ASSERT(Length % BytesPerSector == 0);
|
ASSERT(Length % BytesPerSector == 0);
|
||||||
|
|
||||||
/* Is this a write of the volume? */
|
/* Is this a write of the volume? */
|
||||||
if (Fcb->Flags & FCB_IS_VOLUME)
|
if (BooleanFlagOn(Fcb->Flags, FCB_IS_VOLUME))
|
||||||
{
|
{
|
||||||
Status = VfatWriteDiskPartial(IrpContext, &WriteOffset, Length, 0, TRUE);
|
Status = VfatWriteDiskPartial(IrpContext, &WriteOffset, Length, 0, TRUE);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
|
@ -378,7 +378,7 @@ VfatWriteFileData(
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Is this a write to the FAT? */
|
/* Is this a write to the FAT? */
|
||||||
if (Fcb->Flags & FCB_IS_FAT)
|
if (BooleanFlagOn(Fcb->Flags, FCB_IS_FAT))
|
||||||
{
|
{
|
||||||
WriteOffset.u.LowPart += DeviceExt->FatInfo.FATStart * BytesPerSector;
|
WriteOffset.u.LowPart += DeviceExt->FatInfo.FATStart * BytesPerSector;
|
||||||
IrpContext->RefCount = 1;
|
IrpContext->RefCount = 1;
|
||||||
|
@ -547,7 +547,7 @@ VfatRead(
|
||||||
LARGE_INTEGER ByteOffset;
|
LARGE_INTEGER ByteOffset;
|
||||||
PVOID Buffer;
|
PVOID Buffer;
|
||||||
ULONG BytesPerSector;
|
ULONG BytesPerSector;
|
||||||
BOOLEAN PagingIo, CanWait, IsVolume;
|
BOOLEAN PagingIo, CanWait, IsVolume, NoCache;
|
||||||
|
|
||||||
ASSERT(IrpContext);
|
ASSERT(IrpContext);
|
||||||
|
|
||||||
|
@ -568,7 +568,7 @@ VfatRead(
|
||||||
Fcb = IrpContext->FileObject->FsContext;
|
Fcb = IrpContext->FileObject->FsContext;
|
||||||
ASSERT(Fcb);
|
ASSERT(Fcb);
|
||||||
|
|
||||||
if (Fcb->Flags & FCB_IS_PAGE_FILE)
|
if (BooleanFlagOn(Fcb->Flags, FCB_IS_PAGE_FILE))
|
||||||
{
|
{
|
||||||
PFATINFO FatInfo = &IrpContext->DeviceExt->FatInfo;
|
PFATINFO FatInfo = &IrpContext->DeviceExt->FatInfo;
|
||||||
IrpContext->Stack->Parameters.Read.ByteOffset.QuadPart += FatInfo->dataStart * FatInfo->BytesPerSector;
|
IrpContext->Stack->Parameters.Read.ByteOffset.QuadPart += FatInfo->dataStart * FatInfo->BytesPerSector;
|
||||||
|
@ -587,9 +587,10 @@ VfatRead(
|
||||||
PagingIo = BooleanFlagOn(IrpContext->Irp->Flags, IRP_PAGING_IO);
|
PagingIo = BooleanFlagOn(IrpContext->Irp->Flags, IRP_PAGING_IO);
|
||||||
CanWait = BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT);
|
CanWait = BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT);
|
||||||
IsVolume = BooleanFlagOn(Fcb->Flags, FCB_IS_VOLUME);
|
IsVolume = BooleanFlagOn(Fcb->Flags, FCB_IS_VOLUME);
|
||||||
|
NoCache = BooleanFlagOn(IrpContext->Irp->Flags, IRP_NOCACHE);
|
||||||
|
|
||||||
/* fail if file is a directory and no paged read */
|
/* fail if file is a directory and no paged read */
|
||||||
if (*Fcb->Attributes & FILE_ATTRIBUTE_DIRECTORY && !PagingIo)
|
if (vfatFCBIsDirectory(Fcb) && !PagingIo)
|
||||||
{
|
{
|
||||||
Status = STATUS_INVALID_PARAMETER;
|
Status = STATUS_INVALID_PARAMETER;
|
||||||
goto ByeBye;
|
goto ByeBye;
|
||||||
|
@ -617,7 +618,7 @@ VfatRead(
|
||||||
goto ByeBye;
|
goto ByeBye;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IrpContext->Irp->Flags & (IRP_PAGING_IO | IRP_NOCACHE) || IsVolume)
|
if (NoCache || PagingIo || IsVolume)
|
||||||
{
|
{
|
||||||
if (ByteOffset.u.LowPart % BytesPerSector != 0 || Length % BytesPerSector != 0)
|
if (ByteOffset.u.LowPart % BytesPerSector != 0 || Length % BytesPerSector != 0)
|
||||||
{
|
{
|
||||||
|
@ -660,8 +661,7 @@ VfatRead(
|
||||||
|
|
||||||
Buffer = VfatGetUserBuffer(IrpContext->Irp, PagingIo);
|
Buffer = VfatGetUserBuffer(IrpContext->Irp, PagingIo);
|
||||||
|
|
||||||
if (!(IrpContext->Irp->Flags & (IRP_NOCACHE|IRP_PAGING_IO)) &&
|
if (!PagingIo && !NoCache && !IsVolume)
|
||||||
!(Fcb->Flags & (FCB_IS_PAGE_FILE|FCB_IS_VOLUME)))
|
|
||||||
{
|
{
|
||||||
// cached read
|
// cached read
|
||||||
Status = STATUS_SUCCESS;
|
Status = STATUS_SUCCESS;
|
||||||
|
@ -744,7 +744,7 @@ ByeBye:
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
IrpContext->Irp->IoStatus.Status = Status;
|
IrpContext->Irp->IoStatus.Status = Status;
|
||||||
if (IrpContext->FileObject->Flags & FO_SYNCHRONOUS_IO &&
|
if (BooleanFlagOn(IrpContext->FileObject->Flags, FO_SYNCHRONOUS_IO) &&
|
||||||
!PagingIo &&
|
!PagingIo &&
|
||||||
(NT_SUCCESS(Status) || Status == STATUS_END_OF_FILE))
|
(NT_SUCCESS(Status) || Status == STATUS_END_OF_FILE))
|
||||||
{
|
{
|
||||||
|
@ -771,7 +771,7 @@ VfatWrite(
|
||||||
ULONG Length = 0;
|
ULONG Length = 0;
|
||||||
PVOID Buffer;
|
PVOID Buffer;
|
||||||
ULONG BytesPerSector;
|
ULONG BytesPerSector;
|
||||||
BOOLEAN PagingIo, CanWait, IsVolume;
|
BOOLEAN PagingIo, CanWait, IsVolume, IsFAT, NoCache;
|
||||||
|
|
||||||
ASSERT(IrpContext);
|
ASSERT(IrpContext);
|
||||||
|
|
||||||
|
@ -792,7 +792,7 @@ VfatWrite(
|
||||||
Fcb = IrpContext->FileObject->FsContext;
|
Fcb = IrpContext->FileObject->FsContext;
|
||||||
ASSERT(Fcb);
|
ASSERT(Fcb);
|
||||||
|
|
||||||
if (Fcb->Flags & FCB_IS_PAGE_FILE)
|
if (BooleanFlagOn(Fcb->Flags, FCB_IS_PAGE_FILE))
|
||||||
{
|
{
|
||||||
PFATINFO FatInfo = &IrpContext->DeviceExt->FatInfo;
|
PFATINFO FatInfo = &IrpContext->DeviceExt->FatInfo;
|
||||||
IrpContext->Stack->Parameters.Write.ByteOffset.QuadPart += FatInfo->dataStart * FatInfo->BytesPerSector;
|
IrpContext->Stack->Parameters.Write.ByteOffset.QuadPart += FatInfo->dataStart * FatInfo->BytesPerSector;
|
||||||
|
@ -808,9 +808,11 @@ VfatWrite(
|
||||||
PagingIo = BooleanFlagOn(IrpContext->Irp->Flags, IRP_PAGING_IO);
|
PagingIo = BooleanFlagOn(IrpContext->Irp->Flags, IRP_PAGING_IO);
|
||||||
CanWait = BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT);
|
CanWait = BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT);
|
||||||
IsVolume = BooleanFlagOn(Fcb->Flags, FCB_IS_VOLUME);
|
IsVolume = BooleanFlagOn(Fcb->Flags, FCB_IS_VOLUME);
|
||||||
|
IsFAT = BooleanFlagOn(Fcb->Flags, FCB_IS_FAT);
|
||||||
|
NoCache = BooleanFlagOn(IrpContext->Irp->Flags, IRP_NOCACHE);
|
||||||
|
|
||||||
/* fail if file is a directory and no paged read */
|
/* fail if file is a directory and no paged read */
|
||||||
if (*Fcb->Attributes & FILE_ATTRIBUTE_DIRECTORY && !PagingIo)
|
if (vfatFCBIsDirectory(Fcb) && !PagingIo)
|
||||||
{
|
{
|
||||||
Status = STATUS_INVALID_PARAMETER;
|
Status = STATUS_INVALID_PARAMETER;
|
||||||
goto ByeBye;
|
goto ByeBye;
|
||||||
|
@ -831,7 +833,7 @@ VfatWrite(
|
||||||
goto ByeBye;
|
goto ByeBye;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Fcb->Flags & (FCB_IS_FAT | FCB_IS_VOLUME) ||
|
if (IsFAT || IsVolume ||
|
||||||
vfatDirEntryGetFirstCluster(IrpContext->DeviceExt, &Fcb->entry) == 1)
|
vfatDirEntryGetFirstCluster(IrpContext->DeviceExt, &Fcb->entry) == 1)
|
||||||
{
|
{
|
||||||
if (ByteOffset.QuadPart + Length > Fcb->RFCB.FileSize.QuadPart)
|
if (ByteOffset.QuadPart + Length > Fcb->RFCB.FileSize.QuadPart)
|
||||||
|
@ -842,7 +844,7 @@ VfatWrite(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IrpContext->Irp->Flags & (IRP_PAGING_IO|IRP_NOCACHE) || IsVolume)
|
if (PagingIo || NoCache || IsVolume)
|
||||||
{
|
{
|
||||||
if (ByteOffset.u.LowPart % BytesPerSector != 0 || Length % BytesPerSector != 0)
|
if (ByteOffset.u.LowPart % BytesPerSector != 0 || Length % BytesPerSector != 0)
|
||||||
{
|
{
|
||||||
|
@ -889,7 +891,7 @@ VfatWrite(
|
||||||
Resource = &Fcb->MainResource;
|
Resource = &Fcb->MainResource;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((Fcb->Flags & FCB_IS_PAGE_FILE) || PagingIo)
|
if (PagingIo)
|
||||||
{
|
{
|
||||||
if (!ExAcquireResourceSharedLite(Resource, CanWait))
|
if (!ExAcquireResourceSharedLite(Resource, CanWait))
|
||||||
{
|
{
|
||||||
|
@ -929,8 +931,7 @@ VfatWrite(
|
||||||
|
|
||||||
Buffer = VfatGetUserBuffer(IrpContext->Irp, PagingIo);
|
Buffer = VfatGetUserBuffer(IrpContext->Irp, PagingIo);
|
||||||
|
|
||||||
if (!(Fcb->Flags & (FCB_IS_FAT|FCB_IS_VOLUME)) &&
|
if (!IsFAT && !IsVolume && !PagingIo &&
|
||||||
!PagingIo &&
|
|
||||||
ByteOffset.u.LowPart + Length > Fcb->RFCB.FileSize.u.LowPart)
|
ByteOffset.u.LowPart + Length > Fcb->RFCB.FileSize.u.LowPart)
|
||||||
{
|
{
|
||||||
LARGE_INTEGER AllocationSize;
|
LARGE_INTEGER AllocationSize;
|
||||||
|
@ -943,8 +944,7 @@ VfatWrite(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(IrpContext->Irp->Flags & (IRP_NOCACHE|IRP_PAGING_IO)) &&
|
if (!NoCache && !PagingIo && !IsVolume)
|
||||||
!(Fcb->Flags & (FCB_IS_PAGE_FILE|FCB_IS_VOLUME)))
|
|
||||||
{
|
{
|
||||||
// cached write
|
// cached write
|
||||||
|
|
||||||
|
@ -1008,17 +1008,16 @@ VfatWrite(
|
||||||
}
|
}
|
||||||
|
|
||||||
Metadata:
|
Metadata:
|
||||||
if (!PagingIo &&
|
if (!PagingIo && !IsFAT && !IsVolume)
|
||||||
!(Fcb->Flags & (FCB_IS_FAT|FCB_IS_VOLUME)))
|
|
||||||
{
|
{
|
||||||
if(!(*Fcb->Attributes & FILE_ATTRIBUTE_DIRECTORY))
|
if(!vfatFCBIsDirectory(Fcb))
|
||||||
{
|
{
|
||||||
LARGE_INTEGER SystemTime;
|
LARGE_INTEGER SystemTime;
|
||||||
ULONG Filter;
|
ULONG Filter;
|
||||||
|
|
||||||
// set dates and times
|
// set dates and times
|
||||||
KeQuerySystemTime (&SystemTime);
|
KeQuerySystemTime (&SystemTime);
|
||||||
if (Fcb->Flags & FCB_IS_FATX_ENTRY)
|
if (BooleanFlagOn(Fcb->Flags, FCB_IS_FATX_ENTRY))
|
||||||
{
|
{
|
||||||
FsdSystemTimeToDosDateTime(IrpContext->DeviceExt,
|
FsdSystemTimeToDosDateTime(IrpContext->DeviceExt,
|
||||||
&SystemTime, &Fcb->entry.FatX.UpdateDate,
|
&SystemTime, &Fcb->entry.FatX.UpdateDate,
|
||||||
|
@ -1069,7 +1068,7 @@ ByeBye:
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
IrpContext->Irp->IoStatus.Status = Status;
|
IrpContext->Irp->IoStatus.Status = Status;
|
||||||
if (IrpContext->FileObject->Flags & FO_SYNCHRONOUS_IO &&
|
if (BooleanFlagOn(IrpContext->FileObject->Flags, FO_SYNCHRONOUS_IO) &&
|
||||||
!PagingIo && NT_SUCCESS(Status))
|
!PagingIo && NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
IrpContext->FileObject->CurrentByteOffset.QuadPart =
|
IrpContext->FileObject->CurrentByteOffset.QuadPart =
|
||||||
|
|
|
@ -516,6 +516,20 @@ VfatMarkIrpContextForQueue(PVFAT_IRP_CONTEXT IrpContext)
|
||||||
return STATUS_PENDING;
|
return STATUS_PENDING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FORCEINLINE
|
||||||
|
BOOLEAN
|
||||||
|
vfatFCBIsDirectory(PVFATFCB FCB)
|
||||||
|
{
|
||||||
|
return BooleanFlagOn(*FCB->Attributes, FILE_ATTRIBUTE_DIRECTORY);
|
||||||
|
}
|
||||||
|
|
||||||
|
FORCEINLINE
|
||||||
|
BOOLEAN
|
||||||
|
vfatFCBIsReadOnly(PVFATFCB FCB)
|
||||||
|
{
|
||||||
|
return BooleanFlagOn(*FCB->Attributes, FILE_ATTRIBUTE_READONLY);
|
||||||
|
}
|
||||||
|
|
||||||
/* blockdev.c */
|
/* blockdev.c */
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
|
|
@ -59,7 +59,7 @@ FsdGetFsVolumeInformation(
|
||||||
*BufferLength -= DeviceObject->Vpb->VolumeLabelLength;
|
*BufferLength -= DeviceObject->Vpb->VolumeLabelLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DeviceExt->VolumeFcb->Flags & FCB_IS_FATX_ENTRY)
|
if (BooleanFlagOn(DeviceExt->VolumeFcb->Flags, FCB_IS_FATX_ENTRY))
|
||||||
{
|
{
|
||||||
FsdDosDateTimeToSystemTime(DeviceExt,
|
FsdDosDateTimeToSystemTime(DeviceExt,
|
||||||
DeviceExt->VolumeFcb->entry.FatX.CreationDate,
|
DeviceExt->VolumeFcb->entry.FatX.CreationDate,
|
||||||
|
@ -260,7 +260,7 @@ FsdSetFsLabelInformation(
|
||||||
return STATUS_NAME_TOO_LONG;
|
return STATUS_NAME_TOO_LONG;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DeviceExt->Flags & VCB_IS_FATX)
|
if (BooleanFlagOn(DeviceExt->Flags, VCB_IS_FATX))
|
||||||
{
|
{
|
||||||
if (FsLabelInfo->VolumeLabelLength / sizeof(WCHAR) > 42)
|
if (FsLabelInfo->VolumeLabelLength / sizeof(WCHAR) > 42)
|
||||||
return STATUS_NAME_TOO_LONG;
|
return STATUS_NAME_TOO_LONG;
|
||||||
|
@ -289,7 +289,7 @@ FsdSetFsLabelInformation(
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
return Status;
|
return Status;
|
||||||
|
|
||||||
if (DeviceExt->Flags & VCB_IS_FATX)
|
if (BooleanFlagOn(DeviceExt->Flags, VCB_IS_FATX))
|
||||||
{
|
{
|
||||||
RtlCopyMemory(VolumeLabelDirEntry.FatX.Filename, cString, LabelLen);
|
RtlCopyMemory(VolumeLabelDirEntry.FatX.Filename, cString, LabelLen);
|
||||||
memset(&VolumeLabelDirEntry.FatX.Filename[LabelLen], ' ', 42 - LabelLen);
|
memset(&VolumeLabelDirEntry.FatX.Filename[LabelLen], ' ', 42 - LabelLen);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue