34 #pragma alloc_text(PAGE, NcCalculateDirectoryNotificationOffsets) 35 #pragma alloc_text(PAGE, NcDetermineStructureOffsets) 36 #pragma alloc_text(PAGE, NcGetEntrySize) 37 #pragma alloc_text(PAGE, NcGetFileName) 38 #pragma alloc_text(PAGE, NcGetFileNameLength) 39 #pragma alloc_text(PAGE, NcGetNextEntry) 40 #pragma alloc_text(PAGE, NcGetNextEntryOffset) 41 #pragma alloc_text(PAGE, NcGetShortName) 42 #pragma alloc_text(PAGE, NcGetShortNameLength) 43 #pragma alloc_text(PAGE, NcSetFileName) 44 #pragma alloc_text(PAGE, NcSetNextEntryOffset) 45 #pragma alloc_text(PAGE, NcSetShortName) 78 BOOLEAN ReturnValue =
TRUE;
86 Offsets->ShortNamePresent = FALSE;
87 Offsets->ShortNameLengthDist = 0;
88 Offsets->ShortNameDist = 0;
90 switch( Information ) {
92 case FileBothDirectoryInformation:
94 Offsets->NextEntryOffsetDist =
95 FIELD_OFFSET( FILE_BOTH_DIR_INFORMATION, NextEntryOffset );
97 Offsets->FileNameLengthDist =
98 FIELD_OFFSET( FILE_BOTH_DIR_INFORMATION, FileNameLength );
100 Offsets->FileNameDist =
101 FIELD_OFFSET( FILE_BOTH_DIR_INFORMATION, FileName );
103 Offsets->ShortNamePresent =
TRUE;
105 Offsets->ShortNameLengthDist =
106 FIELD_OFFSET( FILE_BOTH_DIR_INFORMATION, ShortNameLength );
108 Offsets->ShortNameDist =
109 FIELD_OFFSET( FILE_BOTH_DIR_INFORMATION, ShortName );
113 case FileDirectoryInformation:
115 Offsets->NextEntryOffsetDist =
116 FIELD_OFFSET( FILE_DIRECTORY_INFORMATION, NextEntryOffset );
118 Offsets->FileNameLengthDist =
119 FIELD_OFFSET( FILE_DIRECTORY_INFORMATION, FileNameLength );
121 Offsets->FileNameDist =
122 FIELD_OFFSET( FILE_DIRECTORY_INFORMATION, FileName );
126 case FileFullDirectoryInformation:
128 Offsets->NextEntryOffsetDist =
129 FIELD_OFFSET( FILE_FULL_DIR_INFORMATION, NextEntryOffset );
131 Offsets->FileNameLengthDist =
132 FIELD_OFFSET( FILE_FULL_DIR_INFORMATION, FileNameLength );
134 Offsets->FileNameDist =
135 FIELD_OFFSET( FILE_FULL_DIR_INFORMATION, FileName );
139 case FileIdBothDirectoryInformation:
141 Offsets->NextEntryOffsetDist =
142 FIELD_OFFSET( FILE_ID_BOTH_DIR_INFORMATION, NextEntryOffset );
144 Offsets->FileNameLengthDist =
145 FIELD_OFFSET( FILE_ID_BOTH_DIR_INFORMATION, FileNameLength );
147 Offsets->FileNameDist =
148 FIELD_OFFSET( FILE_ID_BOTH_DIR_INFORMATION, FileName );
150 Offsets->ShortNamePresent =
TRUE;
152 Offsets->ShortNameLengthDist =
153 FIELD_OFFSET( FILE_ID_BOTH_DIR_INFORMATION, ShortNameLength );
155 Offsets->ShortNameDist =
156 FIELD_OFFSET( FILE_ID_BOTH_DIR_INFORMATION, ShortName );
160 case FileIdFullDirectoryInformation:
162 Offsets->NextEntryOffsetDist =
163 FIELD_OFFSET( FILE_ID_FULL_DIR_INFORMATION, NextEntryOffset );
165 Offsets->FileNameLengthDist =
166 FIELD_OFFSET( FILE_ID_FULL_DIR_INFORMATION, FileNameLength );
168 Offsets->FileNameDist =
169 FIELD_OFFSET( FILE_ID_FULL_DIR_INFORMATION, FileName );
173 case FileNamesInformation:
175 Offsets->NextEntryOffsetDist =
176 FIELD_OFFSET( FILE_NAMES_INFORMATION, NextEntryOffset );
178 Offsets->FileNameLengthDist =
179 FIELD_OFFSET( FILE_NAMES_INFORMATION, FileNameLength );
181 Offsets->FileNameDist =
182 FIELD_OFFSET( FILE_NAMES_INFORMATION, FileName );
226 Offsets->
FileNameLengthDist = FIELD_OFFSET( FILE_NOTIFY_INFORMATION, FileNameLength );
227 Offsets->
FileNameDist = FIELD_OFFSET( FILE_NOTIFY_INFORMATION, FileName );
262 PULONG Offset =
Add2Ptr( Buffer, Offsets->NextEntryOffsetDist );
292 PVOID NextEntry =
Add2Ptr( Buffer, Offset );
321 ULONG Result = *((PULONG)(
Add2Ptr( Buffer, Offsets->FileNameLengthDist )));
353 if (EntrySize == 0) {
360 EntrySize += Offsets->FileNameDist;
391 return Add2Ptr(Buffer, Offsets->FileNameDist);
420 if (Offsets->ShortNamePresent) {
422 return Add2Ptr(Buffer, Offsets->ShortNameDist);
458 if (Offsets->ShortNamePresent) {
460 Ptr =
Add2Ptr(Buffer, Offsets->ShortNameLengthDist);
473 _In_ BOOLEAN ForceLast
497 PULONG NextEntry =
Add2Ptr( Buffer, Offsets->NextEntryOffsetDist );
521 *NextEntry = Offsets->FileNameDist + NameLength;
532 _In_ BOOLEAN ForceLast
569 NameLength =
Add2Ptr( Entry, Offsets->FileNameLengthDist );
589 _In_ PWSTR NewShortName,
621 if( Offsets->ShortNamePresent ) {
624 NameLength =
Add2Ptr( Entry, Offsets->ShortNameLengthDist );
629 *NameLength = (UCHAR) Length;
VOID NcSetShortName(_In_ PVOID Entry, _In_ PWSTR NewShortName, _In_ USHORT Length, _In_ CONST PDIRECTORY_CONTROL_OFFSETS Offsets)
VOID NcSetFileName(_In_ PVOID Entry, _In_ PWSTR NewName, _In_ ULONG Length, _In_ CONST PDIRECTORY_CONTROL_OFFSETS Offsets, _In_ BOOLEAN ForceLast)
CCHAR NcGetShortNameLength(_In_ CONST PVOID Buffer, _In_ CONST PDIRECTORY_CONTROL_OFFSETS Offsets)
_In_ PLARGE_INTEGER _In_ ULONG Length
BOOLEAN NcDetermineStructureOffsets(_Out_ PDIRECTORY_CONTROL_OFFSETS Offsets, _In_ FILE_INFORMATION_CLASS Information)
VOID NcSetNextEntryOffset(_Inout_ PVOID Buffer, _In_ CONST PDIRECTORY_CONTROL_OFFSETS Offsets, _In_ BOOLEAN ForceLast)
RtlCopyMemory(OutputStringBuffer, TempMappingBuffer->Data, OutputString->MaximumLength)
ULONG NcGetNextEntryOffset(_In_ CONST PVOID Buffer, _In_ CONST PDIRECTORY_CONTROL_OFFSETS Offsets)
PWSTR NcGetFileName(_In_ CONST PVOID Buffer, _In_ CONST PDIRECTORY_CONTROL_OFFSETS Offsets)
PVOID NcGetNextEntry(_In_ CONST PVOID Buffer, _In_ CONST PDIRECTORY_CONTROL_OFFSETS Offsets)
FLT_ASSERT(IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject))
VOID NcCalculateDirectoryNotificationOffsets(PDIRECTORY_CONTROL_OFFSETS Offsets)
_In_ BOOLEAN _Out_ PFILE_BASIC_INFORMATION Buffer
NcLoadRegistryStringRetry NULL
ULONG NextEntryOffsetDist
ULONG NcGetEntrySize(_In_ CONST PVOID Buffer, _In_ CONST PDIRECTORY_CONTROL_OFFSETS Offsets)
ULONG ShortNameLengthDist
ULONG NcGetFileNameLength(_In_ CONST PVOID Buffer, _In_ CONST PDIRECTORY_CONTROL_OFFSETS Offsets)
PWSTR NcGetShortName(_In_ CONST PVOID Buffer, _In_ CONST PDIRECTORY_CONTROL_OFFSETS Offsets)