1 ////////////////////////////////////////////////////////////////////
2 // Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
4 // This file was released under the GPLv2 on June 2015.
5 ////////////////////////////////////////////////////////////////////
12 // _MM_PAGE_PRIORITY_ provides a method for the system to handle requests
13 // intelligently in low resource conditions.
15 // LowPagePriority should be used when it is acceptable to the driver for the
16 // mapping request to fail if the system is low on resources. An example of
17 // this could be for a non-critical network connection where the driver can
18 // handle the failure case when system resources are close to being depleted.
20 // NormalPagePriority should be used when it is acceptable to the driver for the
21 // mapping request to fail if the system is very low on resources. An example
22 // of this could be for a non-critical local filesystem request.
24 // HighPagePriority should be used when it is unacceptable to the driver for the
25 // mapping request to fail unless the system is completely out of resources.
26 // An example of this would be the paging file path in a driver.
30 typedef enum _MM_PAGE_PRIORITY
{
32 NormalPagePriority
= 16,
40 // Note: This function is not available in WDM 1.0
45 MmMapLockedPagesSpecifyCache (
46 IN PMDL MemoryDescriptorList
,
47 IN KPROCESSOR_MODE AccessMode
,
48 IN MEMORY_CACHING_TYPE CacheType
,
50 IN ULONG BugCheckOnFailure
,
51 IN MM_PAGE_PRIORITY Priority
56 // MmGetSystemAddressForMdlSafe (
58 // IN MM_PAGE_PRIORITY PRIORITY
61 // Routine Description:
63 // This routine returns the mapped address of an MDL. If the
64 // Mdl is not already mapped or a system address, it is mapped.
68 // MemoryDescriptorList - Pointer to the MDL to map.
70 // Priority - Supplies an indication as to how important it is that this
71 // request succeed under low available PTE conditions.
75 // Returns the base address where the pages are mapped. The base address
76 // has the same offset as the virtual address in the MDL.
78 // Unlike MmGetSystemAddressForMdl, Safe guarantees that it will always
79 // return NULL on failure instead of bugchecking the system.
81 // This macro is not usable by WDM 1.0 drivers as 1.0 did not include
82 // MmMapLockedPagesSpecifyCache. The solution for WDM 1.0 drivers is to
83 // provide synchronization and set/reset the MDL_MAPPING_CAN_FAIL bit.
88 #define MmGetSystemAddressForMdlSafe(MDL, PRIORITY) \
89 (((MDL)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
90 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
91 ((MDL)->MappedSystemVa) : \
92 (MmMapLockedPagesSpecifyCache((MDL), \
101 __inline PVOID
MmGetSystemAddressForMdlSafer(IN PMDL Mdl
)
105 if (Mdl
->MdlFlags
& (MDL_MAPPED_TO_SYSTEM_VA
| MDL_SOURCE_IS_NONPAGED_POOL
)) {
106 Addr
= Mdl
->MappedSystemVa
;
108 CSHORT PrevFlag
= Mdl
->MdlFlags
& MDL_MAPPING_CAN_FAIL
;
110 Mdl
->MdlFlags
|= MDL_MAPPING_CAN_FAIL
;
111 Addr
= MmMapLockedPages(Mdl
, KernelMode
);
112 Mdl
->MdlFlags
= (Mdl
->MdlFlags
& ~MDL_MAPPING_CAN_FAIL
) | PrevFlag
;
118 #define FULL_SECURITY_INFORMATION (OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION)
125 RtlLengthRequiredSid (
126 IN UCHAR SubAuthorityCount
135 RtlSetGroupSecurityDescriptor (
136 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
138 IN BOOLEAN GroupDefaulted
144 RtlSetSaclSecurityDescriptor (
145 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
146 IN BOOLEAN SaclPresent
,
148 IN BOOLEAN SaclDefaulted
154 RtlSubAuthorityCountSid (
161 PsReferencePrimaryToken (
169 RtlAbsoluteToSelfRelativeSD (
170 IN PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor
,
171 IN OUT PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor
,
172 IN PULONG BufferLength
178 RtlAllocateAndInitializeSid (
179 IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority
,
180 IN UCHAR SubAuthorityCount
,
181 IN ULONG SubAuthority0
,
182 IN ULONG SubAuthority1
,
183 IN ULONG SubAuthority2
,
184 IN ULONG SubAuthority3
,
185 IN ULONG SubAuthority4
,
186 IN ULONG SubAuthority5
,
187 IN ULONG SubAuthority6
,
188 IN ULONG SubAuthority7
,
195 RtlConvertSidToUnicodeString (
196 OUT PUNICODE_STRING DestinationString
,
198 IN BOOLEAN AllocateDestinationString
204 RtlGetGroupSecurityDescriptor (
205 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
207 OUT PBOOLEAN GroupDefaulted
213 RtlGetOwnerSecurityDescriptor (
214 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
216 OUT PBOOLEAN OwnerDefaulted
224 IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority
,
225 IN UCHAR SubAuthorityCount
232 typedef struct _TOKEN_OWNER
{ // to
236 typedef struct _TOKEN_PRIMARY_GROUP
{ // tpg
238 } TOKEN_PRIMARY_GROUP
;
244 // The following macro is used to detemine if the file object is opened
245 // for read only access (i.e., it is not also opened for write access or
249 // IsFileObjectReadOnly (
250 // IN PFILE_OBJECT FileObject
253 #define IsFileObjectReadOnly(FO) (!((FO)->WriteAccess | (FO)->DeleteAccess))
256 #ifndef FSCTL_GET_COMPRESSION
258 #define FSCTL_GET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
259 #define FSCTL_SET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 16, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
261 #define FSCTL_GET_NTFS_VOLUME_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS)
262 #define FSCTL_GET_NTFS_FILE_RECORD CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 26, METHOD_BUFFERED, FILE_ANY_ACCESS)
264 #define FSCTL_GET_HFS_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 31, METHOD_BUFFERED, FILE_ANY_ACCESS)
266 #endif //FSCTL_GET_COMPRESSION
269 #if (_WIN32_WINNT >= 0x0500)
271 #define FSCTL_READ_PROPERTY_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 33, METHOD_NEITHER, FILE_ANY_ACCESS)
272 #define FSCTL_WRITE_PROPERTY_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 34, METHOD_NEITHER, FILE_ANY_ACCESS)
273 #define FSCTL_FIND_FILES_BY_SID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 35, METHOD_NEITHER, FILE_ANY_ACCESS)
275 #define FSCTL_DUMP_PROPERTY_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 37, METHOD_NEITHER, FILE_ANY_ACCESS)
276 #define FSCTL_SET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 38, METHOD_BUFFERED, FILE_WRITE_DATA)
277 #define FSCTL_GET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 39, METHOD_BUFFERED, FILE_ANY_ACCESS)
278 #define FSCTL_DELETE_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 40, METHOD_BUFFERED, FILE_WRITE_DATA)
279 #define FSCTL_SET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 41, METHOD_BUFFERED, FILE_WRITE_DATA)
280 #define FSCTL_GET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS)
281 #define FSCTL_DELETE_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 43, METHOD_BUFFERED, FILE_WRITE_DATA)
282 #define FSCTL_ENUM_USN_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 44, METHOD_NEITHER, FILE_READ_DATA)
283 #define FSCTL_SECURITY_ID_CHECK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 45, METHOD_NEITHER, FILE_READ_DATA)
284 #define FSCTL_READ_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 46, METHOD_NEITHER, FILE_READ_DATA)
285 #define FSCTL_SET_OBJECT_ID_EXTENDED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 47, METHOD_BUFFERED, FILE_WRITE_DATA)
286 #define FSCTL_CREATE_OR_GET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 48, METHOD_BUFFERED, FILE_ANY_ACCESS)
287 #define FSCTL_SET_SPARSE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 49, METHOD_BUFFERED, FILE_WRITE_DATA)
288 #define FSCTL_SET_ZERO_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 50, METHOD_BUFFERED, FILE_WRITE_DATA)
289 #define FSCTL_QUERY_ALLOCATED_RANGES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 51, METHOD_NEITHER, FILE_READ_DATA)
290 #define FSCTL_ENABLE_UPGRADE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 52, METHOD_BUFFERED, FILE_WRITE_DATA)
291 #define FSCTL_SET_ENCRYPTION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 53, METHOD_BUFFERED, FILE_ANY_ACCESS)
292 #define FSCTL_ENCRYPTION_FSCTL_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 54, METHOD_NEITHER, FILE_ANY_ACCESS)
293 #define FSCTL_WRITE_RAW_ENCRYPTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 55, METHOD_NEITHER, FILE_ANY_ACCESS)
294 #define FSCTL_READ_RAW_ENCRYPTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 56, METHOD_NEITHER, FILE_ANY_ACCESS)
295 #define FSCTL_CREATE_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 57, METHOD_NEITHER, FILE_READ_DATA)
296 #define FSCTL_READ_FILE_USN_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 58, METHOD_NEITHER, FILE_READ_DATA)
297 #define FSCTL_WRITE_USN_CLOSE_RECORD CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 59, METHOD_NEITHER, FILE_READ_DATA)
298 #define FSCTL_EXTEND_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 60, METHOD_BUFFERED, FILE_ANY_ACCESS)
299 #define FSCTL_QUERY_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 61, METHOD_BUFFERED, FILE_ANY_ACCESS)
300 #define FSCTL_DELETE_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 62, METHOD_BUFFERED, FILE_ANY_ACCESS)
301 #define FSCTL_MARK_HANDLE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 63, METHOD_BUFFERED, FILE_ANY_ACCESS)
302 #define FSCTL_SIS_COPYFILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 64, METHOD_BUFFERED, FILE_ANY_ACCESS)
303 #define FSCTL_SIS_LINK_FILES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 65, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
304 #define FSCTL_HSM_MSG CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 66, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
306 #define FSCTL_HSM_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 68, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
307 #define FSCTL_RECALL_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 69, METHOD_NEITHER, FILE_ANY_ACCESS)
309 #define FSCTL_READ_FROM_PLEX CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 71, METHOD_OUT_DIRECT, FILE_READ_DATA)
310 #define FSCTL_FILE_PREFETCH CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 72, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
312 #endif // (_WIN32_WINNT >= 0x0500)
315 #ifndef FILE_VOLUME_QUOTAS
317 #define FILE_VOLUME_QUOTAS 0x00000020
318 #define FILE_SUPPORTS_SPARSE_FILES 0x00000040
319 #define FILE_SUPPORTS_REPARSE_POINTS 0x00000080
320 #define FILE_SUPPORTS_REMOTE_STORAGE 0x00000100
321 #define FS_LFN_APIS 0x00004000
322 #define FILE_SUPPORTS_OBJECT_IDS 0x00010000
323 #define FILE_SUPPORTS_ENCRYPTION 0x00020000
324 #define FILE_NAMED_STREAMS 0x00040000
325 #define FILE_READ_ONLY_VOLUME 0x00080000
327 #endif //FILE_VOLUME_QUOTAS
329 // Output flags for the FSCTL_IS_VOLUME_DIRTY
330 #define VOLUME_IS_DIRTY (0x00000001)
331 #define VOLUME_UPGRADE_SCHEDULED (0x00000002)
337 IN HANDLE DeviceHandle
,
338 IN HANDLE Event OPTIONAL
,
339 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
340 IN PVOID ApcContext OPTIONAL
,
341 OUT PIO_STATUS_BLOCK IoStatusBlock
,
342 IN ULONG IoControlCode
,
343 IN PVOID InputBuffer
,
344 IN ULONG InputBufferSize
,
345 OUT PVOID OutputBuffer
,
346 IN ULONG OutputBufferSize
352 ZwDeviceIoControlFile(
353 IN HANDLE DeviceHandle
,
354 IN HANDLE Event OPTIONAL
,
355 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL
,
356 IN PVOID UserApcContext OPTIONAL
,
357 OUT PIO_STATUS_BLOCK IoStatusBlock
,
358 IN ULONG IoControlCode
,
359 IN PVOID InputBuffer
,
360 IN ULONG InputBufferSize
,
361 OUT PVOID OutputBuffer
,
362 IN ULONG OutputBufferSize
369 ZwQueryVolumeInformationFile(
370 IN HANDLE FileHandle
,
371 OUT PIO_STATUS_BLOCK IoStatusBlock
,
372 OUT PVOID FsInformation
,
374 IN FS_INFORMATION_CLASS FsInformationClass
378 #ifndef FILE_ATTRIBUTE_SPARSE_FILE
380 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
381 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
382 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
383 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
384 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
385 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
387 #endif //FILE_ATTRIBUTE_SPARSE_FILE
389 #define FileFsFullSizeInformation (FS_INFORMATION_CLASS(7))
390 #define FileFsObjectIdInformation (FS_INFORMATION_CLASS(8))
391 #define FileFsDriverPathInformation (FS_INFORMATION_CLASS(9))
396 typedef struct _FILE_FS_FULL_SIZE_INFORMATION
{
397 LARGE_INTEGER TotalAllocationUnits
;
398 LARGE_INTEGER CallerAvailableAllocationUnits
;
399 LARGE_INTEGER ActualAvailableAllocationUnits
;
400 ULONG SectorsPerAllocationUnit
;
401 ULONG BytesPerSector
;
402 } FILE_FS_FULL_SIZE_INFORMATION
, *PFILE_FS_FULL_SIZE_INFORMATION
;
407 #ifndef IRP_MN_SURPRISE_REMOVAL
408 #define IRP_MN_SURPRISE_REMOVAL 0x17
409 #endif //IRP_MN_SURPRISE_REMOVAL
411 #ifndef IoCopyCurrentIrpStackLocationToNext
413 #define IoCopyCurrentIrpStackLocationToNext( Irp ) { \
414 PIO_STACK_LOCATION irpSp; \
415 PIO_STACK_LOCATION nextIrpSp; \
416 irpSp = IoGetCurrentIrpStackLocation( (Irp) ); \
417 nextIrpSp = IoGetNextIrpStackLocation( (Irp) ); \
418 RtlCopyMemory( nextIrpSp, irpSp, FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \
419 nextIrpSp->Control = 0; }
421 #define IoSkipCurrentIrpStackLocation( Irp ) \
422 (Irp)->CurrentLocation++; \
423 (Irp)->Tail.Overlay.CurrentStackLocation++;
425 #endif //IoCopyCurrentIrpStackLocationToNext
427 #ifndef VPB_REMOVE_PENDING
428 #define VPB_REMOVE_PENDING 0x00000008
429 #endif //VPB_REMOVE_PENDING
433 // Volume lock/unlock notification routines, implemented in PnP.c
435 // These routines provide PnP volume lock notification support
436 // for all filesystems.
439 #define FSRTL_VOLUME_DISMOUNT 1
440 #define FSRTL_VOLUME_DISMOUNT_FAILED 2
441 #define FSRTL_VOLUME_LOCK 3
442 #define FSRTL_VOLUME_LOCK_FAILED 4
443 #define FSRTL_VOLUME_UNLOCK 5
444 #define FSRTL_VOLUME_MOUNT 6
448 FsRtlNotifyVolumeEvent (
449 IN PFILE_OBJECT FileObject,
453 typedef NTSTATUS (*ptrFsRtlNotifyVolumeEvent
) (
454 IN PFILE_OBJECT FileObject
,
458 #include "Include/ntddk_ex.h"
460 #endif //__NTIFS_EX_H__