mirror of
https://github.com/reactos/reactos.git
synced 2025-01-01 03:54:02 +00:00
[FASTFAT]
Move ReadVolumeLabel() to fsctl.c close to functions that need it svn path=/trunk/; revision=73829
This commit is contained in:
parent
9a213745ca
commit
9c5c0b479a
3 changed files with 109 additions and 113 deletions
|
@ -94,114 +94,6 @@ vfat8Dot3ToString(
|
||||||
DPRINT("'%wZ'\n", NameU);
|
DPRINT("'%wZ'\n", NameU);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* FUNCTION: Read the volume label
|
|
||||||
*/
|
|
||||||
NTSTATUS
|
|
||||||
ReadVolumeLabel(
|
|
||||||
PDEVICE_EXTENSION DeviceExt,
|
|
||||||
PVPB Vpb)
|
|
||||||
{
|
|
||||||
PVOID Context = NULL;
|
|
||||||
ULONG DirIndex = 0;
|
|
||||||
PDIR_ENTRY Entry;
|
|
||||||
PVFATFCB pFcb;
|
|
||||||
LARGE_INTEGER FileOffset;
|
|
||||||
UNICODE_STRING NameU;
|
|
||||||
ULONG SizeDirEntry;
|
|
||||||
ULONG EntriesPerPage;
|
|
||||||
OEM_STRING StringO;
|
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
|
||||||
|
|
||||||
NameU.Buffer = Vpb->VolumeLabel;
|
|
||||||
NameU.Length = 0;
|
|
||||||
NameU.MaximumLength = sizeof(Vpb->VolumeLabel);
|
|
||||||
*(Vpb->VolumeLabel) = 0;
|
|
||||||
Vpb->VolumeLabelLength = 0;
|
|
||||||
|
|
||||||
if (vfatVolumeIsFatX(DeviceExt))
|
|
||||||
{
|
|
||||||
SizeDirEntry = sizeof(FATX_DIR_ENTRY);
|
|
||||||
EntriesPerPage = FATX_ENTRIES_PER_PAGE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SizeDirEntry = sizeof(FAT_DIR_ENTRY);
|
|
||||||
EntriesPerPage = FAT_ENTRIES_PER_PAGE;
|
|
||||||
}
|
|
||||||
|
|
||||||
ExAcquireResourceExclusiveLite(&DeviceExt->DirResource, TRUE);
|
|
||||||
pFcb = vfatOpenRootFCB(DeviceExt);
|
|
||||||
ExReleaseResourceLite(&DeviceExt->DirResource);
|
|
||||||
|
|
||||||
FileOffset.QuadPart = 0;
|
|
||||||
_SEH2_TRY
|
|
||||||
{
|
|
||||||
CcMapData(pFcb->FileObject, &FileOffset, SizeDirEntry, MAP_WAIT, &Context, (PVOID*)&Entry);
|
|
||||||
}
|
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
|
||||||
{
|
|
||||||
Status = _SEH2_GetExceptionCode();
|
|
||||||
}
|
|
||||||
_SEH2_END;
|
|
||||||
if (NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
while (TRUE)
|
|
||||||
{
|
|
||||||
if (ENTRY_VOLUME(DeviceExt, Entry))
|
|
||||||
{
|
|
||||||
/* copy volume label */
|
|
||||||
if (vfatVolumeIsFatX(DeviceExt))
|
|
||||||
{
|
|
||||||
StringO.Buffer = (PCHAR)Entry->FatX.Filename;
|
|
||||||
StringO.MaximumLength = StringO.Length = Entry->FatX.FilenameLength;
|
|
||||||
RtlOemStringToUnicodeString(&NameU, &StringO, FALSE);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
vfat8Dot3ToString(&Entry->Fat, &NameU);
|
|
||||||
}
|
|
||||||
Vpb->VolumeLabelLength = NameU.Length;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (ENTRY_END(DeviceExt, Entry))
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
DirIndex++;
|
|
||||||
Entry = (PDIR_ENTRY)((ULONG_PTR)Entry + SizeDirEntry);
|
|
||||||
if ((DirIndex % EntriesPerPage) == 0)
|
|
||||||
{
|
|
||||||
CcUnpinData(Context);
|
|
||||||
FileOffset.u.LowPart += PAGE_SIZE;
|
|
||||||
_SEH2_TRY
|
|
||||||
{
|
|
||||||
CcMapData(pFcb->FileObject, &FileOffset, SizeDirEntry, MAP_WAIT, &Context, (PVOID*)&Entry);
|
|
||||||
}
|
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
|
||||||
{
|
|
||||||
Status = _SEH2_GetExceptionCode();
|
|
||||||
}
|
|
||||||
_SEH2_END;
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
Context = NULL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (Context)
|
|
||||||
{
|
|
||||||
CcUnpinData(Context);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ExAcquireResourceExclusiveLite(&DeviceExt->DirResource, TRUE);
|
|
||||||
vfatReleaseFCB(DeviceExt, pFcb);
|
|
||||||
ExReleaseResourceLite(&DeviceExt->DirResource);
|
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Find a file
|
* FUNCTION: Find a file
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -338,6 +338,115 @@ VfatHasFileSystem(
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FUNCTION: Read the volume label
|
||||||
|
*/
|
||||||
|
static
|
||||||
|
NTSTATUS
|
||||||
|
ReadVolumeLabel(
|
||||||
|
PDEVICE_EXTENSION DeviceExt,
|
||||||
|
PVPB Vpb)
|
||||||
|
{
|
||||||
|
PVOID Context = NULL;
|
||||||
|
ULONG DirIndex = 0;
|
||||||
|
PDIR_ENTRY Entry;
|
||||||
|
PVFATFCB pFcb;
|
||||||
|
LARGE_INTEGER FileOffset;
|
||||||
|
UNICODE_STRING NameU;
|
||||||
|
ULONG SizeDirEntry;
|
||||||
|
ULONG EntriesPerPage;
|
||||||
|
OEM_STRING StringO;
|
||||||
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
|
|
||||||
|
NameU.Buffer = Vpb->VolumeLabel;
|
||||||
|
NameU.Length = 0;
|
||||||
|
NameU.MaximumLength = sizeof(Vpb->VolumeLabel);
|
||||||
|
*(Vpb->VolumeLabel) = 0;
|
||||||
|
Vpb->VolumeLabelLength = 0;
|
||||||
|
|
||||||
|
if (vfatVolumeIsFatX(DeviceExt))
|
||||||
|
{
|
||||||
|
SizeDirEntry = sizeof(FATX_DIR_ENTRY);
|
||||||
|
EntriesPerPage = FATX_ENTRIES_PER_PAGE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SizeDirEntry = sizeof(FAT_DIR_ENTRY);
|
||||||
|
EntriesPerPage = FAT_ENTRIES_PER_PAGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
ExAcquireResourceExclusiveLite(&DeviceExt->DirResource, TRUE);
|
||||||
|
pFcb = vfatOpenRootFCB(DeviceExt);
|
||||||
|
ExReleaseResourceLite(&DeviceExt->DirResource);
|
||||||
|
|
||||||
|
FileOffset.QuadPart = 0;
|
||||||
|
_SEH2_TRY
|
||||||
|
{
|
||||||
|
CcMapData(pFcb->FileObject, &FileOffset, SizeDirEntry, MAP_WAIT, &Context, (PVOID*)&Entry);
|
||||||
|
}
|
||||||
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
Status = _SEH2_GetExceptionCode();
|
||||||
|
}
|
||||||
|
_SEH2_END;
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
while (TRUE)
|
||||||
|
{
|
||||||
|
if (ENTRY_VOLUME(DeviceExt, Entry))
|
||||||
|
{
|
||||||
|
/* copy volume label */
|
||||||
|
if (vfatVolumeIsFatX(DeviceExt))
|
||||||
|
{
|
||||||
|
StringO.Buffer = (PCHAR)Entry->FatX.Filename;
|
||||||
|
StringO.MaximumLength = StringO.Length = Entry->FatX.FilenameLength;
|
||||||
|
RtlOemStringToUnicodeString(&NameU, &StringO, FALSE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vfat8Dot3ToString(&Entry->Fat, &NameU);
|
||||||
|
}
|
||||||
|
Vpb->VolumeLabelLength = NameU.Length;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (ENTRY_END(DeviceExt, Entry))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
DirIndex++;
|
||||||
|
Entry = (PDIR_ENTRY)((ULONG_PTR)Entry + SizeDirEntry);
|
||||||
|
if ((DirIndex % EntriesPerPage) == 0)
|
||||||
|
{
|
||||||
|
CcUnpinData(Context);
|
||||||
|
FileOffset.u.LowPart += PAGE_SIZE;
|
||||||
|
_SEH2_TRY
|
||||||
|
{
|
||||||
|
CcMapData(pFcb->FileObject, &FileOffset, SizeDirEntry, MAP_WAIT, &Context, (PVOID*)&Entry);
|
||||||
|
}
|
||||||
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
Status = _SEH2_GetExceptionCode();
|
||||||
|
}
|
||||||
|
_SEH2_END;
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
Context = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Context)
|
||||||
|
{
|
||||||
|
CcUnpinData(Context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ExAcquireResourceExclusiveLite(&DeviceExt->DirResource, TRUE);
|
||||||
|
vfatReleaseFCB(DeviceExt, pFcb);
|
||||||
|
ExReleaseResourceLite(&DeviceExt->DirResource);
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Mount the filesystem
|
* FUNCTION: Mount the filesystem
|
||||||
|
|
|
@ -662,11 +662,6 @@ vfat8Dot3ToString(
|
||||||
PFAT_DIR_ENTRY pEntry,
|
PFAT_DIR_ENTRY pEntry,
|
||||||
PUNICODE_STRING NameU);
|
PUNICODE_STRING NameU);
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
ReadVolumeLabel(
|
|
||||||
PDEVICE_EXTENSION DeviceExt,
|
|
||||||
PVPB Vpb);
|
|
||||||
|
|
||||||
/* dir.c */
|
/* dir.c */
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
|
Loading…
Reference in a new issue