ReactOS  0.4.14-dev-552-g2fad488
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;
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 }
PDEVICE_OBJECT DeviceObject
Definition: ntfs.h:484
struct NTFS_IRP_CONTEXT * PNTFS_IRP_CONTEXT
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
#define NTFS_TYPE_IRP_CONTEXT
Definition: ntfs.h:90
BOOLEAN NTAPI IoIsOperationSynchronous(IN PIRP Irp)
Definition: irp.c:1882
PNTFS_GLOBAL_DATA NtfsGlobalData
Definition: ntfs.c:41
smooth NULL
Definition: ftsmooth.c:416
#define IRPCONTEXT_CANWAIT
Definition: vfat.h:569
#define TRACE_(x)
Definition: compat.h:66
#define IRP_MJ_FILE_SYSTEM_CONTROL
UCHAR MajorFunction
Definition: ntfs.h:479
PIRP NTAPI IoGetTopLevelIrp(VOID)
Definition: irp.c:1843
#define IRP_MJ_CLOSE
Definition: rdpdr.c:45
ULONG Type
Definition: ntfs.h:95
ULONG Flags
Definition: ntfs.h:477
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
NPAGED_LOOKASIDE_LIST IrpContextLookasideList
Definition: ntfs.h:152
#define IRP_MJ_CLEANUP
BOOLEAN IsTopLevel
Definition: ntfs.h:483
#define IO_NO_INCREMENT
Definition: iotypes.h:566
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
CCHAR PriorityBoost
Definition: ntfs.h:487
ULONG Size
Definition: ntfs.h:96
PFILE_OBJECT FileObject
Definition: ntfs.h:485
#define IRP_MJ_DEVICE_CONTROL
Definition: rdpdr.c:52

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 NTFS_FILE_TYPE_DIRECTORY
Definition: ntfs.h:228
_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 FILE_ATTRIBUTE_NORMAL
Definition: compat.h:126

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  {
125  return MmGetSystemAddressForMdlSafe(Irp->MdlAddress, (Paging ? HighPagePriority : NormalPagePriority));
126  }
127  else
128  {
129  return Irp->UserBuffer;
130  }
131 }
_In_ PIRP Irp
Definition: csq.h:116
#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority)
smooth NULL
Definition: ftsmooth.c:416

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 }
#define TRUE
Definition: types.h:120
_In_ PIRP Irp
Definition: csq.h:116
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
#define TRACE_(x)
Definition: compat.h:66
PIRP NTAPI IoGetTopLevelIrp(VOID)
Definition: irp.c:1843
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 
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 }
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_In_ PIRP Irp
Definition: csq.h:116
_SEH2_TRY
Definition: create.c:4250
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
smooth NULL
Definition: ftsmooth.c:416
#define _SEH2_YIELD(STMT_)
Definition: pseh2_64.h:8
_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)
PMDL NTAPI IoAllocateMdl(IN PVOID VirtualAddress, IN ULONG Length, IN BOOLEAN SecondaryBuffer, IN BOOLEAN ChargeQuota, IN PIRP Irp)
Definition: iomdl.c:22
_SEH2_END
Definition: create.c:4424
VOID NTAPI MmProbeAndLockPages(IN PMDL Mdl, IN KPROCESSOR_MODE AccessMode, IN LOCK_OPERATION Operation)
Definition: mdlsup.c:935
_In_ FLT_SET_CONTEXT_OPERATION Operation
Definition: fltkernel.h:1468
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:6
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:12
return STATUS_SUCCESS
Definition: btrfs.c:2938

Referenced by NtfsWrite().