ReactOS 0.4.16-dev-252-g9ccafe8
fcb.c
Go to the documentation of this file.
1/*
2 * ReactOS kernel
3 * Copyright (C) 2002, 2014 ReactOS Team
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
18 *
19 * COPYRIGHT: See COPYING in the top level directory
20 * PROJECT: ReactOS kernel
21 * FILE: drivers/filesystem/ntfs/fcb.c
22 * PURPOSE: NTFS filesystem driver
23 * PROGRAMMERS: Eric Kohl
24 * Pierre Schweitzer (pierre@reactos.org)
25 * Hervé Poussineau (hpoussin@reactos.org)
26 */
27
28/* INCLUDES *****************************************************************/
29
30#include "ntfs.h"
31
32#define NDEBUG
33#include <debug.h>
34
35/* FUNCTIONS ****************************************************************/
36
37static
40{
41 if (*FileName == L'\0')
42 {
43 return NULL;
44 }
45
46 while (*FileName != L'\0' && *FileName != L'\\')
47 {
48 FileName++;
49 }
50
51 return FileName;
52}
53
54
55static
56VOID
58 PCWSTR pSource,
59 size_t pLength)
60{
61 wcsncpy(pTarget, pSource, pLength);
62 pTarget[pLength] = L'\0';
63}
64
65
70{
72
73 ASSERT(Vcb);
74 ASSERT(Vcb->Identifier.Type == NTFS_TYPE_VCB);
75
76 Fcb = ExAllocateFromNPagedLookasideList(&NtfsGlobalData->FcbLookasideList);
77 if (Fcb == NULL)
78 {
79 return NULL;
80 }
81
82 RtlZeroMemory(Fcb, sizeof(NTFS_FCB));
83
86
87 Fcb->Vcb = Vcb;
88
89 if (FileName)
90 {
92 if (wcsrchr(Fcb->PathName, '\\') != 0)
93 {
95 }
96 else
97 {
99 }
100 }
101
102 if (Stream)
103 {
105 }
106 else
107 {
108 Fcb->Stream[0] = UNICODE_NULL;
109 }
110
112
114
115 return Fcb;
116}
117
118
119VOID
121{
122 ASSERT(Fcb);
124
126
127 ExFreeToNPagedLookasideList(&NtfsGlobalData->FcbLookasideList, Fcb);
128}
129
130
133{
135}
136
137
140{
142}
143
144
147{
149}
150
153{
155}
156
159{
160 return (wcscmp(Fcb->PathName, L"\\") == 0);
161}
162
163
164VOID
167{
168 KIRQL oldIrql;
169
170 DPRINT("grabbing FCB at %p: %S, refCount:%d\n",
171 Fcb,
172 Fcb->PathName,
173 Fcb->RefCount);
174
175 KeAcquireSpinLock(&Vcb->FcbListLock, &oldIrql);
176 Fcb->RefCount++;
177 KeReleaseSpinLock(&Vcb->FcbListLock, oldIrql);
178}
179
180
181VOID
184{
185 KIRQL oldIrql;
186
187 DPRINT("releasing FCB at %p: %S, refCount:%d\n",
188 Fcb,
189 Fcb->PathName,
190 Fcb->RefCount);
191
192 KeAcquireSpinLock(&Vcb->FcbListLock, &oldIrql);
193 Fcb->RefCount--;
194 if (Fcb->RefCount <= 0 && !NtfsFCBIsDirectory(Fcb))
195 {
197 KeReleaseSpinLock(&Vcb->FcbListLock, oldIrql);
200 }
201 else
202 {
203 KeReleaseSpinLock(&Vcb->FcbListLock, oldIrql);
204 }
205}
206
207
208VOID
211{
212 KIRQL oldIrql;
213
214 KeAcquireSpinLock(&Vcb->FcbListLock, &oldIrql);
215 Fcb->Vcb = Vcb;
216 InsertTailList(&Vcb->FcbListHead, &Fcb->FcbListEntry);
217 KeReleaseSpinLock(&Vcb->FcbListLock, oldIrql);
218}
219
220
224{
225 KIRQL oldIrql;
227 PLIST_ENTRY current_entry;
228
229 KeAcquireSpinLock(&Vcb->FcbListLock, &oldIrql);
230
231 if (FileName == NULL || *FileName == 0)
232 {
233 DPRINT("Return FCB for stream file object\n");
234 Fcb = Vcb->StreamFileObject->FsContext;
235 Fcb->RefCount++;
236 KeReleaseSpinLock(&Vcb->FcbListLock, oldIrql);
237 return Fcb;
238 }
239
240 current_entry = Vcb->FcbListHead.Flink;
241 while (current_entry != &Vcb->FcbListHead)
242 {
243 Fcb = CONTAINING_RECORD(current_entry, NTFS_FCB, FcbListEntry);
244
245 DPRINT("Comparing '%S' and '%S'\n", FileName, Fcb->PathName);
246 if (_wcsicmp(FileName, Fcb->PathName) == 0)
247 {
248 Fcb->RefCount++;
249 KeReleaseSpinLock(&Vcb->FcbListLock, oldIrql);
250 return Fcb;
251 }
252
253 //FIXME: need to compare against short name in FCB here
254
255 current_entry = current_entry->Flink;
256 }
257
258 KeReleaseSpinLock(&Vcb->FcbListLock, oldIrql);
259
260 return NULL;
261}
262
263
267{
270 PNTFS_CCB newCCB;
271
272 FileObject = IoCreateStreamFileObject(NULL, Vcb->StorageDevice);
273
275 if (newCCB == NULL)
276 {
278 }
279
280 RtlZeroMemory(newCCB, sizeof(NTFS_CCB));
281
282 newCCB->Identifier.Type = NTFS_TYPE_CCB;
283 newCCB->Identifier.Size = sizeof(NTFS_TYPE_CCB);
284
285 FileObject->SectionObjectPointer = &Fcb->SectionObjectPointers;
286 FileObject->FsContext = Fcb;
287 FileObject->FsContext2 = newCCB;
288 newCCB->PtrFileObject = FileObject;
290 Fcb->Vcb = Vcb;
291
294 {
297 FALSE,
299 Fcb);
300 }
302 {
303 FileObject->FsContext2 = NULL;
304 ExFreePoolWithTag(newCCB, TAG_CCB);
307 return _SEH2_GetExceptionCode();
308 }
309 _SEH2_END;
310
313
314 return Status;
315}
316
317
320{
322 PFILE_RECORD_HEADER MftRecord;
324
325 MftRecord = ExAllocateFromNPagedLookasideList(&Vcb->FileRecLookasideList);
326 if (MftRecord == NULL)
327 {
328 return NULL;
329 }
330
331 if (!NT_SUCCESS(ReadFileRecord(Vcb, NTFS_FILE_ROOT, MftRecord)))
332 {
333 ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, MftRecord);
334 return NULL;
335 }
336
338 if (!FileName)
339 {
340 ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, MftRecord);
341 return NULL;
342 }
343
344 Fcb = NtfsCreateFCB(L"\\", NULL, Vcb);
345 if (!Fcb)
346 {
347 ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, MftRecord);
348 return NULL;
349 }
350
352 Fcb->Entry.NameType = FileName->NameType;
353 Fcb->Entry.NameLength = 0;
355 Fcb->RefCount = 1;
356 Fcb->DirIndex = 0;
357 Fcb->RFCB.FileSize.QuadPart = FileName->DataSize;
359 Fcb->RFCB.AllocationSize.QuadPart = FileName->AllocatedSize;
361 Fcb->LinkCount = MftRecord->LinkCount;
362
366
367 ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, MftRecord);
368
369 return Fcb;
370}
371
372
375{
377
379 if (Fcb == NULL)
380 {
382 }
383
384 return Fcb;
385}
386
387
390 PNTFS_FCB DirectoryFCB,
394 ULONGLONG MFTIndex,
395 PNTFS_FCB * fileFCB)
396{
397 WCHAR pathName[MAX_PATH];
399 PSTANDARD_INFORMATION StdInfo;
400 PNTFS_FCB rcFCB;
401 ULONGLONG Size, AllocatedSize;
402
403 DPRINT("NtfsMakeFCBFromDirEntry(%p, %p, %wZ, %p, %p, %p)\n", Vcb, DirectoryFCB, Name, Stream, Record, fileFCB);
404
406 if (!FileName)
407 {
408 return STATUS_OBJECT_NAME_NOT_FOUND; // Not sure that's the best here
409 }
410
411 if (DirectoryFCB && Name)
412 {
413 if (Name->Buffer[0] != 0 && wcslen(DirectoryFCB->PathName) +
414 sizeof(WCHAR) + Name->Length / sizeof(WCHAR) > MAX_PATH)
415 {
417 }
418
419 wcscpy(pathName, DirectoryFCB->PathName);
420 if (!NtfsFCBIsRoot(DirectoryFCB))
421 {
422 wcscat(pathName, L"\\");
423 }
424 wcscat(pathName, Name->Buffer);
425 }
426 else
427 {
428 RtlCopyMemory(pathName, FileName->Name, FileName->NameLength * sizeof (WCHAR));
429 pathName[FileName->NameLength] = UNICODE_NULL;
430 }
431
432 Size = NtfsGetFileSize(Vcb, Record, (Stream ? Stream : L""), (Stream ? wcslen(Stream) : 0), &AllocatedSize);
433
434 rcFCB = NtfsCreateFCB(pathName, Stream, Vcb);
435 if (!rcFCB)
436 {
438 }
439
440 memcpy(&rcFCB->Entry, FileName, FIELD_OFFSET(FILENAME_ATTRIBUTE, NameLength));
441 rcFCB->Entry.NameType = FileName->NameType;
442 rcFCB->RFCB.FileSize.QuadPart = Size;
444 rcFCB->RFCB.AllocationSize.QuadPart = AllocatedSize;
445
447 if (StdInfo != NULL)
448 {
449 rcFCB->Entry.FileAttributes |= StdInfo->FileAttribute;
450 }
451
453 rcFCB->RefCount = 1;
454 rcFCB->MFTIndex = MFTIndex;
455 rcFCB->LinkCount = Record->LinkCount;
456 NtfsAddFCBToTable(Vcb, rcFCB);
457 *fileFCB = rcFCB;
458
459 return STATUS_SUCCESS;
460}
461
462
467{
468 PNTFS_CCB newCCB;
469
471 if (newCCB == NULL)
472 {
474 }
475
476 RtlZeroMemory(newCCB, sizeof(NTFS_CCB));
477
478 newCCB->Identifier.Type = NTFS_TYPE_CCB;
479 newCCB->Identifier.Size = sizeof(NTFS_TYPE_CCB);
480
481 FileObject->SectionObjectPointer = &Fcb->SectionObjectPointers;
482 FileObject->FsContext = Fcb;
483 FileObject->FsContext2 = newCCB;
484 newCCB->PtrFileObject = FileObject;
485 Fcb->Vcb = Vcb;
486
488 {
490 {
493 FALSE,
495 Fcb);
496 }
498 {
499 FileObject->FsContext2 = NULL;
500 ExFreePoolWithTag(newCCB, TAG_CCB);
501 return _SEH2_GetExceptionCode();
502 }
503 _SEH2_END;
504
506 }
507
508 //DPRINT("file open: fcb:%x file size: %d\n", Fcb, Fcb->Entry.DataLengthL);
509
510 return STATUS_SUCCESS;
511}
512
513
514static NTSTATUS
516 PNTFS_FCB DirectoryFcb,
517 PWSTR FileToFind,
518 BOOLEAN CaseSensitive,
519 PNTFS_FCB *FoundFCB)
520{
522 ULONGLONG CurrentDir;
524 PFILE_RECORD_HEADER FileRecord;
525 ULONGLONG MFTIndex;
526 PWSTR Colon, OldColon;
527 PNTFS_ATTR_CONTEXT DataContext;
528 USHORT Length = 0;
529
530 DPRINT("NtfsDirFindFile(%p, %p, %S, %s, %p)\n",
531 Vcb,
532 DirectoryFcb,
533 FileToFind,
534 CaseSensitive ? "TRUE" : "FALSE",
535 FoundFCB);
536
537 *FoundFCB = NULL;
538 RtlInitUnicodeString(&File, FileToFind);
539 CurrentDir = DirectoryFcb->MFTIndex;
540
541 Colon = wcsrchr(FileToFind, L':');
542 if (Colon != NULL)
543 {
544 Length = File.Length;
545 File.Length = (Colon - FileToFind) * sizeof(WCHAR);
546
547 if (_wcsicmp(Colon + 1, L"$DATA") == 0)
548 {
549 OldColon = Colon;
550 Colon[0] = UNICODE_NULL;
551 Colon = wcsrchr(FileToFind, L':');
552 if (Colon != NULL)
553 {
554 Length = File.Length;
555 File.Length = (Colon - FileToFind) * sizeof(WCHAR);
556 }
557 else
558 {
559 Colon = OldColon;
560 Colon[0] = L':';
561 }
562 }
563
564 /* Skip colon */
565 ++Colon;
566 DPRINT1("Will now look for file '%wZ' with stream '%S'\n", &File, Colon);
567 }
568
569 Status = NtfsLookupFileAt(Vcb, &File, CaseSensitive, &FileRecord, &MFTIndex, CurrentDir);
570 if (!NT_SUCCESS(Status))
571 {
572 return Status;
573 }
574
575 if (Length != 0)
576 {
577 File.Length = Length;
578 }
579
580 if ((FileRecord->Flags & FRH_DIRECTORY) && Colon != 0)
581 {
582 ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, FileRecord);
584 }
585 else if (Colon != 0)
586 {
587 Status = FindAttribute(Vcb, FileRecord, AttributeData, Colon, wcslen(Colon), &DataContext, NULL);
588 if (!NT_SUCCESS(Status))
589 {
591 }
592 ReleaseAttributeContext(DataContext);
593 }
594
595 Status = NtfsMakeFCBFromDirEntry(Vcb, DirectoryFcb, &File, Colon, FileRecord, MFTIndex, FoundFCB);
596 ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, FileRecord);
597
598 return Status;
599}
600
601
604 PNTFS_FCB *pParentFCB,
605 PNTFS_FCB *pFCB,
606 PCWSTR pFileName,
607 BOOLEAN CaseSensitive)
608{
610 WCHAR pathName [MAX_PATH];
611 WCHAR elementName [MAX_PATH];
612 PCWSTR currentElement;
614 PNTFS_FCB parentFCB;
615
616 DPRINT("NtfsGetFCBForFile(%p, %p, %p, '%S', %s)\n",
617 Vcb,
618 pParentFCB,
619 pFCB,
620 pFileName,
621 CaseSensitive ? "TRUE" : "FALSE");
622
623 /* Dummy code */
624// FCB = NtfsOpenRootFCB(Vcb);
625// *pFCB = FCB;
626// *pParentFCB = NULL;
627
628#if 1
629 /* Trivial case, open of the root directory on volume */
630 if (pFileName[0] == L'\0' || wcscmp(pFileName, L"\\") == 0)
631 {
632 DPRINT("returning root FCB\n");
633
635 *pFCB = FCB;
636 *pParentFCB = NULL;
637
639 }
640 else
641 {
642 currentElement = pFileName + 1;
643 wcscpy (pathName, L"\\");
645 }
646
647 parentFCB = NULL;
648
649 /* Parse filename and check each path element for existence and access */
650 while (NtfsGetNextPathElement(currentElement) != 0)
651 {
652 /* Skip blank directory levels */
653 if ((NtfsGetNextPathElement(currentElement) - currentElement) == 0)
654 {
655 currentElement++;
656 continue;
657 }
658
659 DPRINT("Parsing, currentElement:%S\n", currentElement);
660 DPRINT(" parentFCB:%p FCB:%p\n", parentFCB, FCB);
661
662 /* Descend to next directory level */
663 if (parentFCB)
664 {
665 NtfsReleaseFCB(Vcb, parentFCB);
666 parentFCB = NULL;
667 }
668
669 /* fail if element in FCB is not a directory */
671 {
672 DPRINT("Element in requested path is not a directory\n");
673
675 FCB = 0;
676 *pParentFCB = NULL;
677 *pFCB = NULL;
678
680 }
681
682 parentFCB = FCB;
683
684 /* Extract next directory level into dirName */
685 NtfsWSubString(pathName,
686 pFileName,
687 NtfsGetNextPathElement(currentElement) - pFileName);
688 DPRINT(" pathName:%S\n", pathName);
689
690 FCB = NtfsGrabFCBFromTable(Vcb, pathName);
691 if (FCB == NULL)
692 {
693 NtfsWSubString(elementName,
694 currentElement,
695 NtfsGetNextPathElement(currentElement) - currentElement);
696 DPRINT(" elementName:%S\n", elementName);
697
698 Status = NtfsDirFindFile(Vcb, parentFCB, elementName, CaseSensitive, &FCB);
700 {
701 *pParentFCB = parentFCB;
702 *pFCB = NULL;
703 currentElement = NtfsGetNextPathElement(currentElement);
704 if (*currentElement == L'\0' || NtfsGetNextPathElement(currentElement + 1) == 0)
705 {
707 }
708 else
709 {
711 }
712 }
713 else if (!NT_SUCCESS(Status))
714 {
715 NtfsReleaseFCB(Vcb, parentFCB);
716 *pParentFCB = NULL;
717 *pFCB = NULL;
718
719 return Status;
720 }
721 }
722
723 currentElement = NtfsGetNextPathElement(currentElement);
724 }
725
726 *pParentFCB = parentFCB;
727 *pFCB = FCB;
728#endif
729
730 return STATUS_SUCCESS;
731}
732
733
736 PNTFS_FCB pFCB,
737 ULONG Type,
738 PCWSTR Name,
739 ULONG NameLength,
740 PVOID * Data)
741{
743 PFILE_RECORD_HEADER FileRecord;
744 PNTFS_ATTR_CONTEXT AttrCtxt;
745 ULONGLONG AttrLength;
746
747 FileRecord = ExAllocateFromNPagedLookasideList(&Vcb->FileRecLookasideList);
748 if (FileRecord == NULL)
749 {
751 }
752
753 Status = ReadFileRecord(Vcb, pFCB->MFTIndex, FileRecord);
754 if (!NT_SUCCESS(Status))
755 {
756 ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, FileRecord);
757 return Status;
758 }
759
760 Status = FindAttribute(Vcb, FileRecord, Type, Name, NameLength, &AttrCtxt, NULL);
761 if (!NT_SUCCESS(Status))
762 {
763 ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, FileRecord);
764 return Status;
765 }
766
767 AttrLength = AttributeDataLength(AttrCtxt->pRecord);
769 if (*Data == NULL)
770 {
771 ReleaseAttributeContext(AttrCtxt);
772 ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, FileRecord);
774 }
775
776 ReadAttribute(Vcb, AttrCtxt, 0, *Data, AttrLength);
777
778 ReleaseAttributeContext(AttrCtxt);
779 ExFreeToNPagedLookasideList(&Vcb->FileRecLookasideList, FileRecord);
780
781 return STATUS_SUCCESS;
782}
783
784/* EOF */
unsigned char BOOLEAN
Type
Definition: Type.h:7
@ Colon
Definition: asmpp.cpp:43
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
#define NTFS_FILE_NAME_WIN32
Definition: ntfs.h:64
#define NTFS_FILE_ROOT
Definition: ntfs.h:28
_In_ PFCB Fcb
Definition: cdprocs.h:159
#define TAG_CCB
Definition: cdprocs.h:85
struct _FCB FCB
Definition: File.h:16
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define wcsrchr
Definition: compat.h:16
#define MAX_PATH
Definition: compat.h:34
PSTANDARD_INFORMATION GetStandardInformationFromRecord(PDEVICE_EXTENSION Vcb, PFILE_RECORD_HEADER FileRecord)
Definition: attrib.c:1940
PFILENAME_ATTRIBUTE GetFileNameFromRecord(PDEVICE_EXTENSION Vcb, PFILE_RECORD_HEADER FileRecord, UCHAR NameType)
Definition: attrib.c:1809
PFILENAME_ATTRIBUTE GetBestFileNameFromRecord(PDEVICE_EXTENSION Vcb, PFILE_RECORD_HEADER FileRecord)
Definition: attrib.c:1985
PNTFS_GLOBAL_DATA NtfsGlobalData
Definition: ntfs.c:36
#define FRH_DIRECTORY
Definition: ntfs.h:268
#define NTFS_FILE_TYPE_DIRECTORY
Definition: ntfs.h:232
#define NTFS_FILE_TYPE_REPARSE
Definition: ntfs.h:228
#define NTFS_FILE_TYPE_ENCRYPTED
Definition: ntfs.h:231
@ AttributeData
Definition: ntfs.h:168
#define NTFS_TYPE_VCB
Definition: ntfs.h:89
#define NTFS_FILE_TYPE_COMPRESSED
Definition: ntfs.h:229
#define TAG_NTFS
Definition: ntfs.h:12
#define FCB_CACHE_INITIALIZED
Definition: ntfs.h:508
#define NTFS_TYPE_FCB
Definition: ntfs.h:88
#define NTFS_TYPE_CCB
Definition: ntfs.h:87
#define RemoveEntryList(Entry)
Definition: env_spec_w32.h:986
#define InsertTailList(ListHead, Entry)
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
UCHAR KIRQL
Definition: env_spec_w32.h:591
NTSTATUS ExInitializeResourceLite(PULONG res)
Definition: env_spec_w32.h:641
#define KeReleaseSpinLock(sl, irql)
Definition: env_spec_w32.h:627
#define KeAcquireSpinLock(sl, irql)
Definition: env_spec_w32.h:609
#define ExDeleteResourceLite(res)
Definition: env_spec_w32.h:647
#define NonPagedPool
Definition: env_spec_w32.h:307
struct _FileName FileName
Definition: fatprocs.h:897
#define _SEH2_END
Definition: filesup.c:22
#define _SEH2_TRY
Definition: filesup.c:19
VOID NTAPI CcInitializeCacheMap(IN PFILE_OBJECT FileObject, IN PCC_FILE_SIZES FileSizes, IN BOOLEAN PinAccess, IN PCACHE_MANAGER_CALLBACKS Callbacks, IN PVOID LazyWriteContext)
Definition: fssup.c:195
BOOLEAN NTAPI CcUninitializeCacheMap(IN PFILE_OBJECT FileObject, IN OPTIONAL PLARGE_INTEGER TruncateSize, IN OPTIONAL PCACHE_UNINITIALIZE_EVENT UninitializeEvent)
Definition: fssup.c:286
FxIoTarget * pTarget
Definition: fxdeviceapi.cpp:97
Status
Definition: gdiplustypes.h:25
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
NTSTATUS ReadFileRecord(PDEVICE_EXTENSION Vcb, ULONGLONG index, PFILE_RECORD_HEADER file)
Definition: mft.c:1631
NTSTATUS NtfsLookupFileAt(PDEVICE_EXTENSION Vcb, PUNICODE_STRING PathName, BOOLEAN CaseSensitive, PFILE_RECORD_HEADER *FileRecord, PULONGLONG MFTIndex, ULONGLONG CurrentMFTIndex)
Definition: mft.c:3229
VOID ReleaseAttributeContext(PNTFS_ATTR_CONTEXT Context)
Definition: mft.c:104
ULONGLONG AttributeDataLength(PNTFS_ATTR_RECORD AttrRecord)
Definition: mft.c:259
NTSTATUS FindAttribute(PDEVICE_EXTENSION Vcb, PFILE_RECORD_HEADER MftRecord, ULONG Type, PCWSTR Name, ULONG NameLength, PNTFS_ATTR_CONTEXT *AttrCtx, PULONG Offset)
Definition: mft.c:131
ULONG ReadAttribute(PDEVICE_EXTENSION Vcb, PNTFS_ATTR_CONTEXT Context, ULONGLONG Offset, PCHAR Buffer, ULONG Length)
Definition: mft.c:1065
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define ASSERT(a)
Definition: mode.c:44
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
static IStream Stream
Definition: htmldoc.c:1115
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define UNICODE_NULL
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
ULONGLONG NtfsGetFileSize(PDEVICE_EXTENSION DeviceExt, PFILE_RECORD_HEADER FileRecord, PCWSTR Stream, ULONG StreamLength, PULONGLONG AllocatedSize)
Definition: dirctl.c:38
static VOID NtfsWSubString(PWCHAR pTarget, PCWSTR pSource, size_t pLength)
Definition: fcb.c:57
BOOLEAN NtfsFCBIsDirectory(PNTFS_FCB Fcb)
Definition: fcb.c:132
NTSTATUS NtfsReadFCBAttribute(PNTFS_VCB Vcb, PNTFS_FCB pFCB, ULONG Type, PCWSTR Name, ULONG NameLength, PVOID *Data)
Definition: fcb.c:735
PNTFS_FCB NtfsGrabFCBFromTable(PNTFS_VCB Vcb, PCWSTR FileName)
Definition: fcb.c:222
BOOLEAN NtfsFCBIsRoot(PNTFS_FCB Fcb)
Definition: fcb.c:158
NTSTATUS NtfsFCBInitializeCache(PNTFS_VCB Vcb, PNTFS_FCB Fcb)
Definition: fcb.c:265
static NTSTATUS NtfsDirFindFile(PNTFS_VCB Vcb, PNTFS_FCB DirectoryFcb, PWSTR FileToFind, BOOLEAN CaseSensitive, PNTFS_FCB *FoundFCB)
Definition: fcb.c:515
BOOLEAN NtfsFCBIsReparsePoint(PNTFS_FCB Fcb)
Definition: fcb.c:139
NTSTATUS NtfsMakeFCBFromDirEntry(PNTFS_VCB Vcb, PNTFS_FCB DirectoryFCB, PUNICODE_STRING Name, PCWSTR Stream, PFILE_RECORD_HEADER Record, ULONGLONG MFTIndex, PNTFS_FCB *fileFCB)
Definition: fcb.c:389
BOOLEAN NtfsFCBIsEncrypted(PNTFS_FCB Fcb)
Definition: fcb.c:152
PNTFS_FCB NtfsCreateFCB(PCWSTR FileName, PCWSTR Stream, PNTFS_VCB Vcb)
Definition: fcb.c:67
NTSTATUS NtfsAttachFCBToFileObject(PNTFS_VCB Vcb, PNTFS_FCB Fcb, PFILE_OBJECT FileObject)
Definition: fcb.c:464
BOOLEAN NtfsFCBIsCompressed(PNTFS_FCB Fcb)
Definition: fcb.c:146
VOID NtfsDestroyFCB(PNTFS_FCB Fcb)
Definition: fcb.c:120
NTSTATUS NtfsGetFCBForFile(PNTFS_VCB Vcb, PNTFS_FCB *pParentFCB, PNTFS_FCB *pFCB, PCWSTR pFileName, BOOLEAN CaseSensitive)
Definition: fcb.c:603
PNTFS_FCB NtfsOpenRootFCB(PNTFS_VCB Vcb)
Definition: fcb.c:374
VOID NtfsGrabFCB(PNTFS_VCB Vcb, PNTFS_FCB Fcb)
Definition: fcb.c:165
VOID NtfsAddFCBToTable(PNTFS_VCB Vcb, PNTFS_FCB Fcb)
Definition: fcb.c:209
VOID NtfsReleaseFCB(PNTFS_VCB Vcb, PNTFS_FCB Fcb)
Definition: fcb.c:182
static PCWSTR NtfsGetNextPathElement(PCWSTR FileName)
Definition: fcb.c:39
PNTFS_FCB NtfsMakeRootFCB(PNTFS_VCB Vcb)
Definition: fcb.c:319
PFILE_OBJECT NTAPI IoCreateStreamFileObject(IN PFILE_OBJECT FileObject, IN PDEVICE_OBJECT DeviceObject)
Definition: file.c:3187
#define L(x)
Definition: ntvdm.h:50
unsigned short USHORT
Definition: pedump.c:61
#define Vcb
Definition: cdprocs.h:1415
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:165
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:66
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
_CRTIMP wchar_t *__cdecl wcsncpy(wchar_t *_Dest, const wchar_t *_Source, size_t _Count)
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
_CRTIMP wchar_t *__cdecl wcscat(_Inout_updates_z_(_String_length_(_Dest)+_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:73
UCHAR NameLength
Definition: ntfs.h:377
UCHAR NameType
Definition: ntfs.h:378
ULONG FileAttributes
Definition: ntfs.h:367
WCHAR Name[1]
Definition: ntfs.h:379
ULONG Type
Definition: ntfs.h:95
ULONG Size
Definition: ntfs.h:96
Definition: ntfs.h:130
PFILE_OBJECT PtrFileObject
Definition: ntfs.h:133
NTFSIDENTIFIER Identifier
Definition: ntfs.h:131
NPAGED_LOOKASIDE_LIST FcbLookasideList
Definition: ntfs.h:153
CACHE_MANAGER_CALLBACKS CacheMgrCallbacks
Definition: ntfs.h:149
ULONG FileAttribute
Definition: ntfs.h:334
Definition: cdstruc.h:902
ULONG Flags
Definition: ntfs.h:536
PVCB Vcb
Definition: cdstruc.h:933
FSRTL_COMMON_FCB_HEADER RFCB
Definition: ntfs.h:517
LIST_ENTRY FcbListEntry
Definition: ntfs.h:530
LONG RefCount
Definition: ntfs.h:535
ULONGLONG MFTIndex
Definition: ntfs.h:539
WCHAR Stream[MAX_PATH]
Definition: ntfs.h:523
NTFSIDENTIFIER Identifier
Definition: ntfs.h:515
ULONG DirIndex
Definition: ntfs.h:533
SECTION_OBJECT_POINTERS SectionObjectPointers
Definition: ntfs.h:518
WCHAR * ObjectName
Definition: ntfs.h:524
WCHAR PathName[MAX_PATH]
Definition: ntfs.h:525
USHORT LinkCount
Definition: ntfs.h:540
FILENAME_ATTRIBUTE Entry
Definition: ntfs.h:542
ERESOURCE MainResource
Definition: ntfs.h:528
PFILE_OBJECT FileObject
Definition: ntfs.h:520
USHORT Flags
Definition: ntfs.h:256
USHORT LinkCount
Definition: ntfs.h:254
LARGE_INTEGER AllocationSize
Definition: env_spec_w32.h:755
LARGE_INTEGER ValidDataLength
Definition: env_spec_w32.h:757
TCHAR Name[MAX_PATH]
Definition: filecomp.c:349
Definition: typedefs.h:120
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
uint16_t * PWSTR
Definition: typedefs.h:56
const uint16_t * PCWSTR
Definition: typedefs.h:57
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint16_t * PWCHAR
Definition: typedefs.h:56
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
uint64_t ULONGLONG
Definition: typedefs.h:67
#define STATUS_OBJECT_PATH_NOT_FOUND
Definition: udferr_usr.h:151
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_OBJECT_NAME_INVALID
Definition: udferr_usr.h:148
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define STATUS_OBJECT_NAME_NOT_FOUND
Definition: udferr_usr.h:149
LONGLONG QuadPart
Definition: typedefs.h:114
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
Definition: wdfdevice.h:550
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533
ActualNumberDriverObjects * sizeof(PDRIVER_OBJECT)) PDRIVER_OBJECT *DriverObjectList
* PFILE_OBJECT
Definition: iotypes.h:1998
_In_ struct _KBUGCHECK_REASON_CALLBACK_RECORD * Record
Definition: ketypes.h:268
#define ObDereferenceObject
Definition: obfuncs.h:203
__wchar_t WCHAR
Definition: xmlstorage.h:180