ReactOS 0.4.15-dev-7918-g2a2556c
misc.c File Reference
#include "ntfs.h"
#include <debug.h>
Include dependency graph for misc.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

BOOLEAN NtfsIsIrpTopLevel (PIRP Irp)
 
PNTFS_IRP_CONTEXT NtfsAllocateIrpContext (PDEVICE_OBJECT DeviceObject, PIRP Irp)
 
VOID NtfsFileFlagsToAttributes (ULONG NtfsAttributes, PULONG FileAttributes)
 
PVOID NtfsGetUserBuffer (PIRP Irp, BOOLEAN Paging)
 
NtfsLockUserBuffer

@implemented

Ensures the IRP has an MDL Address.

Parameters
IrpIrp with the UserBuffer that needs locking
LengthSize of the Irp->UserBuffer, in bytes
OperationWhat kind of access does the driver need to the buffer. Set to IoReadAccess, IoWriteAccess, or IoModifyAccess.
Returns
STATUS_SUCCESS in case of success, STATUS_INSUFFICIENT_RESOURCES or an exception code otherwise.
Remarks
Trevor Thompson shamelessly ripped this from VfatLockUserBuffer(). Only the name was changed.
NTSTATUS NtfsLockUserBuffer (IN PIRP Irp, IN ULONG Length, IN LOCK_OPERATION Operation)
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 31 of file misc.c.

Function Documentation

◆ NtfsAllocateIrpContext()

PNTFS_IRP_CONTEXT NtfsAllocateIrpContext ( PDEVICE_OBJECT  DeviceObject,
PIRP  Irp 
)

Definition at line 66 of file misc.c.

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}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
_In_ PIRP Irp
Definition: csq.h:116
#define NULL
Definition: types.h:112
#define TRACE_(x)
Definition: compat.h:76
PNTFS_GLOBAL_DATA NtfsGlobalData
Definition: ntfs.c:36
#define IRPCONTEXT_COMPLETE
Definition: ntfs.h:475
struct NTFS_IRP_CONTEXT * PNTFS_IRP_CONTEXT
#define IRPCONTEXT_CANWAIT
Definition: ntfs.h:474
#define NTFS_TYPE_IRP_CONTEXT
Definition: ntfs.h:90
BOOLEAN NTAPI IoIsOperationSynchronous(IN PIRP Irp)
Definition: irp.c:1882
PIRP NTAPI IoGetTopLevelIrp(VOID)
Definition: irp.c:1843
#define IRP_MJ_CLOSE
Definition: rdpdr.c:45
#define IRP_MJ_DEVICE_CONTROL
Definition: rdpdr.c:52
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
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
_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

Referenced by NtfsFsdDispatch().

◆ NtfsFileFlagsToAttributes()

VOID NtfsFileFlagsToAttributes ( ULONG  NtfsAttributes,
PULONG  FileAttributes 
)

Definition at line 105 of file misc.c.

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}
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define NTFS_FILE_TYPE_DIRECTORY
Definition: ntfs.h:232
_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
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705

Referenced by NtfsGetBasicInformation(), NtfsGetBothDirectoryInformation(), NtfsGetDirectoryInformation(), NtfsGetFullDirectoryInformation(), and NtfsGetNetworkOpenInformation().

◆ NtfsGetUserBuffer()

PVOID NtfsGetUserBuffer ( PIRP  Irp,
BOOLEAN  Paging 
)

Definition at line 120 of file misc.c.

122{
123 if (Irp->MdlAddress != NULL)
124 {
126 }
127 else
128 {
129 return Irp->UserBuffer;
130 }
131}
@ NormalPagePriority
Definition: imports.h:56
@ HighPagePriority
Definition: imports.h:57
#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority)

Referenced by GetVolumeBitmap(), NtfsQueryDirectory(), NtfsRead(), and NtfsWrite().

◆ NtfsIsIrpTopLevel()

BOOLEAN NtfsIsIrpTopLevel ( PIRP  Irp)

Definition at line 43 of file misc.c.

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}
unsigned char BOOLEAN
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
VOID NTAPI IoSetTopLevelIrp(IN PIRP Irp)
Definition: irp.c:2000

Referenced by NtfsDispatch().

◆ NtfsLockUserBuffer()

NTSTATUS NtfsLockUserBuffer ( IN PIRP  Irp,
IN ULONG  Length,
IN LOCK_OPERATION  Operation 
)

Definition at line 158 of file misc.c.

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}
#define _SEH2_END
Definition: filesup.c:22
#define _SEH2_TRY
Definition: filesup.c:19
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
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
#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 STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158

Referenced by NtfsWrite().