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 43 NtfsIsIrpTopLevel(PIRP Irp) 44 { 45 BOOLEAN ReturnCode = FALSE; 46 47 TRACE_(NTFS, "NtfsIsIrpTopLevel()\n"); 48 49 if (IoGetTopLevelIrp() == NULL) 50 { 51 IoSetTopLevelIrp(Irp); 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 */ 65 PNTFS_IRP_CONTEXT 66 NtfsAllocateIrpContext(PDEVICE_OBJECT DeviceObject, 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 79 IrpContext->Identifier.Type = NTFS_TYPE_IRP_CONTEXT; 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 && 96 IoIsOperationSynchronous(Irp))) 97 { 98 IrpContext->Flags |= IRPCONTEXT_CANWAIT; 99 } 100 101 return IrpContext; 102 } 103 104 VOID 105 NtfsFileFlagsToAttributes(ULONG NtfsAttributes, 106 PULONG FileAttributes) 107 { 108 *FileAttributes = NtfsAttributes; 109 if ((NtfsAttributes & NTFS_FILE_TYPE_DIRECTORY) == NTFS_FILE_TYPE_DIRECTORY) 110 { 111 *FileAttributes = NtfsAttributes & ~NTFS_FILE_TYPE_DIRECTORY; 112 *FileAttributes |= FILE_ATTRIBUTE_DIRECTORY; 113 } 114 115 if (NtfsAttributes == 0) 116 *FileAttributes = FILE_ATTRIBUTE_NORMAL; 117 } 118 119 PVOID 120 NtfsGetUserBuffer(PIRP Irp, 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 133 /* EOF */ 134