- Fixed the directory index of a file for FATX.

- Check for the file size before eache call to CcMapData. W2K doesnt like to map over the end of a directory.

svn path=/trunk/; revision=13284
This commit is contained in:
Hartmut Birr 2005-01-25 21:14:57 +00:00
parent 0d6305b3bc
commit 0bc04189e7

View file

@ -175,7 +175,8 @@ NTSTATUS FATGetNextDirEntry(PVOID * pContext,
{ {
CcUnpinData(*pContext); CcUnpinData(*pContext);
} }
if (!CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage)) if (FileOffset.u.LowPart >= pDirFcb->RFCB.FileSize.u.LowPart ||
!CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage))
{ {
*pContext = NULL; *pContext = NULL;
return STATUS_NO_MORE_ENTRIES; return STATUS_NO_MORE_ENTRIES;
@ -204,7 +205,8 @@ NTSTATUS FATGetNextDirEntry(PVOID * pContext,
{ {
CcUnpinData(*pContext); CcUnpinData(*pContext);
FileOffset.u.LowPart -= PAGE_SIZE; FileOffset.u.LowPart -= PAGE_SIZE;
if (!CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage)) if (FileOffset.u.LowPart >= pDirFcb->RFCB.FileSize.u.LowPart ||
!CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage))
{ {
CHECKPOINT; CHECKPOINT;
*pContext = NULL; *pContext = NULL;
@ -228,7 +230,8 @@ NTSTATUS FATGetNextDirEntry(PVOID * pContext,
{ {
CcUnpinData(*pContext); CcUnpinData(*pContext);
FileOffset.u.LowPart += PAGE_SIZE; FileOffset.u.LowPart += PAGE_SIZE;
if (!CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage)) if (FileOffset.u.LowPart >= pDirFcb->RFCB.FileSize.u.LowPart ||
!CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage))
{ {
CHECKPOINT; CHECKPOINT;
*pContext = NULL; *pContext = NULL;
@ -325,7 +328,8 @@ NTSTATUS FATGetNextDirEntry(PVOID * pContext,
{ {
CcUnpinData(*pContext); CcUnpinData(*pContext);
FileOffset.u.LowPart += PAGE_SIZE; FileOffset.u.LowPart += PAGE_SIZE;
if (!CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage)) if (FileOffset.u.LowPart >= pDirFcb->RFCB.FileSize.u.LowPart ||
!CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage))
{ {
CHECKPOINT; CHECKPOINT;
*pContext = NULL; *pContext = NULL;
@ -361,7 +365,6 @@ NTSTATUS FATXGetNextDirEntry(PVOID * pContext,
ULONG DirIndex = DirContext->DirIndex; ULONG DirIndex = DirContext->DirIndex;
FileOffset.u.HighPart = 0; FileOffset.u.HighPart = 0;
FileOffset.u.LowPart = ROUND_DOWN(DirContext->DirIndex * sizeof(FATX_DIR_ENTRY), PAGE_SIZE);
if (!vfatFCBIsRoot(pDirFcb)) if (!vfatFCBIsRoot(pDirFcb))
{ {
@ -403,7 +406,9 @@ NTSTATUS FATXGetNextDirEntry(PVOID * pContext,
{ {
CcUnpinData(*pContext); CcUnpinData(*pContext);
} }
if (!CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage)) FileOffset.u.LowPart = ROUND_DOWN(DirIndex * sizeof(FATX_DIR_ENTRY), PAGE_SIZE);
if (FileOffset.u.LowPart >= pDirFcb->RFCB.FileSize.u.LowPart ||
!CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage))
{ {
*pContext = NULL; *pContext = NULL;
return STATUS_NO_MORE_ENTRIES; return STATUS_NO_MORE_ENTRIES;
@ -412,33 +417,35 @@ NTSTATUS FATXGetNextDirEntry(PVOID * pContext,
fatxDirEntry = (PFATX_DIR_ENTRY)(*pPage) + DirIndex % FATX_ENTRIES_PER_PAGE; fatxDirEntry = (PFATX_DIR_ENTRY)(*pPage) + DirIndex % FATX_ENTRIES_PER_PAGE;
DirContext->StartIndex = DirIndex; DirContext->StartIndex = DirContext->DirIndex;
while (TRUE) while (TRUE)
{ {
if (FATX_ENTRY_END(fatxDirEntry)) if (FATX_ENTRY_END(fatxDirEntry))
{ {
CcUnpinData(*pContext); CcUnpinData(*pContext);
*pContext = NULL; *pContext = NULL;
return STATUS_NO_MORE_ENTRIES; return STATUS_NO_MORE_ENTRIES;
} }
if (!FATX_ENTRY_DELETED(fatxDirEntry)) if (!FATX_ENTRY_DELETED(fatxDirEntry))
{ {
RtlCopyMemory(&DirContext->DirEntry.FatX, fatxDirEntry, sizeof(FATX_DIR_ENTRY)); RtlCopyMemory(&DirContext->DirEntry.FatX, fatxDirEntry, sizeof(FATX_DIR_ENTRY));
break; break;
} }
DirContext->DirIndex++; DirContext->DirIndex++;
DirContext->StartIndex++; DirContext->StartIndex++;
if ((DirContext->DirIndex % FATX_ENTRIES_PER_PAGE) == 0) DirIndex++;
if ((DirIndex % FATX_ENTRIES_PER_PAGE) == 0)
{ {
CcUnpinData(*pContext); CcUnpinData(*pContext);
FileOffset.u.LowPart += PAGE_SIZE; FileOffset.u.LowPart += PAGE_SIZE;
if (!CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage)) if (FileOffset.u.LowPart >= pDirFcb->RFCB.FileSize.u.LowPart ||
!CcMapData(pDirFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, pContext, pPage))
{ {
CHECKPOINT; CHECKPOINT;
*pContext = NULL; *pContext = NULL;
return STATUS_NO_MORE_ENTRIES; return STATUS_NO_MORE_ENTRIES;
} }
fatxDirEntry = (PFATX_DIR_ENTRY)*pPage; fatxDirEntry = (PFATX_DIR_ENTRY)*pPage;
} }