ReactOS 0.4.15-dev-7907-g95bf896
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 */
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;
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
104VOID
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
119PVOID
121 BOOLEAN Paging)
122{
123 if (Irp->MdlAddress != NULL)
124 {
126 }
127 else
128 {
129 return Irp->UserBuffer;
130 }
131}
132
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
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 */
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
unsigned char BOOLEAN
LONG NTSTATUS
Definition: precomp.h:26
_In_ PIRP Irp
Definition: csq.h:116
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define TRACE_(x)
Definition: compat.h:76
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
VOID NtfsFileFlagsToAttributes(ULONG NtfsAttributes, PULONG FileAttributes)
Definition: misc.c:105
BOOLEAN NtfsIsIrpTopLevel(PIRP Irp)
Definition: misc.c:43
PNTFS_IRP_CONTEXT NtfsAllocateIrpContext(PDEVICE_OBJECT DeviceObject, PIRP Irp)
Definition: misc.c:66
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
PNTFS_GLOBAL_DATA NtfsGlobalData
Definition: ntfs.c:36
#define IRPCONTEXT_COMPLETE
Definition: ntfs.h:475
struct NTFS_IRP_CONTEXT * PNTFS_IRP_CONTEXT
#define NTFS_FILE_TYPE_DIRECTORY
Definition: ntfs.h:232
#define IRPCONTEXT_CANWAIT
Definition: ntfs.h:474
#define NTFS_TYPE_IRP_CONTEXT
Definition: ntfs.h:90
#define _SEH2_END
Definition: filesup.c:22
#define _SEH2_TRY
Definition: filesup.c:19
_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:1236
FP_OP Operation
Definition: fpcontrol.c:150
#define IoFreeMdl
Definition: fxmdl.h:89
#define IoAllocateMdl
Definition: fxmdl.h:88
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
VOID NTAPI MmProbeAndLockPages(IN PMDL Mdl, IN KPROCESSOR_MODE AccessMode, IN LOCK_OPERATION Operation)
Definition: mdlsup.c:931
#define ASSERT(a)
Definition: mode.c:44
@ NormalPagePriority
Definition: imports.h:56
@ HighPagePriority
Definition: imports.h:57
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
BOOLEAN NTAPI IoIsOperationSynchronous(IN PIRP Irp)
Definition: irp.c:1882
PIRP NTAPI IoGetTopLevelIrp(VOID)
Definition: irp.c:1843
VOID NTAPI IoSetTopLevelIrp(IN PIRP Irp)
Definition: irp.c:2000
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:159
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:34
#define _SEH2_YIELD(__stmt)
Definition: pseh2_64.h:162
#define IRP_MJ_CLOSE
Definition: rdpdr.c:45
#define IRP_MJ_DEVICE_CONTROL
Definition: rdpdr.c:52
#define STATUS_SUCCESS
Definition: shellext.h:65
ULONG Type
Definition: ntfs.h:95
ULONG Size
Definition: ntfs.h:96
NPAGED_LOOKASIDE_LIST IrpContextLookasideList
Definition: ntfs.h:152
NTFSIDENTIFIER Identifier
Definition: ntfs.h:480
PFILE_OBJECT FileObject
Definition: ntfs.h:489
UCHAR MajorFunction
Definition: ntfs.h:483
ULONG Flags
Definition: ntfs.h:481
PIO_STACK_LOCATION Stack
Definition: ntfs.h:482
UCHAR MinorFunction
Definition: ntfs.h:484
CCHAR PriorityBoost
Definition: ntfs.h:491
BOOLEAN IsTopLevel
Definition: ntfs.h:487
PDEVICE_OBJECT DeviceObject
Definition: ntfs.h:488
PFILE_OBJECT FileObject
Definition: iotypes.h:3169
uint32_t * PULONG
Definition: typedefs.h:59
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
#define IO_NO_INCREMENT
Definition: iotypes.h:598
#define IRP_MJ_FILE_SYSTEM_CONTROL
#define IRP_MJ_SHUTDOWN
#define IRP_MJ_CLEANUP
enum _LOCK_OPERATION LOCK_OPERATION
#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority)