ReactOS  0.4.14-dev-358-gbef841c
misc.c
Go to the documentation of this file.
1 /*
2  * ReactOS kernel
3  * Copyright (C) 2008, 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/misc.c
22  * PURPOSE: NTFS filesystem driver
23  * PROGRAMMER: Pierre Schweitzer
24  * UPDATE HISTORY:
25  */
26 
27 /* INCLUDES *****************************************************************/
28 
29 #include "ntfs.h"
30 
31 #define NDEBUG
32 #include <debug.h>
33 
34 /* FUNCTIONS ****************************************************************/
35 
36 /*
37  * FUNCTION: Used with IRP to set them to TopLevelIrp field
38  * ARGUMENTS:
39  * Irp = The IRP to set
40  * RETURNS: TRUE if top level was null, else FALSE
41  */
42 BOOLEAN
44 {
45  BOOLEAN ReturnCode = FALSE;
46 
47  TRACE_(NTFS, "NtfsIsIrpTopLevel()\n");
48 
49  if (IoGetTopLevelIrp() == NULL)
50  {
52  ReturnCode = TRUE;
53  }
54 
55  return ReturnCode;
56 }
57 
58 /*
59  * FUNCTION: Allocate and fill an NTFS_IRP_CONTEXT struct in order to use it for IRP
60  * ARGUMENTS:
61  * DeviceObject = Used to fill in struct
62  * Irp = The IRP that need IRP_CONTEXT struct
63  * RETURNS: NULL or PNTFS_IRP_CONTEXT
64  */
67  PIRP Irp)
68 {
69  PNTFS_IRP_CONTEXT IrpContext;
70 
71  TRACE_(NTFS, "NtfsAllocateIrpContext()\n");
72 
73  IrpContext = (PNTFS_IRP_CONTEXT)ExAllocateFromNPagedLookasideList(&NtfsGlobalData->IrpContextLookasideList);
74  if (IrpContext == NULL)
75  return NULL;
76 
77  RtlZeroMemory(IrpContext, sizeof(NTFS_IRP_CONTEXT));
78 
80  IrpContext->Identifier.Size = sizeof(NTFS_IRP_CONTEXT);
81  IrpContext->Irp = Irp;
82  IrpContext->DeviceObject = DeviceObject;
83  IrpContext->Stack = IoGetCurrentIrpStackLocation(Irp);
84  IrpContext->MajorFunction = IrpContext->Stack->MajorFunction;
85  IrpContext->MinorFunction = IrpContext->Stack->MinorFunction;
86  IrpContext->FileObject = IrpContext->Stack->FileObject;
87  IrpContext->IsTopLevel = (IoGetTopLevelIrp() == Irp);
88  IrpContext->PriorityBoost = IO_NO_INCREMENT;
89  IrpContext->Flags = IRPCONTEXT_COMPLETE;
90 
91  if (IrpContext->MajorFunction == IRP_MJ_FILE_SYSTEM_CONTROL ||
92  IrpContext->MajorFunction == IRP_MJ_DEVICE_CONTROL ||
93  IrpContext->MajorFunction == IRP_MJ_SHUTDOWN ||
94  (IrpContext->MajorFunction != IRP_MJ_CLEANUP &&
95  IrpContext->MajorFunction != IRP_MJ_CLOSE &&
97  {
98  IrpContext->Flags |= IRPCONTEXT_CANWAIT;
99  }
100 
101  return IrpContext;
102 }
103 
104 VOID
107 {
108  *FileAttributes = NtfsAttributes;
109  if ((NtfsAttributes & NTFS_FILE_TYPE_DIRECTORY) == NTFS_FILE_TYPE_DIRECTORY)
110  {
111  *FileAttributes = NtfsAttributes & ~NTFS_FILE_TYPE_DIRECTORY;
113  }
114 
115  if (NtfsAttributes == 0)
117 }
118 
119 PVOID
121  BOOLEAN Paging)
122 {
123  if (Irp->MdlAddress != NULL)
124  {
125  return MmGetSystemAddressForMdlSafe(Irp->MdlAddress, (Paging ? HighPagePriority : NormalPagePriority));
126  }
127  else
128  {
129  return Irp->UserBuffer;
130  }
131 }
132 
157 NTSTATUS
159  IN ULONG Length,
161 {
162  ASSERT(Irp);
163 
164  if (Irp->MdlAddress)
165  {
166  return STATUS_SUCCESS;
167  }
168 
169  IoAllocateMdl(Irp->UserBuffer, Length, FALSE, FALSE, Irp);
170 
171  if (!Irp->MdlAddress)
172  {
174  }
175 
176  _SEH2_TRY
177  {
178  MmProbeAndLockPages(Irp->MdlAddress, Irp->RequestorMode, Operation);
179  }
181  {
182  IoFreeMdl(Irp->MdlAddress);
183  Irp->MdlAddress = NULL;
185  }
186  _SEH2_END;
187 
188  return STATUS_SUCCESS;
189 }
190 
191 /* EOF */
#define IN
Definition: typedefs.h:38
PDEVICE_OBJECT DeviceObject
Definition: ntfs.h:484
#define TRUE
Definition: types.h:120
struct NTFS_IRP_CONTEXT * PNTFS_IRP_CONTEXT
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
NTFSIDENTIFIER Identifier
Definition: ntfs.h:476
UCHAR MinorFunction
Definition: ntfs.h:480
#define IRPCONTEXT_COMPLETE
Definition: vfat.h:570
PIO_STACK_LOCATION Stack
Definition: ntfs.h:478
#define IRP_MJ_SHUTDOWN
_In_ PIRP Irp
Definition: csq.h:116
LONG NTSTATUS
Definition: precomp.h:26
BOOLEAN NtfsIsIrpTopLevel(PIRP Irp)
Definition: misc.c:43
#define NTFS_TYPE_IRP_CONTEXT
Definition: ntfs.h:90
BOOLEAN NTAPI IoIsOperationSynchronous(IN PIRP Irp)
Definition: irp.c:1882
#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority)
PNTFS_GLOBAL_DATA NtfsGlobalData
Definition: ntfs.c:41
#define NTFS_FILE_TYPE_DIRECTORY
Definition: ntfs.h:228
_SEH2_TRY
Definition: create.c:4250
PNTFS_IRP_CONTEXT NtfsAllocateIrpContext(PDEVICE_OBJECT DeviceObject, PIRP Irp)
Definition: misc.c:66
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
#define IRPCONTEXT_CANWAIT
Definition: vfat.h:569
_Must_inspect_result_ _In_opt_ PFLT_INSTANCE _Out_ PHANDLE _In_ ACCESS_MASK _In_ POBJECT_ATTRIBUTES _Out_ PIO_STATUS_BLOCK _In_opt_ PLARGE_INTEGER _In_ ULONG FileAttributes
Definition: fltkernel.h:1230
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
#define TRACE_(x)
Definition: compat.h:66
VOID NtfsFileFlagsToAttributes(ULONG NtfsAttributes, PULONG FileAttributes)
Definition: misc.c:105
#define _SEH2_YIELD(STMT_)
Definition: pseh2_64.h:8
#define IRP_MJ_FILE_SYSTEM_CONTROL
UCHAR MajorFunction
Definition: ntfs.h:479
PIRP NTAPI IoGetTopLevelIrp(VOID)
Definition: irp.c:1843
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
VOID NTAPI IoFreeMdl(PMDL Mdl)
Definition: iomdl.c:146
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:126
#define IRP_MJ_CLOSE
Definition: rdpdr.c:45
VOID NTAPI IoSetTopLevelIrp(IN PIRP Irp)
Definition: irp.c:2000
ULONG Type
Definition: ntfs.h:95
ULONG Flags
Definition: ntfs.h:477
PMDL NTAPI IoAllocateMdl(IN PVOID VirtualAddress, IN ULONG Length, IN BOOLEAN SecondaryBuffer, IN BOOLEAN ChargeQuota, IN PIRP Irp)
Definition: iomdl.c:22
IN PDEVICE_OBJECT DeviceObject
Definition: fatprocs.h:1560
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2745
PFILE_OBJECT FileObject
Definition: iotypes.h:2813
_SEH2_END
Definition: create.c:4424
VOID NTAPI MmProbeAndLockPages(IN PMDL Mdl, IN KPROCESSOR_MODE AccessMode, IN LOCK_OPERATION Operation)
Definition: mdlsup.c:935
enum _LOCK_OPERATION LOCK_OPERATION
NPAGED_LOOKASIDE_LIST IrpContextLookasideList
Definition: ntfs.h:152
unsigned int * PULONG
Definition: retypes.h:1
NTSTATUS NtfsLockUserBuffer(IN PIRP Irp, IN ULONG Length, IN LOCK_OPERATION Operation)
Definition: misc.c:158
PVOID NtfsGetUserBuffer(PIRP Irp, BOOLEAN Paging)
Definition: misc.c:120
#define IRP_MJ_CLEANUP
BOOLEAN IsTopLevel
Definition: ntfs.h:483
unsigned int ULONG
Definition: retypes.h:1
#define IO_NO_INCREMENT
Definition: iotypes.h:566
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
_In_ FLT_SET_CONTEXT_OPERATION Operation
Definition: fltkernel.h:1468
CCHAR PriorityBoost
Definition: ntfs.h:487
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:6
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:12
return STATUS_SUCCESS
Definition: btrfs.c:2938
ULONG Size
Definition: ntfs.h:96
PFILE_OBJECT FileObject
Definition: ntfs.h:485
#define IRP_MJ_DEVICE_CONTROL
Definition: rdpdr.c:52