1 /* $Id: fcb.c,v 1.1 2001/05/02 03:18:03 rex Exp $
5 * PURPOSE: Routines to manipulate FCBs.
6 * COPYRIGHT: See COPYING in the top level directory
7 * PROJECT: ReactOS kernel
8 * PROGRAMMER: Jason Filby (jasonfilby@yahoo.com)
9 * Rex Jolliff (rex@lvcablemodem.com)
12 /* ------------------------------------------------------- INCLUDES */
14 #include <ddk/ntddk.h>
23 /* -------------------------------------------------------- DEFINES */
25 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
26 #define TAG_FCB TAG('V', 'F', 'C', 'B')
28 /* -------------------------------------------------------- PUBLICS */
30 PVFATFCB
vfatNewFCB (PWCHAR pFileName
)
34 rcFCB
= ExAllocatePoolWithTag (NonPagedPool
, sizeof (VFATFCB
), TAG_FCB
);
35 memset (rcFCB
, 0, sizeof (VFATFCB
));
38 wcscpy (rcFCB
->PathName
, pFileName
);
39 if (wcsrchr (rcFCB
->PathName
, '\\') != 0)
41 rcFCB
->ObjectName
= wcsrchr (rcFCB
->PathName
, '\\');
45 rcFCB
->ObjectName
= rcFCB
->PathName
;
52 void vfatGrabFCB (PDEVICE_EXTENSION pVCB
, PVFATFCB pFCB
)
56 KeAcquireSpinLock (&pVCB
->FcbListLock
, &oldIrql
);
58 KeReleaseSpinLock (&pVCB
->FcbListLock
, oldIrql
);
61 void vfatReleaseFCB (PDEVICE_EXTENSION pVCB
, PVFATFCB pFCB
)
65 KeAcquireSpinLock (&pVCB
->FcbListLock
, &oldIrql
);
67 if (pFCB
->RefCount
<= 0)
69 RemoveEntryList (&pFCB
->FcbListEntry
);
72 KeReleaseSpinLock (&pVCB
->FcbListLock
, oldIrql
);
75 void vfatAddFCBToTable (PDEVICE_EXTENSION pVCB
, PVFATFCB pFCB
)
79 KeAcquireSpinLock (&pVCB
->FcbListLock
, &oldIrql
);
81 InsertTailList (&pVCB
->FcbListHead
, &pFCB
->FcbListEntry
);
82 KeReleaseSpinLock (&pVCB
->FcbListLock
, oldIrql
);
85 PVFATFCB
vfatGrabFCBFromTable (PDEVICE_EXTENSION pDeviceExt
, PWSTR pFileName
)
89 PLIST_ENTRY current_entry
;
91 KeAcquireSpinLock (&pDeviceExt
->FcbListLock
, &oldIrql
);
92 current_entry
= pDeviceExt
->FcbListHead
.Flink
;
93 while (current_entry
!= &pDeviceExt
->FcbListHead
)
95 rcFCB
= CONTAINING_RECORD (current_entry
, VFATFCB
, FcbListEntry
);
97 DPRINT ("Scanning %x(%S)\n", rcFCB
, rcFCB
->PathName
);
99 if (wstrcmpi (pFileName
, rcFCB
->PathName
))
102 KeReleaseSpinLock (&pDeviceExt
->FcbListLock
, oldIrql
);
105 current_entry
= current_entry
->Flink
;
107 KeReleaseSpinLock (&pDeviceExt
->FcbListLock
, oldIrql
);