-/* $Id: fcb.c,v 1.5 2001/07/14 18:21:23 ekohl Exp $
+/* $Id: fcb.c,v 1.8 2001/07/28 07:05:56 hbirr Exp $
*
*
* FILE: fcb.c
/* -------------------------------------------------------- PUBLICS */
-PVFATFCB vfatNewFCB (PWCHAR pFileName)
+PVFATFCB
+vfatNewFCB(PWCHAR pFileName)
{
PVFATFCB rcFCB;
return rcFCB;
}
-void vfatDestroyFCB (PVFATFCB pFCB)
+VOID
+vfatDestroyFCB(PVFATFCB pFCB)
{
ExFreePool (pFCB);
}
BOOL
-vfatFCBIsDirectory (PDEVICE_EXTENSION pVCB, PVFATFCB FCB)
+vfatFCBIsDirectory(PDEVICE_EXTENSION pVCB, PVFATFCB FCB)
{
return FCB->entry.Attrib & FILE_ATTRIBUTE_DIRECTORY;
}
BOOL
-vfatFCBIsRoot (PVFATFCB FCB)
+vfatFCBIsRoot(PVFATFCB FCB)
{
return wcscmp (FCB->PathName, L"\\") == 0;
}
-void vfatGrabFCB (PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
+VOID
+vfatGrabFCB(PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
{
KIRQL oldIrql;
KeReleaseSpinLock (&pVCB->FcbListLock, oldIrql);
}
-void vfatReleaseFCB (PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
+VOID
+vfatReleaseFCB(PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
{
KIRQL oldIrql;
KeReleaseSpinLock (&pVCB->FcbListLock, oldIrql);
}
-void vfatAddFCBToTable (PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
+VOID
+vfatAddFCBToTable(PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
{
KIRQL oldIrql;
KeReleaseSpinLock (&pVCB->FcbListLock, oldIrql);
}
-PVFATFCB
-vfatGrabFCBFromTable (PDEVICE_EXTENSION pVCB, PWSTR pFileName)
+PVFATFCB
+vfatGrabFCBFromTable(PDEVICE_EXTENSION pVCB, PWSTR pFileName)
{
KIRQL oldIrql;
PVFATFCB rcFCB;
}
NTSTATUS
-vfatRequestAndValidateRegion (PDEVICE_EXTENSION pDeviceExt,
- PVFATFCB pFCB,
- ULONG pOffset,
- PVOID * pBuffer,
- PCACHE_SEGMENT * pCacheSegment,
- BOOL pExtend)
+vfatRequestAndValidateRegion(PDEVICE_EXTENSION pDeviceExt,
+ PVFATFCB pFCB,
+ ULONG pOffset,
+ PVOID * pBuffer,
+ PCACHE_SEGMENT * pCacheSegment,
+ BOOL pExtend)
{
NTSTATUS status;
BOOLEAN valid;
ULONG currentCluster;
ULONG i;
- status = CcRosRequestCacheSegment(pFCB->RFCB.Bcb,
+ status = CcRosRequestCacheSegment(pFCB->RFCB.Bcb,
pOffset,
pBuffer,
&valid,
return CcRosReleaseCacheSegment (pFCB->RFCB.Bcb, pCacheSegment, TRUE);
}
-PVFATFCB
-vfatMakeRootFCB (PDEVICE_EXTENSION pVCB)
+PVFATFCB
+vfatMakeRootFCB(PDEVICE_EXTENSION pVCB)
{
PVFATFCB FCB;
- FCB = vfatNewFCB (L"\\");
- memset (FCB->entry.Filename, ' ', 11);
+ FCB = vfatNewFCB(L"\\");
+ memset(FCB->entry.Filename, ' ', 11);
FCB->entry.FileSize = pVCB->rootDirectorySectors * BLOCKSIZE;
FCB->entry.Attrib = FILE_ATTRIBUTE_DIRECTORY;
if (pVCB->FatType == FAT32)
- {
- FCB->entry.FirstCluster = 2;
- }
+ {
+ FCB->entry.FirstCluster = ((struct _BootSector32*)(pVCB->Boot))->RootCluster & 0xffff;
+ FCB->entry.FirstClusterHigh = ((struct _BootSector32*)(pVCB->Boot))->RootCluster >> 16;
+ }
else
- {
- FCB->entry.FirstCluster = 1;
- }
+ {
+ FCB->entry.FirstCluster = 1;
+ }
FCB->RefCount = 1;
- vfatFCBInitializeCache (pVCB, FCB);
- vfatAddFCBToTable (pVCB, FCB);
+ vfatFCBInitializeCache(pVCB, FCB);
+ vfatAddFCBToTable(pVCB, FCB);
vfatGrabFCB(pVCB, FCB);
- return FCB;
+ return(FCB);
}
-PVFATFCB
-vfatOpenRootFCB (PDEVICE_EXTENSION pVCB)
+PVFATFCB
+vfatOpenRootFCB(PDEVICE_EXTENSION pVCB)
{
PVFATFCB FCB;
}
NTSTATUS
-vfatMakeFCBFromDirEntry (PVCB vcb,
- PVFATFCB directoryFCB,
- PWSTR longName,
- PFAT_DIR_ENTRY dirEntry,
- PVFATFCB * fileFCB)
+vfatMakeFCBFromDirEntry(PVCB vcb,
+ PVFATFCB directoryFCB,
+ PWSTR longName,
+ PFAT_DIR_ENTRY dirEntry,
+ PVFATFCB * fileFCB)
{
PVFATFCB rcFCB;
WCHAR pathName [MAX_PATH];
- if (longName [0] != 0 && wcslen (directoryFCB->PathName) +
+ if (longName [0] != 0 && wcslen (directoryFCB->PathName) +
sizeof(WCHAR) + wcslen (longName) > MAX_PATH)
{
return STATUS_OBJECT_NAME_INVALID;
directoryIndex,
currentLongName);
- if (!vfatIsDirEntryDeleted (¤tDirEntry))
+ if (!vfatIsDirEntryDeleted (¤tDirEntry)
+ && !vfatIsDirEntryVolume(¤tDirEntry))
{
if (currentLongName [0] != L'\0' && wstrcmpjoki (currentLongName, pFileToFind))
{