mirror of
https://github.com/reactos/reactos.git
synced 2025-07-28 03:52:17 +00:00
[FASTFAT]
- Check the return value of CcPinRead svn path=/trunk/; revision=55013
This commit is contained in:
parent
15aa273475
commit
13baf6cb0b
2 changed files with 61 additions and 25 deletions
|
@ -98,9 +98,11 @@ vfatFindDirSpace(
|
||||||
{
|
{
|
||||||
CcUnpinData(Context);
|
CcUnpinData(Context);
|
||||||
}
|
}
|
||||||
/* FIXME: check return value */
|
if (!CcPinRead(pDirFcb->FileObject, &FileOffset, DeviceExt->FatInfo.BytesPerCluster,
|
||||||
CcPinRead(pDirFcb->FileObject, &FileOffset, DeviceExt->FatInfo.BytesPerCluster,
|
TRUE, &Context, (PVOID*)&pFatEntry))
|
||||||
TRUE, &Context, (PVOID*)&pFatEntry);
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
FileOffset.u.LowPart += DeviceExt->FatInfo.BytesPerCluster;
|
FileOffset.u.LowPart += DeviceExt->FatInfo.BytesPerCluster;
|
||||||
}
|
}
|
||||||
if (ENTRY_END(DeviceExt, pFatEntry))
|
if (ENTRY_END(DeviceExt, pFatEntry))
|
||||||
|
@ -152,8 +154,11 @@ vfatFindDirSpace(
|
||||||
/* clear the new dir cluster */
|
/* clear the new dir cluster */
|
||||||
FileOffset.u.LowPart = (ULONG)(pDirFcb->RFCB.FileSize.QuadPart -
|
FileOffset.u.LowPart = (ULONG)(pDirFcb->RFCB.FileSize.QuadPart -
|
||||||
DeviceExt->FatInfo.BytesPerCluster);
|
DeviceExt->FatInfo.BytesPerCluster);
|
||||||
CcPinRead(pDirFcb->FileObject, &FileOffset, DeviceExt->FatInfo.BytesPerCluster,
|
if (!CcPinRead(pDirFcb->FileObject, &FileOffset, DeviceExt->FatInfo.BytesPerCluster,
|
||||||
TRUE, &Context, (PVOID*)&pFatEntry);
|
TRUE, &Context, (PVOID*)&pFatEntry))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
if (DeviceExt->Flags & VCB_IS_FATX)
|
if (DeviceExt->Flags & VCB_IS_FATX)
|
||||||
memset(pFatEntry, 0xff, DeviceExt->FatInfo.BytesPerCluster);
|
memset(pFatEntry, 0xff, DeviceExt->FatInfo.BytesPerCluster);
|
||||||
else
|
else
|
||||||
|
@ -163,8 +168,11 @@ vfatFindDirSpace(
|
||||||
{
|
{
|
||||||
/* clear the entry after the last new entry */
|
/* clear the entry after the last new entry */
|
||||||
FileOffset.u.LowPart = (*start + nbSlots) * SizeDirEntry;
|
FileOffset.u.LowPart = (*start + nbSlots) * SizeDirEntry;
|
||||||
CcPinRead(pDirFcb->FileObject, &FileOffset, SizeDirEntry,
|
if (!CcPinRead(pDirFcb->FileObject, &FileOffset, SizeDirEntry,
|
||||||
TRUE, &Context, (PVOID*)&pFatEntry);
|
TRUE, &Context, (PVOID*)&pFatEntry))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
if (DeviceExt->Flags & VCB_IS_FATX)
|
if (DeviceExt->Flags & VCB_IS_FATX)
|
||||||
memset(pFatEntry, 0xff, SizeDirEntry);
|
memset(pFatEntry, 0xff, SizeDirEntry);
|
||||||
else
|
else
|
||||||
|
@ -437,8 +445,12 @@ FATAddEntry(
|
||||||
if (DirContext.StartIndex / i == DirContext.DirIndex / i)
|
if (DirContext.StartIndex / i == DirContext.DirIndex / i)
|
||||||
{
|
{
|
||||||
/* one cluster */
|
/* one cluster */
|
||||||
CcPinRead(ParentFcb->FileObject, &FileOffset, nbSlots * sizeof(FAT_DIR_ENTRY),
|
if (!CcPinRead(ParentFcb->FileObject, &FileOffset, nbSlots * sizeof(FAT_DIR_ENTRY),
|
||||||
TRUE, &Context, (PVOID*)&pFatEntry);
|
TRUE, &Context, (PVOID*)&pFatEntry))
|
||||||
|
{
|
||||||
|
ExFreePoolWithTag(Buffer, TAG_VFAT);
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
if (nbSlots > 1)
|
if (nbSlots > 1)
|
||||||
{
|
{
|
||||||
RtlCopyMemory(pFatEntry, Buffer, (nbSlots - 1) * sizeof(FAT_DIR_ENTRY));
|
RtlCopyMemory(pFatEntry, Buffer, (nbSlots - 1) * sizeof(FAT_DIR_ENTRY));
|
||||||
|
@ -451,15 +463,23 @@ FATAddEntry(
|
||||||
size = DeviceExt->FatInfo.BytesPerCluster -
|
size = DeviceExt->FatInfo.BytesPerCluster -
|
||||||
(DirContext.StartIndex * sizeof(FAT_DIR_ENTRY)) % DeviceExt->FatInfo.BytesPerCluster;
|
(DirContext.StartIndex * sizeof(FAT_DIR_ENTRY)) % DeviceExt->FatInfo.BytesPerCluster;
|
||||||
i = size / sizeof(FAT_DIR_ENTRY);
|
i = size / sizeof(FAT_DIR_ENTRY);
|
||||||
CcPinRead(ParentFcb->FileObject, &FileOffset, size, TRUE,
|
if (!CcPinRead(ParentFcb->FileObject, &FileOffset, size, TRUE,
|
||||||
&Context, (PVOID*)&pFatEntry);
|
&Context, (PVOID*)&pFatEntry))
|
||||||
|
{
|
||||||
|
ExFreePoolWithTag(Buffer, TAG_VFAT);
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
RtlCopyMemory(pFatEntry, Buffer, size);
|
RtlCopyMemory(pFatEntry, Buffer, size);
|
||||||
CcSetDirtyPinnedData(Context, NULL);
|
CcSetDirtyPinnedData(Context, NULL);
|
||||||
CcUnpinData(Context);
|
CcUnpinData(Context);
|
||||||
FileOffset.u.LowPart += size;
|
FileOffset.u.LowPart += size;
|
||||||
CcPinRead(ParentFcb->FileObject, &FileOffset,
|
if (!CcPinRead(ParentFcb->FileObject, &FileOffset,
|
||||||
nbSlots * sizeof(FAT_DIR_ENTRY) - size,
|
nbSlots * sizeof(FAT_DIR_ENTRY) - size,
|
||||||
TRUE, &Context, (PVOID*)&pFatEntry);
|
TRUE, &Context, (PVOID*)&pFatEntry))
|
||||||
|
{
|
||||||
|
ExFreePoolWithTag(Buffer, TAG_VFAT);
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
if (nbSlots - 1 > i)
|
if (nbSlots - 1 > i)
|
||||||
{
|
{
|
||||||
RtlCopyMemory(pFatEntry, (PVOID)(Buffer + size), (nbSlots - 1 - i) * sizeof(FAT_DIR_ENTRY));
|
RtlCopyMemory(pFatEntry, (PVOID)(Buffer + size), (nbSlots - 1 - i) * sizeof(FAT_DIR_ENTRY));
|
||||||
|
@ -482,8 +502,12 @@ FATAddEntry(
|
||||||
if (RequestedOptions & FILE_DIRECTORY_FILE)
|
if (RequestedOptions & FILE_DIRECTORY_FILE)
|
||||||
{
|
{
|
||||||
FileOffset.QuadPart = 0;
|
FileOffset.QuadPart = 0;
|
||||||
CcPinRead((*Fcb)->FileObject, &FileOffset, DeviceExt->FatInfo.BytesPerCluster, TRUE,
|
if (!CcPinRead((*Fcb)->FileObject, &FileOffset, DeviceExt->FatInfo.BytesPerCluster, TRUE,
|
||||||
&Context, (PVOID*)&pFatEntry);
|
&Context, (PVOID*)&pFatEntry))
|
||||||
|
{
|
||||||
|
ExFreePoolWithTag(Buffer, TAG_VFAT);
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
/* clear the new directory cluster */
|
/* clear the new directory cluster */
|
||||||
RtlZeroMemory(pFatEntry, DeviceExt->FatInfo.BytesPerCluster);
|
RtlZeroMemory(pFatEntry, DeviceExt->FatInfo.BytesPerCluster);
|
||||||
/* create '.' and '..' */
|
/* create '.' and '..' */
|
||||||
|
@ -581,8 +605,11 @@ FATXAddEntry(
|
||||||
/* add entry into parent directory */
|
/* add entry into parent directory */
|
||||||
FileOffset.u.HighPart = 0;
|
FileOffset.u.HighPart = 0;
|
||||||
FileOffset.u.LowPart = Index * sizeof(FATX_DIR_ENTRY);
|
FileOffset.u.LowPart = Index * sizeof(FATX_DIR_ENTRY);
|
||||||
CcPinRead(ParentFcb->FileObject, &FileOffset, sizeof(FATX_DIR_ENTRY),
|
if (!CcPinRead(ParentFcb->FileObject, &FileOffset, sizeof(FATX_DIR_ENTRY),
|
||||||
TRUE, &Context, (PVOID*)&pFatXDirEntry);
|
TRUE, &Context, (PVOID*)&pFatXDirEntry))
|
||||||
|
{
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
RtlCopyMemory(pFatXDirEntry, &DirContext.DirEntry.FatX, sizeof(FATX_DIR_ENTRY));
|
RtlCopyMemory(pFatXDirEntry, &DirContext.DirEntry.FatX, sizeof(FATX_DIR_ENTRY));
|
||||||
CcSetDirtyPinnedData(Context, NULL);
|
CcSetDirtyPinnedData(Context, NULL);
|
||||||
CcUnpinData(Context);
|
CcUnpinData(Context);
|
||||||
|
@ -638,8 +665,11 @@ FATDelEntry(
|
||||||
CcUnpinData(Context);
|
CcUnpinData(Context);
|
||||||
}
|
}
|
||||||
Offset.u.LowPart = (i * sizeof(FAT_DIR_ENTRY) / PAGE_SIZE) * PAGE_SIZE;
|
Offset.u.LowPart = (i * sizeof(FAT_DIR_ENTRY) / PAGE_SIZE) * PAGE_SIZE;
|
||||||
CcPinRead(pFcb->parentFcb->FileObject, &Offset, sizeof(FAT_DIR_ENTRY), TRUE,
|
if (!CcPinRead(pFcb->parentFcb->FileObject, &Offset, sizeof(FAT_DIR_ENTRY), TRUE,
|
||||||
&Context, (PVOID*)&pDirEntry);
|
&Context, (PVOID*)&pDirEntry))
|
||||||
|
{
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
pDirEntry[i % (PAGE_SIZE / sizeof(FAT_DIR_ENTRY))].Filename[0] = 0xe5;
|
pDirEntry[i % (PAGE_SIZE / sizeof(FAT_DIR_ENTRY))].Filename[0] = 0xe5;
|
||||||
if (i == pFcb->dirIndex)
|
if (i == pFcb->dirIndex)
|
||||||
|
|
|
@ -281,12 +281,18 @@ FsdSetFsLabelInformation(PDEVICE_OBJECT DeviceObject,
|
||||||
{
|
{
|
||||||
FileOffset.u.HighPart = 0;
|
FileOffset.u.HighPart = 0;
|
||||||
FileOffset.u.LowPart = VolumeLabelDirIndex * SizeDirEntry;
|
FileOffset.u.LowPart = VolumeLabelDirIndex * SizeDirEntry;
|
||||||
CcPinRead(pRootFcb->FileObject, &FileOffset, SizeDirEntry,
|
if (!CcPinRead(pRootFcb->FileObject, &FileOffset, SizeDirEntry,
|
||||||
TRUE, &Context, (PVOID*)&Entry);
|
TRUE, &Context, (PVOID*)&Entry))
|
||||||
RtlCopyMemory(Entry, &VolumeLabelDirEntry, SizeDirEntry);
|
{
|
||||||
CcSetDirtyPinnedData(Context, NULL);
|
Status = STATUS_UNSUCCESSFUL;
|
||||||
CcUnpinData(Context);
|
}
|
||||||
Status = STATUS_SUCCESS;
|
else
|
||||||
|
{
|
||||||
|
RtlCopyMemory(Entry, &VolumeLabelDirEntry, SizeDirEntry);
|
||||||
|
CcSetDirtyPinnedData(Context, NULL);
|
||||||
|
CcUnpinData(Context);
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue