3 * Copyright (C) 2002,2003 ReactOS Team
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.
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.
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.
19 * COPYRIGHT: See COPYING in the top level directory
20 * PROJECT: ReactOS kernel
21 * FILE: drivers/filesystem/ntfs/attrib.c
22 * PURPOSE: NTFS filesystem driver
23 * PROGRAMMER: Eric Kohl
24 * Updated by Valentin Verkhovsky 2003/09/12
27 /* INCLUDES *****************************************************************/
34 /* FUNCTIONS ****************************************************************/
40 return(*run
& 0x0f) + ((*run
>> 4) & 0x0f) + 1;
48 UCHAR n1
= *run
& 0x0f;
49 UCHAR n2
= (*run
>> 4) & 0x0f;
50 LONGLONG lcn
= (n2
== 0) ? 0 : (CHAR
)(run
[n1
+ n2
]);
53 for (i
= n1
+n2
- 1; i
> n1
; i
--)
54 lcn
= (lcn
<< 8) + run
[i
];
67 for (i
= n
; i
> 0; i
--)
68 count
= (count
<< 8) + run
[i
];
74 FindRun(PNONRESIDENT_ATTRIBUTE NresAttr
,
80 ULONGLONG base
= NresAttr
->StartVcn
;
82 if (vcn
< NresAttr
->StartVcn
|| vcn
> NresAttr
->LastVcn
)
87 for (run
= (PUCHAR
)((ULONG_PTR
)NresAttr
+ NresAttr
->RunArrayOffset
);
88 *run
!= 0; run
+= RunLength(run
))
91 *count
= RunCount(run
);
93 if (base
<= vcn
&& vcn
< base
+ *count
)
95 *lcn
= (RunLCN(run
) == 0) ? 0 : *lcn
+ vcn
- base
;
96 *count
-= (ULONG
)(vcn
- base
);
112 NtfsDumpFileNameAttribute(PATTRIBUTE Attribute
)
114 PRESIDENT_ATTRIBUTE ResAttr
;
115 PFILENAME_ATTRIBUTE FileNameAttr
;
117 DbgPrint(" $FILE_NAME ");
119 ResAttr
= (PRESIDENT_ATTRIBUTE
)Attribute
;
120 // DbgPrint(" Length %lu Offset %hu ", ResAttr->ValueLength, ResAttr->ValueOffset);
122 FileNameAttr
= (PFILENAME_ATTRIBUTE
)((ULONG_PTR
)ResAttr
+ ResAttr
->ValueOffset
);
123 DbgPrint(" '%.*S' ", FileNameAttr
->NameLength
, FileNameAttr
->Name
);
129 NtfsDumpVolumeNameAttribute(PATTRIBUTE Attribute
)
131 PRESIDENT_ATTRIBUTE ResAttr
;
134 DbgPrint(" $VOLUME_NAME ");
136 ResAttr
= (PRESIDENT_ATTRIBUTE
)Attribute
;
137 // DbgPrint(" Length %lu Offset %hu ", ResAttr->ValueLength, ResAttr->ValueOffset);
139 VolumeName
= (PWCHAR
)((ULONG_PTR
)ResAttr
+ ResAttr
->ValueOffset
);
140 DbgPrint(" '%.*S' ", ResAttr
->ValueLength
/ sizeof(WCHAR
), VolumeName
);
146 NtfsDumpVolumeInformationAttribute(PATTRIBUTE Attribute
)
148 PRESIDENT_ATTRIBUTE ResAttr
;
149 PVOLINFO_ATTRIBUTE VolInfoAttr
;
151 DbgPrint(" $VOLUME_INFORMATION ");
153 ResAttr
= (PRESIDENT_ATTRIBUTE
)Attribute
;
154 // DbgPrint(" Length %lu Offset %hu ", ResAttr->ValueLength, ResAttr->ValueOffset);
156 VolInfoAttr
= (PVOLINFO_ATTRIBUTE
)((ULONG_PTR
)ResAttr
+ ResAttr
->ValueOffset
);
157 DbgPrint(" NTFS Version %u.%u Flags 0x%04hx ",
158 VolInfoAttr
->MajorVersion
,
159 VolInfoAttr
->MinorVersion
,
166 NtfsDumpIndexRootAttribute(PATTRIBUTE Attribute
)
168 PRESIDENT_ATTRIBUTE ResAttr
;
169 PINDEX_ROOT_ATTRIBUTE IndexRootAttr
;
171 ResAttr
= (PRESIDENT_ATTRIBUTE
)Attribute
;
172 IndexRootAttr
= (PINDEX_ROOT_ATTRIBUTE
)((ULONG_PTR
)ResAttr
+ ResAttr
->ValueOffset
);
174 if (IndexRootAttr
->AttributeType
== AttributeFileName
)
175 ASSERT(IndexRootAttr
->CollationRule
== COLLATION_FILE_NAME
);
177 DbgPrint(" $INDEX_ROOT (%uB, %u) ", IndexRootAttr
->SizeOfEntry
, IndexRootAttr
->ClustersPerIndexRecord
);
179 if (IndexRootAttr
->Header
.Flags
== INDEX_ROOT_SMALL
)
181 DbgPrint(" (small) ");
185 ASSERT(IndexRootAttr
->Header
.Flags
== INDEX_ROOT_LARGE
);
186 DbgPrint(" (large) ");
193 NtfsDumpAttribute (PATTRIBUTE Attribute
)
195 PNONRESIDENT_ATTRIBUTE NresAttr
;
199 ULONGLONG runcount
= 0;
201 switch (Attribute
->AttributeType
)
203 case AttributeFileName
:
204 NtfsDumpFileNameAttribute(Attribute
);
207 case AttributeStandardInformation
:
208 DbgPrint(" $STANDARD_INFORMATION ");
211 case AttributeAttributeList
:
212 DbgPrint(" $ATTRIBUTE_LIST ");
215 case AttributeObjectId
:
216 DbgPrint(" $OBJECT_ID ");
219 case AttributeSecurityDescriptor
:
220 DbgPrint(" $SECURITY_DESCRIPTOR ");
223 case AttributeVolumeName
:
224 NtfsDumpVolumeNameAttribute(Attribute
);
227 case AttributeVolumeInformation
:
228 NtfsDumpVolumeInformationAttribute(Attribute
);
233 //DataBuf = ExAllocatePool(NonPagedPool,AttributeLengthAllocated(Attribute));
236 case AttributeIndexRoot
:
237 NtfsDumpIndexRootAttribute(Attribute
);
240 case AttributeIndexAllocation
:
241 DbgPrint(" $INDEX_ALLOCATION ");
244 case AttributeBitmap
:
245 DbgPrint(" $BITMAP ");
248 case AttributeReparsePoint
:
249 DbgPrint(" $REPARSE_POINT ");
252 case AttributeEAInformation
:
253 DbgPrint(" $EA_INFORMATION ");
260 case AttributePropertySet
:
261 DbgPrint(" $PROPERTY_SET ");
264 case AttributeLoggedUtilityStream
:
265 DbgPrint(" $LOGGED_UTILITY_STREAM ");
269 DbgPrint(" Attribute %lx ",
270 Attribute
->AttributeType
);
274 if (Attribute
->NameLength
!= 0)
276 Name
.Length
= Attribute
->NameLength
* sizeof(WCHAR
);
277 Name
.MaximumLength
= Name
.Length
;
278 Name
.Buffer
= (PWCHAR
)((ULONG_PTR
)Attribute
+ Attribute
->NameOffset
);
280 DbgPrint("'%wZ' ", &Name
);
284 Attribute
->Nonresident
? "non-resident" : "resident");
286 if (Attribute
->Nonresident
)
288 NresAttr
= (PNONRESIDENT_ATTRIBUTE
)Attribute
;
290 FindRun(NresAttr
,0,&lcn
, &runcount
);
292 DbgPrint(" AllocatedSize %I64u DataSize %I64u\n",
293 NresAttr
->AllocatedSize
, NresAttr
->DataSize
);
294 DbgPrint(" logical clusters: %I64u - %I64u\n",
295 lcn
, lcn
+ runcount
- 1);
301 NtfsDumpFileAttributes(PFILE_RECORD_HEADER FileRecord
)
303 PATTRIBUTE Attribute
;
305 Attribute
= (PATTRIBUTE
)((ULONG_PTR
)FileRecord
+ FileRecord
->AttributeOffset
);
306 while (Attribute
< (PATTRIBUTE
)((ULONG_PTR
)FileRecord
+ FileRecord
->BytesInUse
) &&
307 Attribute
->AttributeType
!= (ATTRIBUTE_TYPE
)-1)
309 NtfsDumpAttribute(Attribute
);
311 Attribute
= (PATTRIBUTE
)((ULONG_PTR
)Attribute
+ Attribute
->Length
);