Extracted vfat8dot3ToFilename from GetEntryName
[reactos.git] / reactos / drivers / fs / vfat / fcb.c
1 /* $Id: fcb.c,v 1.1 2001/05/02 03:18:03 rex Exp $
2 *
3 *
4 * FILE: fcb.c
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)
10 */
11
12 /* ------------------------------------------------------- INCLUDES */
13
14 #include <ddk/ntddk.h>
15 #include <wchar.h>
16 #include <limits.h>
17
18 #define NDEBUG
19 #include <debug.h>
20
21 #include "vfat.h"
22
23 /* -------------------------------------------------------- DEFINES */
24
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')
27
28 /* -------------------------------------------------------- PUBLICS */
29
30 PVFATFCB vfatNewFCB (PWCHAR pFileName)
31 {
32 PVFATFCB rcFCB;
33
34 rcFCB = ExAllocatePoolWithTag (NonPagedPool, sizeof (VFATFCB), TAG_FCB);
35 memset (rcFCB, 0, sizeof (VFATFCB));
36 if (pFileName)
37 {
38 wcscpy (rcFCB->PathName, pFileName);
39 if (wcsrchr (rcFCB->PathName, '\\') != 0)
40 {
41 rcFCB->ObjectName = wcsrchr (rcFCB->PathName, '\\');
42 }
43 else
44 {
45 rcFCB->ObjectName = rcFCB->PathName;
46 }
47 }
48
49 return rcFCB;
50 }
51
52 void vfatGrabFCB (PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
53 {
54 KIRQL oldIrql;
55
56 KeAcquireSpinLock (&pVCB->FcbListLock, &oldIrql);
57 pFCB->RefCount++;
58 KeReleaseSpinLock (&pVCB->FcbListLock, oldIrql);
59 }
60
61 void vfatReleaseFCB (PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
62 {
63 KIRQL oldIrql;
64
65 KeAcquireSpinLock (&pVCB->FcbListLock, &oldIrql);
66 pFCB->RefCount--;
67 if (pFCB->RefCount <= 0)
68 {
69 RemoveEntryList (&pFCB->FcbListEntry);
70 ExFreePool (pFCB);
71 }
72 KeReleaseSpinLock (&pVCB->FcbListLock, oldIrql);
73 }
74
75 void vfatAddFCBToTable (PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
76 {
77 KIRQL oldIrql;
78
79 KeAcquireSpinLock (&pVCB->FcbListLock, &oldIrql);
80 pFCB->pDevExt = pVCB;
81 InsertTailList (&pVCB->FcbListHead, &pFCB->FcbListEntry);
82 KeReleaseSpinLock (&pVCB->FcbListLock, oldIrql);
83 }
84
85 PVFATFCB vfatGrabFCBFromTable (PDEVICE_EXTENSION pDeviceExt, PWSTR pFileName)
86 {
87 KIRQL oldIrql;
88 PVFATFCB rcFCB;
89 PLIST_ENTRY current_entry;
90
91 KeAcquireSpinLock (&pDeviceExt->FcbListLock, &oldIrql);
92 current_entry = pDeviceExt->FcbListHead.Flink;
93 while (current_entry != &pDeviceExt->FcbListHead)
94 {
95 rcFCB = CONTAINING_RECORD (current_entry, VFATFCB, FcbListEntry);
96
97 DPRINT ("Scanning %x(%S)\n", rcFCB, rcFCB->PathName);
98
99 if (wstrcmpi (pFileName, rcFCB->PathName))
100 {
101 rcFCB->RefCount++;
102 KeReleaseSpinLock (&pDeviceExt->FcbListLock, oldIrql);
103 return rcFCB;
104 }
105 current_entry = current_entry->Flink;
106 }
107 KeReleaseSpinLock (&pDeviceExt->FcbListLock, oldIrql);
108
109 return NULL;
110 }