ReactOS 0.4.17-dev-609-gc4517f4
file.c File Reference
#include <ntoskrnl.h>
#include <debug.h>
Include dependency graph for file.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

VOID NTAPI IopCheckBackupRestorePrivilege (IN PACCESS_STATE AccessState, IN OUT PULONG CreateOptions, IN KPROCESSOR_MODE PreviousMode, IN ULONG Disposition)
 
NTSTATUS NTAPI IopCheckDeviceAndDriver (IN POPEN_PACKET OpenPacket, IN PDEVICE_OBJECT DeviceObject)
 
VOID NTAPI IopDoNameTransmogrify (IN PIRP Irp, IN PFILE_OBJECT FileObject, IN PREPARSE_DATA_BUFFER DataBuffer)
 
NTSTATUS IopCheckTopDeviceHint (IN OUT PDEVICE_OBJECT *DeviceObject, IN POPEN_PACKET OpenPacket, BOOLEAN DirectOpen)
 
NTSTATUS NTAPI IopParseDevice (IN PVOID ParseObject, IN PVOID ObjectType, IN OUT PACCESS_STATE AccessState, IN KPROCESSOR_MODE AccessMode, IN ULONG Attributes, IN OUT PUNICODE_STRING CompleteName, IN OUT PUNICODE_STRING RemainingName, IN OUT PVOID Context, IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL, OUT PVOID *Object)
 
NTSTATUS NTAPI IopParseFile (IN PVOID ParseObject, IN PVOID ObjectType, IN OUT PACCESS_STATE AccessState, IN KPROCESSOR_MODE AccessMode, IN ULONG Attributes, IN OUT PUNICODE_STRING CompleteName, IN OUT PUNICODE_STRING RemainingName, IN OUT PVOID Context OPTIONAL, IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL, OUT PVOID *Object)
 
VOID NTAPI IopDeleteFile (IN PVOID ObjectBody)
 
PDEVICE_OBJECT NTAPI IopGetDeviceAttachmentBase (IN PDEVICE_OBJECT DeviceObject)
 
PDEVICE_OBJECT NTAPI IopGetDevicePDO (IN PDEVICE_OBJECT DeviceObject)
 
NTSTATUS NTAPI IopSetDeviceSecurityDescriptor (IN PDEVICE_OBJECT DeviceObject, IN PSECURITY_INFORMATION SecurityInformation, IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN POOL_TYPE PoolType, IN PGENERIC_MAPPING GenericMapping)
 
NTSTATUS NTAPI IopSetDeviceSecurityDescriptors (IN PDEVICE_OBJECT UpperDeviceObject, IN PDEVICE_OBJECT PhysicalDeviceObject, IN PSECURITY_INFORMATION SecurityInformation, IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN POOL_TYPE PoolType, IN PGENERIC_MAPPING GenericMapping)
 
NTSTATUS NTAPI IopGetSetSecurityObject (IN PVOID ObjectBody, IN SECURITY_OPERATION_CODE OperationCode, IN PSECURITY_INFORMATION SecurityInformation, IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN OUT PULONG BufferLength, IN OUT PSECURITY_DESCRIPTOR *OldSecurityDescriptor, IN POOL_TYPE PoolType, IN OUT PGENERIC_MAPPING GenericMapping, IN KPROCESSOR_MODE AccessMode)
 
NTSTATUS NTAPI IopQueryName (IN PVOID ObjectBody, IN BOOLEAN HasName, OUT POBJECT_NAME_INFORMATION ObjectNameInfo, IN ULONG Length, OUT PULONG ReturnLength, IN KPROCESSOR_MODE PreviousMode)
 
NTSTATUS NTAPI IopQueryNameInternal (IN PVOID ObjectBody, IN BOOLEAN HasName, IN BOOLEAN QueryDosName, OUT POBJECT_NAME_INFORMATION ObjectNameInfo, IN ULONG Length, OUT PULONG ReturnLength, IN KPROCESSOR_MODE PreviousMode)
 
VOID NTAPI IopCloseFile (IN PEPROCESS Process OPTIONAL, IN PVOID ObjectBody, IN ACCESS_MASK GrantedAccess, IN ULONG_PTR HandleCount, IN ULONG_PTR SystemHandleCount)
 
NTSTATUS NTAPI IopQueryAttributesFile (IN POBJECT_ATTRIBUTES ObjectAttributes, IN FILE_INFORMATION_CLASS FileInformationClass, IN ULONG FileInformationSize, OUT PVOID FileInformation)
 
NTSTATUS NTAPI IopAcquireFileObjectLock (_In_ PFILE_OBJECT FileObject, _In_ KPROCESSOR_MODE WaitMode, _In_ BOOLEAN Alertable, _Out_ PBOOLEAN LockFailed)
 
PVOID NTAPI IoGetFileObjectFilterContext (IN PFILE_OBJECT FileObject)
 
NTSTATUS NTAPI IoChangeFileObjectFilterContext (IN PFILE_OBJECT FileObject, IN PVOID FilterContext, IN BOOLEAN Define)
 
NTSTATUS NTAPI IopCreateFile (OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes, IN ULONG ShareAccess, IN ULONG Disposition, IN ULONG CreateOptions, IN PVOID EaBuffer OPTIONAL, IN ULONG EaLength, IN CREATE_FILE_TYPE CreateFileType, IN PVOID ExtraCreateParameters OPTIONAL, IN ULONG Options, IN ULONG Flags, IN PDEVICE_OBJECT DeviceObject OPTIONAL)
 
NTSTATUS NTAPI IoCheckQuerySetFileInformation (IN FILE_INFORMATION_CLASS FileInformationClass, IN ULONG Length, IN BOOLEAN SetOperation)
 
NTSTATUS NTAPI IoCheckQuotaBufferValidity (IN PFILE_QUOTA_INFORMATION QuotaBuffer, IN ULONG QuotaLength, OUT PULONG ErrorOffset)
 
NTSTATUS NTAPI IoCreateFile (OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes, IN ULONG ShareAccess, IN ULONG Disposition, IN ULONG CreateOptions, IN PVOID EaBuffer OPTIONAL, IN ULONG EaLength, IN CREATE_FILE_TYPE CreateFileType, IN PVOID ExtraCreateParameters OPTIONAL, IN ULONG Options)
 
NTSTATUS NTAPI IoCreateFileSpecifyDeviceObjectHint (OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes, IN ULONG ShareAccess, IN ULONG Disposition, IN ULONG CreateOptions, IN PVOID EaBuffer OPTIONAL, IN ULONG EaLength, IN CREATE_FILE_TYPE CreateFileType, IN PVOID ExtraCreateParameters OPTIONAL, IN ULONG Options, IN PVOID DeviceObject)
 
PFILE_OBJECT NTAPI IoCreateStreamFileObjectEx (IN PFILE_OBJECT FileObject OPTIONAL, IN PDEVICE_OBJECT DeviceObject OPTIONAL, OUT PHANDLE FileObjectHandle OPTIONAL)
 
PFILE_OBJECT NTAPI IoCreateStreamFileObject (IN PFILE_OBJECT FileObject, IN PDEVICE_OBJECT DeviceObject)
 
PFILE_OBJECT NTAPI IoCreateStreamFileObjectLite (IN PFILE_OBJECT FileObject OPTIONAL, IN PDEVICE_OBJECT DeviceObject OPTIONAL)
 
PGENERIC_MAPPING NTAPI IoGetFileObjectGenericMapping (VOID)
 
BOOLEAN NTAPI IoIsFileOriginRemote (IN PFILE_OBJECT FileObject)
 
BOOLEAN NTAPI IoFastQueryNetworkAttributes (IN POBJECT_ATTRIBUTES ObjectAttributes, IN ACCESS_MASK DesiredAccess, IN ULONG OpenOptions, OUT PIO_STATUS_BLOCK IoStatus, OUT PFILE_NETWORK_OPEN_INFORMATION Buffer)
 
VOID NTAPI IoUpdateShareAccess (IN PFILE_OBJECT FileObject, OUT PSHARE_ACCESS ShareAccess)
 
NTSTATUS NTAPI IoCheckShareAccess (IN ACCESS_MASK DesiredAccess, IN ULONG DesiredShareAccess, IN PFILE_OBJECT FileObject, IN PSHARE_ACCESS ShareAccess, IN BOOLEAN Update)
 
VOID NTAPI IoRemoveShareAccess (IN PFILE_OBJECT FileObject, IN PSHARE_ACCESS ShareAccess)
 
VOID NTAPI IoSetShareAccess (IN ACCESS_MASK DesiredAccess, IN ULONG DesiredShareAccess, IN PFILE_OBJECT FileObject, OUT PSHARE_ACCESS ShareAccess)
 
VOID NTAPI IoCancelFileOpen (IN PDEVICE_OBJECT DeviceObject, IN PFILE_OBJECT FileObject)
 
NTSTATUS NTAPI IoQueryFileDosDeviceName (IN PFILE_OBJECT FileObject, OUT POBJECT_NAME_INFORMATION *ObjectNameInformation)
 
NTSTATUS NTAPI IoSetFileOrigin (IN PFILE_OBJECT FileObject, IN BOOLEAN Remote)
 
NTSTATUS NTAPI NtCreateFile (PHANDLE FileHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, PIO_STATUS_BLOCK IoStatusBlock, PLARGE_INTEGER AllocateSize, ULONG FileAttributes, ULONG ShareAccess, ULONG CreateDisposition, ULONG CreateOptions, PVOID EaBuffer, ULONG EaLength)
 
NTSTATUS NTAPI NtCreateMailslotFile (OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN ULONG CreateOptions, IN ULONG MailslotQuota, IN ULONG MaxMessageSize, IN PLARGE_INTEGER TimeOut)
 
NTSTATUS NTAPI NtCreateNamedPipeFile (OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN ULONG ShareAccess, IN ULONG CreateDisposition, IN ULONG CreateOptions, IN ULONG NamedPipeType, IN ULONG ReadMode, IN ULONG CompletionMode, IN ULONG MaximumInstances, IN ULONG InboundQuota, IN ULONG OutboundQuota, IN PLARGE_INTEGER DefaultTimeout)
 
NTSTATUS NTAPI NtFlushWriteBuffer (VOID)
 
NTSTATUS NTAPI NtOpenFile (OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN ULONG ShareAccess, IN ULONG OpenOptions)
 
NTSTATUS NTAPI NtQueryAttributesFile (IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PFILE_BASIC_INFORMATION FileInformation)
 
NTSTATUS NTAPI NtQueryFullAttributesFile (IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PFILE_NETWORK_OPEN_INFORMATION FileInformation)
 
NtCancelIoFile

Cancel all pending I/O operations in the current thread for specified file object.

Parameters
FileHandleHandle to file object to cancel requests for. No specific access rights are needed.
IoStatusBlockPointer to status block which is filled with final completition status on successful return.
Returns
Status.

@implemented

NTSTATUS NTAPI NtCancelIoFile (IN HANDLE FileHandle, OUT PIO_STATUS_BLOCK IoStatusBlock)
 
NTSTATUS NTAPI NtDeleteFile (IN POBJECT_ATTRIBUTES ObjectAttributes)
 

Variables

ERESOURCE IopSecurityResource
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 16 of file file.c.

Function Documentation

◆ IoCancelFileOpen()

VOID NTAPI IoCancelFileOpen ( IN PDEVICE_OBJECT  DeviceObject,
IN PFILE_OBJECT  FileObject 
)

Definition at line 3596 of file file.c.

3598{
3599 PIRP Irp;
3600 KEVENT Event;
3601 KIRQL OldIrql;
3604
3605 /* Check if handles were already created for the
3606 * open file. If so, that's over.
3607 */
3608 if (FileObject->Flags & FO_HANDLE_CREATED)
3609 KeBugCheckEx(INVALID_CANCEL_OF_FILE_OPEN,
3611 (ULONG_PTR)DeviceObject, 0, 0);
3612
3613 /* Reset the events */
3615 KeClearEvent(&FileObject->Event);
3616
3617 /* Allocate the IRP we'll use */
3619 /* Properly set it */
3620 Irp->Tail.Overlay.Thread = PsGetCurrentThread();
3621 Irp->UserEvent = &Event;
3622 Irp->UserIosb = &Irp->IoStatus;
3623 Irp->Overlay.AsynchronousParameters.UserApcRoutine = NULL;
3624 Irp->Tail.Overlay.OriginalFileObject = FileObject;
3625 Irp->RequestorMode = KernelMode;
3627
3629 Stack->MajorFunction = IRP_MJ_CLEANUP;
3630 Stack->FileObject = FileObject;
3631
3632 /* Put on top of IRPs list of the thread */
3634
3635 /* Call the driver */
3637 if (Status == STATUS_PENDING)
3638 {
3641 }
3642
3643 /* Remove from IRPs list */
3647
3648 /* Free the IRP */
3649 IoFreeIrp(Irp);
3650
3651 /* Clear the event */
3652 KeClearEvent(&FileObject->Event);
3653 /* And finally, mark the open operation as canceled */
3655}
LONG NTSTATUS
Definition: precomp.h:26
DECLSPEC_NORETURN VOID NTAPI KeBugCheckEx(IN ULONG BugCheckCode, IN ULONG_PTR BugCheckParameter1, IN ULONG_PTR BugCheckParameter2, IN ULONG_PTR BugCheckParameter3, IN ULONG_PTR BugCheckParameter4)
Definition: debug.c:485
_In_ PIRP Irp
Definition: csq.h:116
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define PsGetCurrentThread()
Definition: env_spec_w32.h:81
#define KeRaiseIrql(irql, oldIrql)
Definition: env_spec_w32.h:597
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
Definition: env_spec_w32.h:478
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
#define APC_LEVEL
Definition: env_spec_w32.h:695
#define KeLowerIrql(oldIrql)
Definition: env_spec_w32.h:602
VOID NTAPI KeClearEvent(IN PKEVENT Event)
Definition: eventobj.c:22
Status
Definition: gdiplustypes.h:24
FORCEINLINE VOID IopQueueIrpToThread(IN PIRP Irp)
Definition: io_x.h:49
FORCEINLINE VOID IopUnQueueIrpFromThread(IN PIRP Irp)
Definition: io_x.h:66
#define KernelMode
Definition: asm.h:38
@ SynchronizationEvent
PIRP NTAPI IopAllocateIrpMustSucceed(IN CCHAR StackSize)
Definition: irp.c:748
#define IoCallDriver
Definition: irp.c:1257
VOID NTAPI IoFreeIrp(IN PIRP Irp)
Definition: irp.c:1698
#define STATUS_PENDING
Definition: telnetd.h:14
uint32_t ULONG_PTR
Definition: typedefs.h:65
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
Definition: wdfdevice.h:550
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
Definition: wdfrequest.h:639
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2695
#define FO_FILE_OPEN_CANCELLED
Definition: iotypes.h:1797
#define IRP_CLOSE_OPERATION
#define IRP_SYNCHRONOUS_API
#define FO_HANDLE_CREATED
Definition: iotypes.h:1794
#define IRP_MJ_CLEANUP
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778
@ UserRequest
Definition: ketypes.h:473

◆ IoChangeFileObjectFilterContext()

NTSTATUS NTAPI IoChangeFileObjectFilterContext ( IN PFILE_OBJECT  FileObject,
IN PVOID  FilterContext,
IN BOOLEAN  Define 
)

Definition at line 2510 of file file.c.

2513{
2515 PFILE_OBJECT_EXTENSION FileObjectExtension;
2516
2518 {
2520 }
2521
2522 FileObjectExtension = FileObject->FileObjectExtension;
2523 if (Define)
2524 {
2525 /* If define, just set the new value if not value is set
2526 * Success will only contain old value. It is valid if it is NULL
2527 */
2529 }
2530 else
2531 {
2532 /* If not define, we want to reset filter context.
2533 * We will remove value (provided by the caller) and set NULL instead.
2534 * This will only success if caller provides correct previous value.
2535 * To catch whether it worked, we substract previous value to expect value:
2536 * If it matches (and thus, we reset), Success will contain 0
2537 * Otherwise, it will contain a non-zero value.
2538 */
2540 }
2541
2542 /* If success isn't 0, it means we failed somewhere (set or unset) */
2543 if (Success != 0)
2544 {
2546 }
2547
2548 return STATUS_SUCCESS;
2549}
#define ULONG_PTR
Definition: config.h:101
@ Success
Definition: eventcreate.c:712
#define BooleanFlagOn(F, SF)
Definition: ext2fs.h:183
_In_ PLIST_ENTRY _In_ PSTRING _In_ USHORT _In_opt_ PSTRING _In_opt_ PSTRING _In_ ULONG _In_ ULONG _In_opt_ PVOID _In_opt_ PVOID FilterContext
Definition: fsrtlfuncs.h:746
#define InterlockedCompareExchangePointer
Definition: interlocked.h:144
#define FO_FILE_OBJECT_HAS_EXTENSION
Definition: iotypes.h:148
#define STATUS_ALREADY_COMMITTED
Definition: ntstatus.h:363
#define STATUS_SUCCESS
Definition: shellext.h:65
PVOID FilterContext
Definition: io.h:103
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135

Referenced by FsRtlInsertPerFileObjectContext(), and FsRtlPTeardownPerFileObjectContexts().

◆ IoCheckQuerySetFileInformation()

NTSTATUS NTAPI IoCheckQuerySetFileInformation ( IN FILE_INFORMATION_CLASS  FileInformationClass,
IN ULONG  Length,
IN BOOLEAN  SetOperation 
)

Definition at line 2983 of file file.c.

2986{
2989}
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
#define STATUS_NOT_IMPLEMENTED
Definition: d3dkmdt.h:42

◆ IoCheckQuotaBufferValidity()

NTSTATUS NTAPI IoCheckQuotaBufferValidity ( IN PFILE_QUOTA_INFORMATION  QuotaBuffer,
IN ULONG  QuotaLength,
OUT PULONG  ErrorOffset 
)

Definition at line 2996 of file file.c.

2999{
3002}

◆ IoCheckShareAccess()

NTSTATUS NTAPI IoCheckShareAccess ( IN ACCESS_MASK  DesiredAccess,
IN ULONG  DesiredShareAccess,
IN PFILE_OBJECT  FileObject,
IN PSHARE_ACCESS  ShareAccess,
IN BOOLEAN  Update 
)

Definition at line 3389 of file file.c.

3394{
3397 BOOLEAN DeleteAccess;
3398 BOOLEAN SharedRead;
3399 BOOLEAN SharedWrite;
3400 BOOLEAN SharedDelete;
3401 PAGED_CODE();
3402
3403 /* Get access masks */
3406 DeleteAccess = (DesiredAccess & DELETE) != 0;
3407
3408 /* Set them in the file object */
3409 FileObject->ReadAccess = ReadAccess;
3410 FileObject->WriteAccess = WriteAccess;
3411 FileObject->DeleteAccess = DeleteAccess;
3412
3413 /* Check if the file has an extension */
3415 {
3416 /* Check if caller specified to ignore access checks */
3417 //if (FileObject->FoExtFlags & IO_IGNORE_SHARE_ACCESS_CHECK)
3418 {
3419 /* Don't check share access */
3420 return STATUS_SUCCESS;
3421 }
3422 }
3423
3424 /* Check if we have any access */
3425 if ((ReadAccess) || (WriteAccess) || (DeleteAccess))
3426 {
3427 /* Get shared access masks */
3428 SharedRead = (DesiredShareAccess & FILE_SHARE_READ) != 0;
3429 SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE) != 0;
3430 SharedDelete = (DesiredShareAccess & FILE_SHARE_DELETE) != 0;
3431
3432 /* Check if the shared access is violated */
3433 if ((ReadAccess &&
3434 (ShareAccess->SharedRead < ShareAccess->OpenCount)) ||
3435 (WriteAccess &&
3436 (ShareAccess->SharedWrite < ShareAccess->OpenCount)) ||
3437 (DeleteAccess &&
3438 (ShareAccess->SharedDelete < ShareAccess->OpenCount)) ||
3439 ((ShareAccess->Readers != 0) && !SharedRead) ||
3440 ((ShareAccess->Writers != 0) && !SharedWrite) ||
3441 ((ShareAccess->Deleters != 0) && !SharedDelete))
3442 {
3443 /* Sharing violation, fail */
3445 }
3446
3447 /* Set them */
3448 FileObject->SharedRead = SharedRead;
3449 FileObject->SharedWrite = SharedWrite;
3450 FileObject->SharedDelete = SharedDelete;
3451
3452 /* It's not, check if caller wants us to update it */
3453 if (Update)
3454 {
3455 /* Increase open count */
3456 ShareAccess->OpenCount++;
3457
3458 /* Update shared access */
3459 ShareAccess->Readers += ReadAccess;
3460 ShareAccess->Writers += WriteAccess;
3461 ShareAccess->Deleters += DeleteAccess;
3462 ShareAccess->SharedRead += SharedRead;
3463 ShareAccess->SharedWrite += SharedWrite;
3464 ShareAccess->SharedDelete += SharedDelete;
3465 }
3466 }
3467
3468 /* Validation successful */
3469 return STATUS_SUCCESS;
3470}
#define PAGED_CODE()
unsigned char BOOLEAN
Definition: actypes.h:127
@ Update
Definition: registry.c:565
#define FILE_SHARE_READ
Definition: compat.h:136
_In_ PIO_STACK_LOCATION _Inout_ PFILE_OBJECT _Inout_ PVCB _Outptr_result_maybenull_ PDCB _In_ PDCB _In_ PDIRENT _In_ ULONG _In_ ULONG _In_ PUNICODE_STRING _In_ PACCESS_MASK _In_ USHORT ShareAccess
Definition: create.c:4148
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
#define FILE_WRITE_DATA
Definition: nt_native.h:631
#define FILE_READ_DATA
Definition: nt_native.h:628
#define FILE_SHARE_DELETE
Definition: nt_native.h:682
#define FILE_EXECUTE
Definition: nt_native.h:642
#define FILE_APPEND_DATA
Definition: nt_native.h:634
#define DELETE
Definition: nt_native.h:57
#define STATUS_SHARING_VIOLATION
Definition: udferr_usr.h:154
_Must_inspect_result_ _In_ WDFDEVICE _In_ ULONG _In_ ACCESS_MASK DesiredAccess
Definition: wdfdevice.h:2664
_In_ ULONG DesiredShareAccess
Definition: iofuncs.h:781
@ ReadAccess
Definition: iotypes.h:424
@ WriteAccess
Definition: iotypes.h:425

Referenced by Ext2CreateFile(), Ext2CreateVolume(), FatCheckShareAccess(), open_file2(), OpenMupFileSystem(), RawCreate(), UDFCheckAccessRights(), and VfatCreateFile().

◆ IoCreateFile()

NTSTATUS NTAPI IoCreateFile ( OUT PHANDLE  FileHandle,
IN ACCESS_MASK  DesiredAccess,
IN POBJECT_ATTRIBUTES  ObjectAttributes,
OUT PIO_STATUS_BLOCK  IoStatusBlock,
IN PLARGE_INTEGER AllocationSize  OPTIONAL,
IN ULONG  FileAttributes,
IN ULONG  ShareAccess,
IN ULONG  Disposition,
IN ULONG  CreateOptions,
IN PVOID EaBuffer  OPTIONAL,
IN ULONG  EaLength,
IN CREATE_FILE_TYPE  CreateFileType,
IN PVOID ExtraCreateParameters  OPTIONAL,
IN ULONG  Options 
)

Definition at line 3009 of file file.c.

3023{
3024 PAGED_CODE();
3025
3035 EaBuffer,
3036 EaLength,
3038 ExtraCreateParameters,
3039 Options,
3040 0,
3041 NULL);
3042}
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
IN PVCB IN PDIRENT OUT PULONG EaLength
Definition: fatprocs.h:879
IN PFCB IN PFILE_OBJECT FileObject IN ULONG AllocationSize
Definition: fatprocs.h:323
_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
_Must_inspect_result_ _In_opt_ PFLT_INSTANCE _Out_ PHANDLE FileHandle
Definition: fltkernel.h:1231
_In_ ACCESS_MASK _In_ POBJECT_ATTRIBUTES _Reserved_ ULONG _In_opt_ PUNICODE_STRING _In_ ULONG _Out_opt_ PULONG Disposition
Definition: cmfuncs.h:56
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:100
NTSTATUS NTAPI IopCreateFile(OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes, IN ULONG ShareAccess, IN ULONG Disposition, IN ULONG CreateOptions, IN PVOID EaBuffer OPTIONAL, IN ULONG EaLength, IN CREATE_FILE_TYPE CreateFileType, IN PVOID ExtraCreateParameters OPTIONAL, IN ULONG Options, IN ULONG Flags, IN PDEVICE_OBJECT DeviceObject OPTIONAL)
Definition: file.c:2553
_In_ PWDFDEVICE_INIT _In_ PWDF_REMOVE_LOCK_OPTIONS Options
Definition: wdfdevice.h:3540
_Must_inspect_result_ _In_opt_ WDFKEY _In_ PCUNICODE_STRING _In_ ACCESS_MASK _In_ ULONG CreateOptions
Definition: wdfregistry.h:118
_In_ ACCESS_MASK _In_ POBJECT_ATTRIBUTES _Out_ PIO_STATUS_BLOCK _In_opt_ PLARGE_INTEGER _In_ ULONG _In_ ULONG _In_ ULONG _In_ ULONG _In_opt_ PVOID EaBuffer
Definition: iofuncs.h:845
_In_ ACCESS_MASK _In_ POBJECT_ATTRIBUTES _Out_ PIO_STATUS_BLOCK _In_opt_ PLARGE_INTEGER _In_ ULONG _In_ ULONG _In_ ULONG _In_ ULONG _In_opt_ PVOID _In_ ULONG _In_ CREATE_FILE_TYPE CreateFileType
Definition: iofuncs.h:847

Referenced by BroadcastOpen(), CreateRemoteDatabaseWorker(), FsRtlTest_OpenTestDirectory(), FsRtlTest_OpenTestFile(), IopOpenLinkOrRenameTarget(), KernelModeTest(), KspCreateObjectType(), NpCreatePipeEx(), NpOpenPipeEx(), NpWaitPipe(), NtCreateFile(), NtCreateMailslotFile(), NtCreateNamedPipeFile(), NtCreatePagingFile(), NtOpenFile(), OpenRemoteDatabase(), TestIoCreateFile(), TestSymlinks(), UserModeTest(), VfatSetRenameInformation(), and WdmAudOpenSysAudioDevice().

◆ IoCreateFileSpecifyDeviceObjectHint()

NTSTATUS NTAPI IoCreateFileSpecifyDeviceObjectHint ( OUT PHANDLE  FileHandle,
IN ACCESS_MASK  DesiredAccess,
IN POBJECT_ATTRIBUTES  ObjectAttributes,
OUT PIO_STATUS_BLOCK  IoStatusBlock,
IN PLARGE_INTEGER AllocationSize  OPTIONAL,
IN ULONG  FileAttributes,
IN ULONG  ShareAccess,
IN ULONG  Disposition,
IN ULONG  CreateOptions,
IN PVOID EaBuffer  OPTIONAL,
IN ULONG  EaLength,
IN CREATE_FILE_TYPE  CreateFileType,
IN PVOID ExtraCreateParameters  OPTIONAL,
IN ULONG  Options,
IN PVOID  DeviceObject 
)

Definition at line 3049 of file file.c.

3064{
3065 ULONG Flags = 0;
3066
3067 PAGED_CODE();
3068
3069 /* Check if we were passed a device to send the create request to*/
3070 if (DeviceObject)
3071 {
3072 /* We'll tag this request into a file object extension */
3074 }
3075
3085 EaBuffer,
3086 EaLength,
3088 ExtraCreateParameters,
3090 Flags,
3091 DeviceObject);
3092}
#define IOP_USE_TOP_LEVEL_DEVICE_HINT
Definition: io.h:96
#define IOP_CREATE_FILE_OBJECT_EXTENSION
Definition: io.h:97
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define IO_NO_PARAMETER_CHECKING
Definition: iotypes.h:541

Referenced by IopOpenLinkOrRenameTarget().

◆ IoCreateStreamFileObject()

PFILE_OBJECT NTAPI IoCreateStreamFileObject ( IN PFILE_OBJECT  FileObject,
IN PDEVICE_OBJECT  DeviceObject 
)

Definition at line 3186 of file file.c.

3188{
3189 /* Call the newer function */
3191}
PFILE_OBJECT NTAPI IoCreateStreamFileObjectEx(IN PFILE_OBJECT FileObject OPTIONAL, IN PDEVICE_OBJECT DeviceObject OPTIONAL, OUT PHANDLE FileObjectHandle OPTIONAL)
Definition: file.c:3099

Referenced by _Requires_lock_held_(), Ext2InitializeVcb(), FatOpenEaFile(), mount_vol(), NtfsFCBInitializeCache(), NtfsMountVolume(), PerformTest(), vfatFCBInitializeCacheFromVolume(), and VfatMount().

◆ IoCreateStreamFileObjectEx()

PFILE_OBJECT NTAPI IoCreateStreamFileObjectEx ( IN PFILE_OBJECT FileObject  OPTIONAL,
IN PDEVICE_OBJECT DeviceObject  OPTIONAL,
OUT PHANDLE FileObjectHandle  OPTIONAL 
)

Definition at line 3099 of file file.c.

3102{
3103 PFILE_OBJECT CreatedFileObject;
3107 PAGED_CODE();
3108 IOTRACE(IO_FILE_DEBUG, "FileObject: %p\n", FileObject);
3109
3110 /* Choose Device Object */
3111 if (FileObject) DeviceObject = FileObject->DeviceObject;
3112
3113 /* Reference the device object and initialize attributes */
3114 InterlockedIncrement(&DeviceObject->ReferenceCount);
3116
3117 /* Create the File Object */
3121 KernelMode,
3122 NULL,
3123 sizeof(FILE_OBJECT),
3124 sizeof(FILE_OBJECT),
3125 0,
3126 (PVOID*)&CreatedFileObject);
3127 if (!NT_SUCCESS(Status))
3128 {
3129 /* Fail */
3132 }
3133
3134 /* Set File Object Data */
3135 RtlZeroMemory(CreatedFileObject, sizeof(FILE_OBJECT));
3136 CreatedFileObject->DeviceObject = DeviceObject;
3137 CreatedFileObject->Type = IO_TYPE_FILE;
3138 CreatedFileObject->Size = sizeof(FILE_OBJECT);
3139 CreatedFileObject->Flags = FO_STREAM_FILE;
3140
3141 /* Initialize the wait event */
3142 KeInitializeEvent(&CreatedFileObject->Event, SynchronizationEvent, FALSE);
3143
3144 /* Insert it to create a handle for it */
3145 Status = ObInsertObject(CreatedFileObject,
3146 NULL,
3148 1,
3149 (PVOID*)&CreatedFileObject,
3150 &FileHandle);
3152
3153 /* Set the handle created flag */
3154 CreatedFileObject->Flags |= FO_HANDLE_CREATED;
3155 ASSERT(CreatedFileObject->Type == IO_TYPE_FILE);
3156
3157 /* Check if we have a VPB */
3158 if (DeviceObject->Vpb)
3159 {
3160 /* Reference it */
3161 InterlockedIncrement((PLONG)&DeviceObject->Vpb->ReferenceCount);
3162 }
3163
3164 /* Check if the caller wants the handle */
3165 if (FileObjectHandle)
3166 {
3167 /* Return it */
3169 ObDereferenceObject(CreatedFileObject);
3170 }
3171 else
3172 {
3173 /* Otherwise, close it */
3175 }
3176
3177 /* Return the file object */
3178 return CreatedFileObject;
3179}
#define InterlockedIncrement
Definition: armddk.h:53
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
POBJECT_TYPE IoFileObjectType
Definition: iomgr.c:36
#define ASSERT(a)
Definition: mode.c:44
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:115
@ FILE_OBJECT
Definition: ntobjenum.h:17
VOID NTAPI IopDereferenceDeviceObject(IN PDEVICE_OBJECT DeviceObject, IN BOOLEAN ForceUnload)
Definition: device.c:463
#define IO_FILE_DEBUG
Definition: io.h:20
#define IOTRACE(x, fmt,...)
Definition: io.h:47
#define ExRaiseStatus
Definition: ntoskrnl.h:114
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
Definition: obhandle.c:3397
NTSTATUS NTAPI ObInsertObject(IN PVOID Object, IN PACCESS_STATE AccessState OPTIONAL, IN ACCESS_MASK DesiredAccess, IN ULONG ObjectPointerBias, OUT PVOID *NewObject OPTIONAL, OUT PHANDLE Handle)
Definition: obhandle.c:2947
NTSTATUS NTAPI ObCreateObject(IN KPROCESSOR_MODE ProbeMode OPTIONAL, IN POBJECT_TYPE Type, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN KPROCESSOR_MODE AccessMode, IN OUT PVOID ParseContext OPTIONAL, IN ULONG ObjectSize, IN ULONG PagedPoolCharge OPTIONAL, IN ULONG NonPagedPoolCharge OPTIONAL, OUT PVOID *Object)
Definition: oblife.c:1040
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
int32_t * PLONG
Definition: typedefs.h:58
_In_opt_ PDEVICE_OBJECT _Out_opt_ PHANDLE FileObjectHandle
Definition: iofuncs.h:2175
#define IO_TYPE_FILE
* PFILE_OBJECT
Definition: iotypes.h:1998
#define FO_STREAM_FILE
Definition: iotypes.h:1783
#define ObDereferenceObject
Definition: obfuncs.h:203

Referenced by IoCreateStreamFileObject().

◆ IoCreateStreamFileObjectLite()

PFILE_OBJECT NTAPI IoCreateStreamFileObjectLite ( IN PFILE_OBJECT FileObject  OPTIONAL,
IN PDEVICE_OBJECT DeviceObject  OPTIONAL 
)

Definition at line 3198 of file file.c.

3200{
3201 PFILE_OBJECT CreatedFileObject;
3204 PAGED_CODE();
3205 IOTRACE(IO_FILE_DEBUG, "FileObject: %p\n", FileObject);
3206
3207 /* Choose Device Object */
3208 if (FileObject) DeviceObject = FileObject->DeviceObject;
3209
3210 /* Reference the device object and initialize attributes */
3211 InterlockedIncrement(&DeviceObject->ReferenceCount);
3213
3214 /* Create the File Object */
3218 KernelMode,
3219 NULL,
3220 sizeof(FILE_OBJECT),
3221 sizeof(FILE_OBJECT),
3222 0,
3223 (PVOID*)&CreatedFileObject);
3224 if (!NT_SUCCESS(Status))
3225 {
3226 /* Fail */
3229 }
3230
3231 /* Set File Object Data */
3232 RtlZeroMemory(CreatedFileObject, sizeof(FILE_OBJECT));
3233 CreatedFileObject->DeviceObject = DeviceObject;
3234 CreatedFileObject->Type = IO_TYPE_FILE;
3235 CreatedFileObject->Size = sizeof(FILE_OBJECT);
3236 CreatedFileObject->Flags = FO_STREAM_FILE;
3237
3238 /* Initialize the wait event */
3239 KeInitializeEvent(&CreatedFileObject->Event, SynchronizationEvent, FALSE);
3240
3241 /* Destroy create information */
3243 ObjectCreateInfo);
3244 OBJECT_TO_OBJECT_HEADER(CreatedFileObject)->ObjectCreateInfo = NULL;
3245
3246 /* Set the handle created flag */
3247 CreatedFileObject->Flags |= FO_HANDLE_CREATED;
3248 ASSERT(CreatedFileObject->Type == IO_TYPE_FILE);
3249
3250 /* Check if we have a VPB */
3251 if (DeviceObject->Vpb)
3252 {
3253 /* Reference it */
3254 InterlockedIncrement((PLONG)&DeviceObject->Vpb->ReferenceCount);
3255 }
3256
3257 /* Return the file object */
3258 return CreatedFileObject;
3259}
#define OBJECT_TO_OBJECT_HEADER(o)
Definition: obtypes.h:111
VOID NTAPI ObFreeObjectCreateInfoBuffer(IN POBJECT_CREATE_INFORMATION ObjectCreateInfo)
Definition: oblife.c:604

Referenced by CdCreateInternalStream(), and RawMountVolume().

◆ IoFastQueryNetworkAttributes()

BOOLEAN NTAPI IoFastQueryNetworkAttributes ( IN POBJECT_ATTRIBUTES  ObjectAttributes,
IN ACCESS_MASK  DesiredAccess,
IN ULONG  OpenOptions,
OUT PIO_STATUS_BLOCK  IoStatus,
OUT PFILE_NETWORK_OPEN_INFORMATION  Buffer 
)

Definition at line 3288 of file file.c.

3293{
3295 DUMMY_FILE_OBJECT LocalFileObject;
3296 HANDLE Handle;
3297 OPEN_PACKET OpenPacket;
3298 PAGED_CODE();
3299 IOTRACE(IO_FILE_DEBUG, "FileName: %wZ\n", ObjectAttributes->ObjectName);
3300
3301 /* Setup the Open Packet */
3302 RtlZeroMemory(&OpenPacket, sizeof(OPEN_PACKET));
3303 OpenPacket.Type = IO_TYPE_OPEN_PACKET;
3304 OpenPacket.Size = sizeof(OPEN_PACKET);
3307 OpenPacket.Options = IO_FORCE_ACCESS_CHECK;
3308 OpenPacket.Disposition = FILE_OPEN;
3309 OpenPacket.NetworkInformation = Buffer;
3310 OpenPacket.QueryOnly = TRUE;
3311 OpenPacket.FullAttributes = TRUE;
3312 OpenPacket.LocalFileObject = &LocalFileObject;
3313
3314 /*
3315 * Attempt opening the file. This will call the I/O Parse Routine for
3316 * the File Object (IopParseDevice) which will use the dummy file obejct
3317 * send the IRP to its device object. Note that we have two statuses
3318 * to worry about: the Object Manager's status (in Status) and the I/O
3319 * status, which is in the Open Packet's Final Status, and determined
3320 * by the Parse Check member.
3321 */
3323 NULL,
3324 KernelMode,
3325 NULL,
3327 &OpenPacket,
3328 &Handle);
3329 if (OpenPacket.ParseCheck == FALSE)
3330 {
3331 /* Parse failed */
3332 IoStatus->Status = Status;
3333 }
3334 else
3335 {
3336 /* Use the Io status */
3337 IoStatus->Status = OpenPacket.FinalStatus;
3338 IoStatus->Information = OpenPacket.Information;
3339 }
3340
3341 /* Return success */
3342 return TRUE;
3343}
Definition: bufpool.h:45
#define TRUE
Definition: types.h:120
#define FILE_OPEN
Definition: from_kernel.h:54
#define FILE_OPEN_REPARSE_POINT
Definition: from_kernel.h:46
ULONG Handle
Definition: gdb_input.c:15
__in UCHAR __in POWER_STATE __in_opt PVOID __in PIO_STATUS_BLOCK IoStatus
Definition: mxum.h:159
_Must_inspect_result_ _Out_ PNDIS_STATUS _Out_ PNDIS_STATUS _Out_ PNDIS_HANDLE _Out_ PUINT _In_ UINT _In_ NDIS_HANDLE _In_ NDIS_HANDLE _In_ PNDIS_STRING _In_ UINT OpenOptions
Definition: ndis.h:6017
struct _OPEN_PACKET OPEN_PACKET
NTSTATUS NTAPI ObOpenObjectByName(IN POBJECT_ATTRIBUTES ObjectAttributes, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, IN PACCESS_STATE PassedAccessState, IN ACCESS_MASK DesiredAccess, IN OUT PVOID ParseContext, OUT PHANDLE Handle)
Definition: obhandle.c:2544
PFILE_NETWORK_OPEN_INFORMATION NetworkInformation
Definition: io.h:384
USHORT ShareAccess
Definition: io.h:378
BOOLEAN FullAttributes
Definition: io.h:390
NTSTATUS FinalStatus
Definition: io.h:370
PDUMMY_FILE_OBJECT LocalFileObject
Definition: io.h:391
CSHORT Type
Definition: io.h:367
ULONG_PTR Information
Definition: io.h:371
ULONG Disposition
Definition: io.h:382
ULONG Options
Definition: io.h:381
ULONG ParseCheck
Definition: io.h:372
CSHORT Size
Definition: io.h:368
ULONG CreateOptions
Definition: io.h:376
BOOLEAN QueryOnly
Definition: io.h:388
#define IO_FORCE_ACCESS_CHECK
Definition: iotypes.h:540
#define IO_TYPE_OPEN_PACKET

◆ IoGetFileObjectFilterContext()

PVOID NTAPI IoGetFileObjectFilterContext ( IN PFILE_OBJECT  FileObject)

Definition at line 2495 of file file.c.

2496{
2498 {
2499 PFILE_OBJECT_EXTENSION FileObjectExtension;
2500
2501 FileObjectExtension = FileObject->FileObjectExtension;
2502 return FileObjectExtension->FilterContext;
2503 }
2504
2505 return NULL;
2506}

Referenced by FsRtlInsertPerFileObjectContext(), FsRtlLookupPerFileObjectContext(), FsRtlPTeardownPerFileObjectContexts(), and FsRtlRemovePerFileObjectContext().

◆ IoGetFileObjectGenericMapping()

◆ IoIsFileOriginRemote()

BOOLEAN NTAPI IoIsFileOriginRemote ( IN PFILE_OBJECT  FileObject)

Definition at line 3277 of file file.c.

3278{
3279 /* Return the flag status */
3280 return FileObject->Flags & FO_REMOTE_ORIGIN ? TRUE : FALSE;
3281}
#define FO_REMOTE_ORIGIN
Definition: iotypes.h:1799

Referenced by CcCanIWrite().

◆ IopAcquireFileObjectLock()

NTSTATUS NTAPI IopAcquireFileObjectLock ( _In_ PFILE_OBJECT  FileObject,
_In_ KPROCESSOR_MODE  WaitMode,
_In_ BOOLEAN  Alertable,
_Out_ PBOOLEAN  LockFailed 
)

Definition at line 2449 of file file.c.

2454{
2456
2457 PAGED_CODE();
2458
2460
2462 do
2463 {
2465 {
2466 break;
2467 }
2469 Executive,
2470 WaitMode,
2471 Alertable,
2472 NULL);
2473 } while (Status == STATUS_SUCCESS);
2474
2476 if (Status == STATUS_SUCCESS)
2477 {
2479 *LockFailed = FALSE;
2480 }
2481 else
2482 {
2483 if (!FileObject->Busy && FileObject->Waiters)
2484 {
2486 }
2487 *LockFailed = TRUE;
2488 }
2489
2490 return Status;
2491}
#define InterlockedExchange
Definition: armddk.h:54
#define InterlockedDecrement
Definition: armddk.h:52
#define KeSetEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:476
_In_ PVOID _In_ BOOLEAN Alertable
Definition: exfuncs.h:453
#define IO_NO_INCREMENT
Definition: iotypes.h:598
@ Executive
Definition: ketypes.h:467
#define ObReferenceObject
Definition: obfuncs.h:204

Referenced by IopLockFileObject().

◆ IopCheckBackupRestorePrivilege()

VOID NTAPI IopCheckBackupRestorePrivilege ( IN PACCESS_STATE  AccessState,
IN OUT PULONG  CreateOptions,
IN KPROCESSOR_MODE  PreviousMode,
IN ULONG  Disposition 
)

Definition at line 25 of file file.c.

29{
32 BOOLEAN AccessGranted, HaveBackupPriv = FALSE, CheckRestore = FALSE;
33 PAGED_CODE();
34
35 /* Don't do anything if privileges were checked already */
36 if (AccessState->Flags & SE_BACKUP_PRIVILEGES_CHECKED) return;
37
38 /* Check if the file was actually opened for backup purposes */
40 {
41 /* Set the check flag since were doing it now */
43
44 /* Set the access masks required */
55 DELETE;
56 DesiredAccess = AccessState->RemainingDesiredAccess;
57
58 /* Check if desired access was the maximum */
60 {
61 /* Then add all the access masks required */
63 }
64
65 /* Check if the file already exists */
67 {
68 /* Check if desired access has the read mask */
70 {
71 /* Setup the privilege check lookup */
72 Privileges.PrivilegeCount = 1;
74 Privileges.Privilege[0].Luid = SeBackupPrivilege;
75 Privileges.Privilege[0].Attributes = 0;
80 if (AccessGranted)
81 {
82 /* Remember that backup was allowed */
83 HaveBackupPriv = TRUE;
84
85 /* Append the privileges and update the access state */
87 AccessState->PreviouslyGrantedAccess |= (DesiredAccess & ReadAccess);
88 AccessState->RemainingDesiredAccess &= ~ReadAccess;
89 DesiredAccess &= ~ReadAccess;
90
91 /* Set backup privilege for the token */
93 }
94 }
95 }
96 else
97 {
98 /* Caller is creating the file, check restore privileges later */
99 CheckRestore = TRUE;
100 }
101
102 /* Check if caller wants write access or if it's creating a file */
103 if ((WriteAccess & DesiredAccess) || (CheckRestore))
104 {
105 /* Setup the privilege lookup and do it */
106 Privileges.PrivilegeCount = 1;
108 Privileges.Privilege[0].Luid = SeRestorePrivilege;
109 Privileges.Privilege[0].Attributes = 0;
111 &AccessState->SubjectSecurityContext,
113 if (AccessGranted)
114 {
115 /* Remember that privilege was given */
116 HaveBackupPriv = TRUE;
117
118 /* Append the privileges and update the access state */
120 AccessState->PreviouslyGrantedAccess |= (DesiredAccess & WriteAccess);
121 AccessState->RemainingDesiredAccess &= ~WriteAccess;
122
123 /* Set restore privilege for the token */
125 }
126 }
127
128 /* If we don't have the privilege, remove the option */
129 if (!HaveBackupPriv) *CreateOptions &= ~FILE_OPEN_FOR_BACKUP_INTENT;
130 }
131}
_In_ PVOID _In_ ULONG _Out_ PVOID _In_ ULONG _Inout_ PULONG _In_ KPROCESSOR_MODE PreviousMode
#define FILE_OPEN_FOR_BACKUP_INTENT
Definition: from_kernel.h:42
#define WRITE_DAC
Definition: nt_native.h:59
#define ACCESS_SYSTEM_SECURITY
Definition: nt_native.h:77
ULONG ACCESS_MASK
Definition: nt_native.h:40
#define FILE_TRAVERSE
Definition: nt_native.h:643
#define READ_CONTROL
Definition: nt_native.h:58
#define WRITE_OWNER
Definition: nt_native.h:60
#define FILE_ADD_SUBDIRECTORY
Definition: nt_native.h:635
#define FILE_ADD_FILE
Definition: nt_native.h:632
#define FILE_GENERIC_READ
Definition: nt_native.h:653
#define MAXIMUM_ALLOWED
Definition: nt_native.h:83
#define FILE_GENERIC_WRITE
Definition: nt_native.h:660
const LUID SeBackupPrivilege
Definition: priv.c:36
const LUID SeRestorePrivilege
Definition: priv.c:37
BOOLEAN NTAPI SePrivilegeCheck(_In_ PPRIVILEGE_SET Privileges, _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext, _In_ KPROCESSOR_MODE PreviousMode)
Checks if a set of privileges exist and match within a security subject context.
Definition: priv.c:698
NTSTATUS NTAPI SeAppendPrivileges(_Inout_ PACCESS_STATE AccessState, _In_ PPRIVILEGE_SET Privileges)
Appends additional privileges.
Definition: priv.c:588
_In_ PSECURITY_SUBJECT_CONTEXT _In_ BOOLEAN _In_ ACCESS_MASK _In_ ACCESS_MASK _Outptr_opt_ PPRIVILEGE_SET * Privileges
Definition: sefuncs.h:17
_In_opt_ PVOID _In_opt_ PUNICODE_STRING _In_ PSECURITY_DESCRIPTOR _In_ PACCESS_STATE _In_ BOOLEAN _In_ BOOLEAN AccessGranted
Definition: sefuncs.h:419
_In_opt_ PVOID _In_opt_ PUNICODE_STRING _In_ PSECURITY_DESCRIPTOR _In_ PACCESS_STATE AccessState
Definition: sefuncs.h:417
_In_ PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext
Definition: sefuncs.h:13
#define TOKEN_HAS_BACKUP_PRIVILEGE
Definition: setypes.h:1191
#define TOKEN_HAS_RESTORE_PRIVILEGE
Definition: setypes.h:1192
#define PRIVILEGE_SET_ALL_NECESSARY
Definition: setypes.h:83
#define SE_BACKUP_PRIVILEGES_CHECKED
Definition: setypes.h:1199

Referenced by IopParseDevice().

◆ IopCheckDeviceAndDriver()

NTSTATUS NTAPI IopCheckDeviceAndDriver ( IN POPEN_PACKET  OpenPacket,
IN PDEVICE_OBJECT  DeviceObject 
)

Definition at line 135 of file file.c.

137{
138 /* Make sure the object is valid */
139 if ((DeviceObject->Flags & DO_DEVICE_INITIALIZING) ||
140 (IoGetDevObjExtension(DeviceObject)->ExtensionFlags &
143 {
144 /* It's initializing or unloading, so fail */
145 DPRINT1("\nYou are seeing this because the following ROS driver: %wZ\n"
146 "sucks. Please fix its AddDevice routine.\n",
147 &DeviceObject->DriverObject->DriverName);
149 }
150 else if ((DeviceObject->Flags & DO_EXCLUSIVE) &&
151 (DeviceObject->ReferenceCount) &&
152 !(OpenPacket->RelatedFileObject) &&
153 !(OpenPacket->Options & IO_ATTACH_DEVICE))
154 {
156 }
157 else
158 {
159 /* Increase reference count */
160 InterlockedIncrement(&DeviceObject->ReferenceCount);
161 return STATUS_SUCCESS;
162 }
163}
#define DPRINT1
Definition: precomp.h:8
#define DO_EXCLUSIVE
Definition: env_spec_w32.h:395
#define DO_DEVICE_INITIALIZING
Definition: env_spec_w32.h:399
#define DOE_DELETE_PENDING
Definition: iotypes.h:154
#define DOE_REMOVE_PROCESSED
Definition: iotypes.h:156
#define DOE_UNLOAD_PENDING
Definition: iotypes.h:153
#define DOE_REMOVE_PENDING
Definition: iotypes.h:155
#define IoGetDevObjExtension(DeviceObject)
Definition: io.h:128
#define STATUS_ACCESS_DENIED
Definition: udferr_usr.h:145
#define STATUS_NO_SUCH_DEVICE
Definition: udferr_usr.h:136
#define IO_ATTACH_DEVICE
Definition: iotypes.h:4433

Referenced by IopParseDevice().

◆ IopCheckTopDeviceHint()

NTSTATUS IopCheckTopDeviceHint ( IN OUT PDEVICE_OBJECT DeviceObject,
IN POPEN_PACKET  OpenPacket,
BOOLEAN  DirectOpen 
)

Definition at line 272 of file file.c.

275{
276 PDEVICE_OBJECT LocalDevice;
278
279 LocalDevice = *DeviceObject;
280
281 /* Direct open is not allowed */
282 if (DirectOpen)
283 {
285 }
286
287 /* Validate we have a file system device */
288 DeviceType = LocalDevice->DeviceType;
294 {
296 }
297
298 /* Verify the hint and if it's OK, return it */
299 if (IopVerifyDeviceObjectOnStack(LocalDevice, OpenPacket->TopDeviceObjectHint))
300 {
301 *DeviceObject = OpenPacket->TopDeviceObjectHint;
302 return STATUS_SUCCESS;
303 }
304
305 /* Failure case here */
306 /* If we thought was had come through a mount point,
307 * actually update we didn't and return the error
308 */
309 if (OpenPacket->TraversedMountPoint)
310 {
311 OpenPacket->TraversedMountPoint = FALSE;
313 }
314
315 /* Otherwise, just return the fact the hint is invalid */
317}
#define DEVICE_TYPE
Definition: guid.c:10
DeviceType
Definition: mmdrv.h:42
BOOLEAN NTAPI IopVerifyDeviceObjectOnStack(IN PDEVICE_OBJECT BaseDeviceObject, IN PDEVICE_OBJECT TopDeviceObjectHint)
Definition: device.c:696
#define STATUS_INVALID_DEVICE_OBJECT_PARAMETER
Definition: ntstatus.h:1043
#define STATUS_MOUNT_POINT_NOT_RESOLVED
Definition: ntstatus.h:1042
#define FILE_DEVICE_DISK_FILE_SYSTEM
Definition: winioctl.h:53
#define FILE_DEVICE_TAPE_FILE_SYSTEM
Definition: winioctl.h:77
#define FILE_DEVICE_CD_ROM_FILE_SYSTEM
Definition: winioctl.h:48
#define FILE_DEVICE_NETWORK_FILE_SYSTEM
Definition: winioctl.h:65
#define FILE_DEVICE_DFS_FILE_SYSTEM
Definition: winioctl.h:98

Referenced by IopParseDevice().

◆ IopCloseFile()

VOID NTAPI IopCloseFile ( IN PEPROCESS Process  OPTIONAL,
IN PVOID  ObjectBody,
IN ACCESS_MASK  GrantedAccess,
IN ULONG_PTR  HandleCount,
IN ULONG_PTR  SystemHandleCount 
)

Definition at line 2177 of file file.c.

2182{
2183 PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
2184 KEVENT Event;
2185 PIRP Irp;
2186 PIO_STACK_LOCATION StackPtr;
2189 KIRQL OldIrql;
2191 IOTRACE(IO_FILE_DEBUG, "ObjectBody: %p\n", ObjectBody);
2192
2193 /* If this isn't the last handle for the current process, quit */
2194 if (HandleCount != 1) return;
2195
2196 /* Check if the file is locked and has more then one handle opened */
2197 if ((FileObject->LockOperation) && (SystemHandleCount != 1))
2198 {
2199 /* Check if this is a direct open or not */
2201 {
2202 /* Get the attached device */
2204 }
2205 else
2206 {
2207 /* Get the FO's device */
2209 }
2210
2211 /* Check if this is a sync FO and lock it */
2213 {
2215 }
2216
2217 /* Go the FastIO path if possible, otherwise fall back to IRP */
2218 if (DeviceObject->DriverObject->FastIoDispatch == NULL ||
2219 DeviceObject->DriverObject->FastIoDispatch->FastIoUnlockAll == NULL ||
2220 !DeviceObject->DriverObject->FastIoDispatch->FastIoUnlockAll(FileObject, PsGetCurrentProcess(), &IoStatusBlock, DeviceObject))
2221 {
2222 /* Clear and set up Events */
2223 KeClearEvent(&FileObject->Event);
2225
2226 /* Allocate an IRP */
2228
2229 /* Set it up */
2230 Irp->UserEvent = &Event;
2231 Irp->UserIosb = &Irp->IoStatus;
2232 Irp->Tail.Overlay.Thread = PsGetCurrentThread();
2233 Irp->Tail.Overlay.OriginalFileObject = FileObject;
2234 Irp->RequestorMode = KernelMode;
2235 Irp->Flags = IRP_SYNCHRONOUS_API;
2236 Irp->Overlay.AsynchronousParameters.UserApcRoutine = NULL;
2238
2239 /* Set up Stack Pointer Data */
2240 StackPtr = IoGetNextIrpStackLocation(Irp);
2242 StackPtr->MinorFunction = IRP_MN_UNLOCK_ALL;
2243 StackPtr->FileObject = FileObject;
2244
2245 /* Queue the IRP */
2247
2248 /* Call the FS Driver */
2250 if (Status == STATUS_PENDING)
2251 {
2252 /* Wait for completion */
2254 }
2255
2256 /* IO will unqueue & free for us */
2257 }
2258
2259 /* Release the lock if we were holding it */
2261 {
2263 }
2264 }
2265
2266 /* Make sure this is the last handle */
2267 if (SystemHandleCount != 1) return;
2268
2269 /* Check if this is a direct open or not */
2270 if (FileObject->Flags & FO_DIRECT_DEVICE_OPEN)
2271 {
2272 /* Get the attached device */
2274 }
2275 else
2276 {
2277 /* Get the FO's device */
2279 }
2280
2281 /* Set the handle created flag */
2282 FileObject->Flags |= FO_HANDLE_CREATED;
2283
2284 /* Check if this is a sync FO and lock it */
2285 if (Process != NULL &&
2287 {
2289 }
2290
2291 /* Clear and set up Events */
2292 KeClearEvent(&FileObject->Event);
2294
2295 /* Allocate an IRP */
2297
2298 /* Set it up */
2299 Irp->UserEvent = &Event;
2300 Irp->UserIosb = &Irp->IoStatus;
2301 Irp->Tail.Overlay.Thread = PsGetCurrentThread();
2302 Irp->Tail.Overlay.OriginalFileObject = FileObject;
2303 Irp->Overlay.AsynchronousParameters.UserApcRoutine = NULL;
2305
2306 /* Set up Stack Pointer Data */
2307 StackPtr = IoGetNextIrpStackLocation(Irp);
2308 StackPtr->MajorFunction = IRP_MJ_CLEANUP;
2309 StackPtr->FileObject = FileObject;
2310
2311 /* Queue the IRP */
2313
2314 /* Update operation counts */
2316
2317 /* Call the FS Driver */
2319 if (Status == STATUS_PENDING)
2320 {
2321 /* Wait for completion */
2323 }
2324
2325 /* Unqueue the IRP */
2329
2330 /* Free the IRP */
2331 IoFreeIrp(Irp);
2332
2333 /* Release the lock if we were holding it */
2334 if (Process != NULL &&
2336 {
2338 }
2339}
#define VOID
Definition: acefi.h:82
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:223
static __inline NTSTATUS IopLockFileObject(_In_ PFILE_OBJECT FileObject, _In_ KPROCESSOR_MODE WaitMode)
Definition: io_x.h:12
static __inline VOID IopUpdateOperationCount(IN IOP_TRANSFER_TYPE Type)
Definition: io_x.h:82
static __inline VOID IopUnlockFileObject(IN PFILE_OBJECT FileObject)
Definition: io_x.h:36
@ IopOtherTransfer
Definition: io.h:262
PDEVICE_OBJECT NTAPI IoGetRelatedDeviceObject(IN PFILE_OBJECT FileObject)
Definition: device.c:1549
PDEVICE_OBJECT NTAPI IoGetAttachedDevice(PDEVICE_OBJECT DeviceObject)
Definition: device.c:1386
#define IRP_MJ_LOCK_CONTROL
Definition: rdpdr.c:53
PFILE_OBJECT FileObject
Definition: iotypes.h:3171
static ULONG HandleCount
Definition: uefidisk.c:67
#define IRP_MN_UNLOCK_ALL
Definition: iotypes.h:4415
#define FO_DIRECT_DEVICE_OPEN
Definition: iotypes.h:1787
#define FO_SYNCHRONOUS_IO
Definition: iotypes.h:1776
#define PsGetCurrentProcess
Definition: psfuncs.h:17

Referenced by IopCreateObjectTypes(), and IopDeleteFile().

◆ IopCreateFile()

NTSTATUS NTAPI IopCreateFile ( OUT PHANDLE  FileHandle,
IN ACCESS_MASK  DesiredAccess,
IN POBJECT_ATTRIBUTES  ObjectAttributes,
OUT PIO_STATUS_BLOCK  IoStatusBlock,
IN PLARGE_INTEGER AllocationSize  OPTIONAL,
IN ULONG  FileAttributes,
IN ULONG  ShareAccess,
IN ULONG  Disposition,
IN ULONG  CreateOptions,
IN PVOID EaBuffer  OPTIONAL,
IN ULONG  EaLength,
IN CREATE_FILE_TYPE  CreateFileType,
IN PVOID ExtraCreateParameters  OPTIONAL,
IN ULONG  Options,
IN ULONG  Flags,
IN PDEVICE_OBJECT DeviceObject  OPTIONAL 
)

Definition at line 2553 of file file.c.

2569{
2571 HANDLE LocalHandle = 0;
2572 LARGE_INTEGER SafeAllocationSize;
2574 PNAMED_PIPE_CREATE_PARAMETERS NamedPipeCreateParameters;
2575 POPEN_PACKET OpenPacket;
2576 ULONG EaErrorOffset;
2577 PAGED_CODE();
2578
2579 IOTRACE(IO_FILE_DEBUG, "FileName: %wZ\n", ObjectAttributes->ObjectName);
2580
2581
2582 /* Check if we have no parameter checking to do */
2584 {
2585 /* Then force kernel-mode access to avoid checks */
2587 }
2588 else
2589 {
2590 /* Otherwise, use the actual mode */
2592 }
2593
2594 /* Check if we need to do parameter checking */
2596 {
2597 /* Validate parameters */
2599 {
2600 DPRINT1("File Create 'FileAttributes' Parameter contains invalid flags!\n");
2602 }
2603
2605 {
2606 DPRINT1("File Create 'ShareAccess' Parameter contains invalid flags!\n");
2608 }
2609
2611 {
2612 DPRINT1("File Create 'Disposition' Parameter is out of range!\n");
2614 }
2615
2617 {
2618 DPRINT1("File Create 'CreateOptions' parameter contains invalid flags!\n");
2620 }
2621
2624 {
2625 DPRINT1("File Create 'CreateOptions' parameter FILE_SYNCHRONOUS_IO_* requested, but 'DesiredAccess' does not have SYNCHRONIZE!\n");
2627 }
2628
2630 {
2631 DPRINT1("File Create 'CreateOptions' parameter FILE_DELETE_ON_CLOSE requested, but 'DesiredAccess' does not have DELETE!\n");
2633 }
2634
2637 {
2638 DPRINT1("File Create 'FileAttributes' parameter both FILE_SYNCHRONOUS_IO_NONALERT and FILE_SYNCHRONOUS_IO_ALERT specified!\n");
2640 }
2641
2654 {
2655 DPRINT1("File Create 'CreateOptions' Parameter has flags incompatible with FILE_DIRECTORY_FILE!\n");
2657 }
2658
2661 {
2662 DPRINT1("File Create 'CreateOptions' Parameter FILE_DIRECTORY_FILE requested, but 'Disposition' is not FILE_CREATE/FILE_OPEN/FILE_OPEN_IF!\n");
2664 }
2665
2667 {
2668 DPRINT1("File Create 'CreateOptions' Parameter both FILE_COMPLETE_IF_OPLOCKED and FILE_RESERVE_OPFILTER specified!\n");
2670 }
2671
2673 {
2674 DPRINT1("File Create 'CreateOptions' parameter FILE_NO_INTERMEDIATE_BUFFERING requested, but 'DesiredAccess' FILE_APPEND_DATA requires it!\n");
2676 }
2677
2678 /* Now check if this is a named pipe */
2680 {
2681 /* Make sure we have extra parameters */
2682 if (!ExtraCreateParameters)
2683 {
2684 DPRINT1("Invalid parameter: ExtraCreateParameters == 0!\n");
2686 }
2687
2688 /* Get the parameters and validate them */
2689 NamedPipeCreateParameters = ExtraCreateParameters;
2690 if ((NamedPipeCreateParameters->NamedPipeType > FILE_PIPE_MESSAGE_TYPE) ||
2691 (NamedPipeCreateParameters->ReadMode > FILE_PIPE_MESSAGE_MODE) ||
2692 (NamedPipeCreateParameters->CompletionMode > FILE_PIPE_COMPLETE_OPERATION) ||
2696 {
2697 /* Invalid named pipe create */
2698 DPRINT1("Invalid named pipe create\n");
2700 }
2701 }
2703 {
2704 /* Make sure we have extra parameters */
2705 if (!ExtraCreateParameters)
2706 {
2707 DPRINT1("Invalid parameter: ExtraCreateParameters == 0!\n");
2709 }
2710
2711 /* Get the parameters and validate them */
2714 (Disposition != FILE_CREATE) ||
2716 {
2717 /* Invalid mailslot create */
2718 DPRINT1("Invalid mailslot create\n");
2720 }
2721 }
2722 }
2723
2724 /* Allocate the open packet */
2725 OpenPacket = ExAllocatePoolWithTag(NonPagedPool, sizeof(*OpenPacket), 'pOoI');
2726 if (!OpenPacket) return STATUS_INSUFFICIENT_RESOURCES;
2727 RtlZeroMemory(OpenPacket, sizeof(*OpenPacket));
2728
2729 /* Check if the call came from user mode */
2730 if (AccessMode != KernelMode)
2731 {
2732 _SEH2_TRY
2733 {
2734 /* Probe the output parameters */
2737
2738 /* Probe the allocation size if one was passed in */
2739 if (AllocationSize)
2740 {
2741 SafeAllocationSize = ProbeForReadLargeInteger(AllocationSize);
2742 }
2743 else
2744 {
2745 SafeAllocationSize.QuadPart = 0;
2746 }
2747
2748 /* Make sure it's valid */
2749 if (SafeAllocationSize.QuadPart < 0)
2750 {
2752 }
2753
2754 /* Check if EA was passed in */
2755 if ((EaBuffer) && (EaLength))
2756 {
2757 /* Probe it */
2759
2760 /* And marshall it */
2762 EaLength,
2763 TAG_EA);
2764 OpenPacket->EaLength = EaLength;
2765 RtlCopyMemory(OpenPacket->EaBuffer, EaBuffer, EaLength);
2766
2767 /* Validate the buffer */
2769 EaLength,
2770 &EaErrorOffset);
2771 if (!NT_SUCCESS(Status))
2772 {
2773 /* Undo everything if it's invalid */
2774 DPRINT1("Invalid EA buffer\n");
2776 IoStatusBlock->Information = EaErrorOffset;
2778 }
2779 }
2780 }
2782 {
2783 /* Return the exception code */
2784 if (OpenPacket->EaBuffer != NULL) ExFreePool(OpenPacket->EaBuffer);
2785 ExFreePool(OpenPacket);
2787 }
2788 _SEH2_END;
2789 }
2790 else
2791 {
2792 /* Check if this is a device attach */
2794 {
2795 /* Set the flag properly */
2797 CreateOptions &= ~IO_ATTACH_DEVICE_API;
2798 }
2799
2800 /* Check if we have allocation size */
2801 if (AllocationSize)
2802 {
2803 /* Capture it */
2804 SafeAllocationSize = *AllocationSize;
2805 }
2806 else
2807 {
2808 /* Otherwise, no size */
2809 SafeAllocationSize.QuadPart = 0;
2810 }
2811
2812 /* Check if we have an EA packet */
2813 if ((EaBuffer) && (EaLength))
2814 {
2815 /* Allocate the kernel copy */
2817 EaLength,
2818 TAG_EA);
2819 if (!OpenPacket->EaBuffer)
2820 {
2821 ExFreePool(OpenPacket);
2822 DPRINT1("Failed to allocate open packet EA buffer\n");
2824 }
2825
2826 /* Copy the data */
2827 OpenPacket->EaLength = EaLength;
2828 RtlCopyMemory(OpenPacket->EaBuffer, EaBuffer, EaLength);
2829
2830 /* Validate the buffer */
2832 EaLength,
2833 &EaErrorOffset);
2834 if (!NT_SUCCESS(Status))
2835 {
2836 /* Undo everything if it's invalid */
2837 DPRINT1("Invalid EA buffer\n");
2838 ExFreePool(OpenPacket->EaBuffer);
2840 IoStatusBlock->Information = EaErrorOffset;
2841 ExFreePool(OpenPacket);
2842 return Status;
2843 }
2844 }
2845 }
2846
2847 /* Setup the Open Packet */
2848 OpenPacket->Type = IO_TYPE_OPEN_PACKET;
2849 OpenPacket->Size = sizeof(*OpenPacket);
2850 OpenPacket->AllocationSize = SafeAllocationSize;
2851 OpenPacket->CreateOptions = CreateOptions;
2852 OpenPacket->FileAttributes = (USHORT)FileAttributes;
2853 OpenPacket->ShareAccess = (USHORT)ShareAccess;
2854 OpenPacket->Options = Options;
2855 OpenPacket->Disposition = Disposition;
2856 OpenPacket->CreateFileType = CreateFileType;
2857 OpenPacket->ExtraCreateParameters = ExtraCreateParameters;
2858 OpenPacket->InternalFlags = Flags;
2859 OpenPacket->TopDeviceObjectHint = DeviceObject;
2860
2861 /* Update the operation count */
2863
2864 /*
2865 * Attempt opening the file. This will call the I/O Parse Routine for
2866 * the File Object (IopParseDevice) which will create the object and
2867 * send the IRP to its device object. Note that we have two statuses
2868 * to worry about: the Object Manager's status (in Status) and the I/O
2869 * status, which is in the Open Packet's Final Status, and determined
2870 * by the Parse Check member.
2871 */
2873 NULL,
2874 AccessMode,
2875 NULL,
2877 OpenPacket,
2878 &LocalHandle);
2879
2880 /* Free the EA Buffer */
2881 if (OpenPacket->EaBuffer) ExFreePool(OpenPacket->EaBuffer);
2882
2883 /* Now check for Ob or Io failure */
2884 if (!(NT_SUCCESS(Status)) || (OpenPacket->ParseCheck == FALSE))
2885 {
2886 /* Check if Ob thinks well went well */
2887 if (NT_SUCCESS(Status))
2888 {
2889 /*
2890 * Tell it otherwise. Because we didn't use an ObjectType,
2891 * it incorrectly returned us a handle to God knows what.
2892 */
2895 }
2896
2897 /* Now check the Io status */
2898 if (!NT_SUCCESS(OpenPacket->FinalStatus))
2899 {
2900 /* Use this status instead of Ob's */
2901 Status = OpenPacket->FinalStatus;
2902
2903 /* Check if it was only a warning */
2904 if (NT_WARNING(Status))
2905 {
2906 /* Protect write with SEH */
2907 _SEH2_TRY
2908 {
2909 /* In this case, we copy the I/O Status back */
2910 IoStatusBlock->Information = OpenPacket->Information;
2911 IoStatusBlock->Status = OpenPacket->FinalStatus;
2912 }
2914 {
2915 /* Get exception code */
2917 }
2918 _SEH2_END;
2919 }
2920 }
2921 else if ((OpenPacket->FileObject) && (OpenPacket->ParseCheck == FALSE))
2922 {
2923 /*
2924 * This can happen in the very bizarre case where the parse routine
2925 * actually executed more then once (due to a reparse) and ended
2926 * up failing after already having created the File Object.
2927 */
2928 if (OpenPacket->FileObject->FileName.Length)
2929 {
2930 /* It had a name, free it */
2931 ExFreePoolWithTag(OpenPacket->FileObject->FileName.Buffer, TAG_IO_NAME);
2932 }
2933
2934 /* Clear the device object to invalidate the FO, and dereference */
2935 OpenPacket->FileObject->DeviceObject = NULL;
2936 ObDereferenceObject(OpenPacket->FileObject);
2937 }
2938 }
2939 else
2940 {
2941 /* We reached success and have a valid file handle */
2942 OpenPacket->FileObject->Flags |= FO_HANDLE_CREATED;
2943 ASSERT(OpenPacket->FileObject->Type == IO_TYPE_FILE);
2944
2945 /* Enter SEH for write back */
2946 _SEH2_TRY
2947 {
2948 /* Write back the handle and I/O Status */
2950 IoStatusBlock->Information = OpenPacket->Information;
2951 IoStatusBlock->Status = OpenPacket->FinalStatus;
2952
2953 /* Get the Io status */
2954 Status = OpenPacket->FinalStatus;
2955 }
2957 {
2958 /* Get the exception status */
2960 }
2961 _SEH2_END;
2962 }
2963
2964 /* Check if we were 100% successful */
2965 if ((OpenPacket->ParseCheck != FALSE) && (OpenPacket->FileObject))
2966 {
2967 /* Dereference the File Object */
2968 ObDereferenceObject(OpenPacket->FileObject);
2969 }
2970
2971 /* Return status */
2972 ExFreePool(OpenPacket);
2973 return Status;
2974}
#define FILE_DIRECTORY_FILE
Definition: constants.h:491
#define FILE_NON_DIRECTORY_FILE
Definition: constants.h:492
#define FILE_OPEN_FOR_FREE_SPACE_QUERY
Definition: constants.h:495
#define FILE_COMPLETE_IF_OPLOCKED
Definition: constants.h:493
#define FILE_DELETE_ON_CLOSE
Definition: constants.h:494
#define STATUS_OBJECT_TYPE_MISMATCH
Definition: d3dkmdt.h:46
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define ExFreePool(addr)
Definition: env_spec_w32.h:352
#define NonPagedPool
Definition: env_spec_w32.h:307
#define ExGetPreviousMode
Definition: ex.h:143
VOID NTAPI ProbeForRead(IN CONST VOID *Address, IN SIZE_T Length, IN ULONG Alignment)
Definition: exintrin.c:102
#define FILE_OPEN_BY_FILE_ID
Definition: from_kernel.h:41
#define FILE_MAXIMUM_DISPOSITION
Definition: from_kernel.h:59
#define FILE_NO_COMPRESSION
Definition: from_kernel.h:43
#define FILE_CREATE
Definition: from_kernel.h:55
#define FILE_RESERVE_OPFILTER
Definition: from_kernel.h:45
#define FILE_SYNCHRONOUS_IO_NONALERT
Definition: from_kernel.h:31
#define FILE_NO_INTERMEDIATE_BUFFERING
Definition: from_kernel.h:28
#define FILE_WRITE_THROUGH
Definition: from_kernel.h:26
#define FILE_OPEN_IF
Definition: from_kernel.h:56
#define FILE_SYNCHRONOUS_IO_ALERT
Definition: from_kernel.h:30
HLOCAL NTAPI LocalHandle(LPCVOID pMem)
Definition: heapmem.c:1605
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
#define FILE_PIPE_MESSAGE_TYPE
Definition: iotypes.h:80
#define IO_ATTACH_DEVICE_API
Definition: iotypes.h:223
#define FILE_PIPE_COMPLETE_OPERATION
Definition: iotypes.h:84
#define FILE_PIPE_MESSAGE_MODE
Definition: iotypes.h:82
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
DECLSPEC_NORETURN NTSYSAPI VOID NTAPI RtlRaiseStatus(_In_ NTSTATUS Status)
#define SYNCHRONIZE
Definition: nt_native.h:61
#define FILE_ATTRIBUTE_VALID_FLAGS
Definition: nt_native.h:714
#define FILE_VALID_PIPE_OPTION_FLAGS
Definition: nt_native.h:760
#define FILE_SHARE_VALID_FLAGS
Definition: nt_native.h:683
#define FILE_VALID_OPTION_FLAGS
Definition: nt_native.h:759
#define FILE_VALID_MAILSLOT_OPTION_FLAGS
Definition: nt_native.h:761
NTSTATUS NTAPI IoCheckEaBufferValidity(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: util.c:191
unsigned short USHORT
Definition: pedump.c:61
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:204
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:104
#define _SEH2_END
Definition: pseh2_64.h:194
#define _SEH2_TRY
Definition: pseh2_64.h:93
#define _SEH2_YIELD(__stmt)
Definition: pseh2_64.h:207
#define ProbeForWriteHandle(Ptr)
Definition: probe.h:43
#define ProbeForWriteIoStatusBlock(Ptr)
Definition: probe.h:52
#define ProbeForReadLargeInteger(Ptr)
Definition: probe.h:75
LARGE_INTEGER AllocationSize
Definition: io.h:375
USHORT FileAttributes
Definition: io.h:377
PVOID ExtraCreateParameters
Definition: io.h:386
CREATE_FILE_TYPE CreateFileType
Definition: io.h:385
ULONG InternalFlags
Definition: io.h:393
PDEVICE_OBJECT TopDeviceObjectHint
Definition: io.h:394
PFILE_OBJECT FileObject
Definition: io.h:369
PVOID EaBuffer
Definition: io.h:379
ULONG EaLength
Definition: io.h:380
#define TAG_EA
Definition: tag.h:81
#define TAG_IO_NAME
Definition: tag.h:82
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define NT_WARNING(Status)
Definition: umtypes.h:105
LONGLONG QuadPart
Definition: typedefs.h:114
#define IO_CHECK_CREATE_PARAMETERS
Definition: iotypes.h:4432
@ CreateFileTypeNamedPipe
Definition: iotypes.h:536
@ CreateFileTypeMailslot
Definition: iotypes.h:537
CCHAR KPROCESSOR_MODE
Definition: ketypes.h:7
_In_ PEPROCESS _In_ KPROCESSOR_MODE AccessMode
Definition: mmfuncs.h:396

Referenced by IoCreateFile(), and IoCreateFileSpecifyDeviceObjectHint().

◆ IopDeleteFile()

VOID NTAPI IopDeleteFile ( IN PVOID  ObjectBody)

Definition at line 1352 of file file.c.

1353{
1354 PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
1355 PIRP Irp;
1356 PIO_STACK_LOCATION StackPtr;
1358 KEVENT Event;
1360 BOOLEAN DereferenceDone = FALSE;
1361 PVPB Vpb;
1362 KIRQL OldIrql;
1363 IOTRACE(IO_FILE_DEBUG, "ObjectBody: %p\n", ObjectBody);
1364
1365 /* Check if the file has a device object */
1366 if (FileObject->DeviceObject)
1367 {
1368 /* Check if this is a direct open or not */
1369 if (FileObject->Flags & FO_DIRECT_DEVICE_OPEN)
1370 {
1371 /* Get the attached device */
1373 }
1374 else
1375 {
1376 /* Use the file object's device object */
1378 }
1379
1380 /* Sanity check */
1381 ASSERT(!(FileObject->Flags & FO_SYNCHRONOUS_IO) ||
1383
1384 /* Check if the handle wasn't created yet */
1385 if (!(FileObject->Flags & FO_HANDLE_CREATED))
1386 {
1387 /* Send the cleanup IRP */
1388 IopCloseFile(NULL, ObjectBody, 0, 1, 1);
1389 }
1390
1391 /* Clear and set up Events */
1392 KeClearEvent(&FileObject->Event);
1394
1395 /* Allocate an IRP */
1397
1398 /* Set it up */
1399 Irp->UserEvent = &Event;
1400 Irp->UserIosb = &Irp->IoStatus;
1401 Irp->Tail.Overlay.Thread = PsGetCurrentThread();
1402 Irp->Tail.Overlay.OriginalFileObject = FileObject;
1404
1405 /* Set up Stack Pointer Data */
1406 StackPtr = IoGetNextIrpStackLocation(Irp);
1407 StackPtr->MajorFunction = IRP_MJ_CLOSE;
1408 StackPtr->FileObject = FileObject;
1409
1410 /* Queue the IRP */
1412
1413 /* Get the VPB and check if this isn't a direct open */
1414 Vpb = FileObject->Vpb;
1415 if ((Vpb) && !(FileObject->Flags & FO_DIRECT_DEVICE_OPEN))
1416 {
1417 /* Dereference the VPB before the close */
1418 InterlockedDecrement((PLONG)&Vpb->ReferenceCount);
1419 }
1420
1421 /* Check if the FS will never disappear by itself */
1422 if (FileObject->DeviceObject->Flags & DO_NEVER_LAST_DEVICE)
1423 {
1424 /* Dereference it */
1425 InterlockedDecrement(&FileObject->DeviceObject->ReferenceCount);
1426 DereferenceDone = TRUE;
1427 }
1428
1429 /* Call the FS Driver */
1431 if (Status == STATUS_PENDING)
1432 {
1433 /* Wait for completion */
1435 }
1436
1437 /* De-queue the IRP */
1441
1442 /* Free the IRP */
1443 IoFreeIrp(Irp);
1444
1445 /* Clear the file name */
1446 if (FileObject->FileName.Buffer)
1447 {
1448 /*
1449 * Don't use TAG_IO_NAME since the FileObject's FileName
1450 * may have been re-allocated using a different tag
1451 * by a filesystem.
1452 */
1453 ExFreePoolWithTag(FileObject->FileName.Buffer, 0);
1454 FileObject->FileName.Buffer = NULL;
1455 }
1456
1457 /* Check if the FO had a completion port */
1458 if (FileObject->CompletionContext)
1459 {
1460 /* Free it */
1461 ObDereferenceObject(FileObject->CompletionContext->Port);
1462 ExFreePool(FileObject->CompletionContext);
1463 }
1464
1465 /* Check if the FO had extension */
1467 {
1468 /* Release filter context structure if any */
1470 }
1471
1472 /* Check if dereference has been done yet */
1473 if (!DereferenceDone)
1474 {
1475 /* Dereference device object */
1477 }
1478 }
1479}
#define DO_NEVER_LAST_DEVICE
Definition: env_spec_w32.h:402
IN OUT PVCB IN PDEVICE_OBJECT IN PVPB Vpb
Definition: fatprocs.h:1676
VOID NTAPI FsRtlPTeardownPerFileObjectContexts(IN PFILE_OBJECT FileObject)
Definition: filtrctx.c:28
VOID NTAPI IopCloseFile(IN PEPROCESS Process OPTIONAL, IN PVOID ObjectBody, IN ACCESS_MASK GrantedAccess, IN ULONG_PTR HandleCount, IN ULONG_PTR SystemHandleCount)
Definition: file.c:2177
#define IRP_MJ_CLOSE
Definition: rdpdr.c:45
PVPB Vpb
Definition: cdstruc.h:511
Definition: iotypes.h:189

Referenced by IopCreateObjectTypes(), and IopParseDevice().

◆ IopDoNameTransmogrify()

VOID NTAPI IopDoNameTransmogrify ( IN PIRP  Irp,
IN PFILE_OBJECT  FileObject,
IN PREPARSE_DATA_BUFFER  DataBuffer 
)

Definition at line 167 of file file.c.

170{
174 PWSTR NewBuffer;
175
176 PAGED_CODE();
177
178 ASSERT(Irp->IoStatus.Status == STATUS_REPARSE);
179 ASSERT(Irp->IoStatus.Information == IO_REPARSE_TAG_MOUNT_POINT);
180 ASSERT(Irp->Tail.Overlay.AuxiliaryBuffer != NULL);
181 ASSERT(DataBuffer != NULL);
182 ASSERT(DataBuffer->ReparseTag == IO_REPARSE_TAG_MOUNT_POINT);
183 ASSERT(DataBuffer->ReparseDataLength < MAXIMUM_REPARSE_DATA_BUFFER_SIZE);
184 ASSERT(DataBuffer->Reserved < MAXIMUM_REPARSE_DATA_BUFFER_SIZE);
185
186 /* First of all, validate data */
187 if (DataBuffer->ReparseDataLength < REPARSE_DATA_BUFFER_HEADER_SIZE ||
188 (DataBuffer->SymbolicLinkReparseBuffer.PrintNameLength +
189 DataBuffer->SymbolicLinkReparseBuffer.SubstituteNameLength +
191 {
192 Irp->IoStatus.Status = STATUS_IO_REPARSE_DATA_INVALID;
193 }
194
195 /* Everything went right */
196 if (NT_SUCCESS(Irp->IoStatus.Status))
197 {
198 /* Compute buffer & length */
199 Buffer = (PWSTR)((ULONG_PTR)DataBuffer->MountPointReparseBuffer.PathBuffer +
200 DataBuffer->MountPointReparseBuffer.SubstituteNameOffset);
201 Length = DataBuffer->MountPointReparseBuffer.SubstituteNameLength;
202
203 /* Check we don't overflow */
204 if (((ULONG)MAXUSHORT - DataBuffer->Reserved) <= (Length + sizeof(UNICODE_NULL)))
205 {
206 Irp->IoStatus.Status = STATUS_IO_REPARSE_DATA_INVALID;
207 }
208 else
209 {
210 /* Compute how much memory we'll need */
211 RequiredLength = DataBuffer->Reserved + Length + sizeof(UNICODE_NULL);
212
213 /* Check if FileObject can already hold what we need */
214 if (FileObject->FileName.MaximumLength >= RequiredLength)
215 {
216 NewBuffer = FileObject->FileName.Buffer;
217 }
218 else
219 {
220 /* Allocate otherwise */
222 if (NewBuffer == NULL)
223 {
224 Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
225 }
226 }
227 }
228 }
229
230 /* Everything went right */
231 if (NT_SUCCESS(Irp->IoStatus.Status))
232 {
233 /* Copy the reserved data */
234 if (DataBuffer->Reserved)
235 {
236 RtlMoveMemory((PWSTR)((ULONG_PTR)NewBuffer + Length),
237 (PWSTR)((ULONG_PTR)FileObject->FileName.Buffer + FileObject->FileName.Length - DataBuffer->Reserved),
238 DataBuffer->Reserved);
239 }
240
241 /* Then the buffer */
242 if (Length)
243 {
244 RtlCopyMemory(NewBuffer, Buffer, Length);
245 }
246
247 /* And finally replace buffer if new one was allocated */
248 FileObject->FileName.Length = RequiredLength - sizeof(UNICODE_NULL);
249 if (NewBuffer != FileObject->FileName.Buffer)
250 {
251 if (FileObject->FileName.Buffer)
252 {
253 /*
254 * Don't use TAG_IO_NAME since the FileObject's FileName
255 * may have been re-allocated using a different tag
256 * by a filesystem.
257 */
258 ExFreePoolWithTag(FileObject->FileName.Buffer, 0);
259 }
260
261 FileObject->FileName.Buffer = NewBuffer;
262 FileObject->FileName.MaximumLength = RequiredLength;
263 FileObject->FileName.Buffer[RequiredLength / sizeof(WCHAR) - 1] = UNICODE_NULL;
264 }
265 }
266
267 /* We don't need them anymore - it was allocated by the driver */
268 ExFreePool(DataBuffer);
269}
#define PagedPool
Definition: env_spec_w32.h:308
#define REPARSE_DATA_BUFFER_HEADER_SIZE
Definition: vista.c:17
#define UNICODE_NULL
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
#define STATUS_REPARSE
Definition: ntstatus.h:136
#define STATUS_IO_REPARSE_DATA_INVALID
Definition: ntstatus.h:878
short WCHAR
Definition: pedump.c:58
WCHAR PathBuffer[1]
Definition: shellext.h:176
uint16_t * PWSTR
Definition: typedefs.h:56
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define MAXUSHORT
Definition: typedefs.h:83
#define RtlMoveMemory(Destination, Source, Length)
Definition: typedefs.h:264
_In_ ULONG _Out_opt_ PULONG RequiredLength
Definition: wmifuncs.h:30
#define MAXIMUM_REPARSE_DATA_BUFFER_SIZE
Definition: iotypes.h:7216
#define IO_REPARSE_TAG_MOUNT_POINT
Definition: iotypes.h:7234

Referenced by IopCompleteRequest(), and IopParseDevice().

◆ IopGetDeviceAttachmentBase()

PDEVICE_OBJECT NTAPI IopGetDeviceAttachmentBase ( IN PDEVICE_OBJECT  DeviceObject)

Definition at line 1483 of file file.c.

1484{
1486
1487 /* Go down the stack to attempt to get the PDO */
1488 while (IoGetDevObjExtension(PDO)->AttachedTo != NULL)
1489 PDO = IoGetDevObjExtension(PDO)->AttachedTo;
1490
1491 return PDO;
1492}

Referenced by IopGetDevicePDO(), and IopVerifyDriverObjectOnStack().

◆ IopGetDevicePDO()

PDEVICE_OBJECT NTAPI IopGetDevicePDO ( IN PDEVICE_OBJECT  DeviceObject)

Definition at line 1496 of file file.c.

1497{
1498 KIRQL OldIrql;
1499 PDEVICE_OBJECT PDO;
1500
1502
1504 /* Get the base DO */
1506 /* Check whether that's really a PDO and if so, keep it */
1508 {
1509 PDO = NULL;
1510 }
1511 else
1512 {
1513 ObReferenceObject(PDO);
1514 }
1516
1517 return PDO;
1518}
VOID FASTCALL KeReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, IN KIRQL OldIrql)
Definition: spinlock.c:154
KIRQL FASTCALL KeAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber)
Definition: spinlock.c:108
PDEVICE_OBJECT NTAPI IopGetDeviceAttachmentBase(IN PDEVICE_OBJECT DeviceObject)
Definition: file.c:1483
#define DO_BUS_ENUMERATED_DEVICE
@ LockQueueIoDatabaseLock
Definition: ketypes.h:736

Referenced by IopGetSetSecurityObject().

◆ IopGetSetSecurityObject()

NTSTATUS NTAPI IopGetSetSecurityObject ( IN PVOID  ObjectBody,
IN SECURITY_OPERATION_CODE  OperationCode,
IN PSECURITY_INFORMATION  SecurityInformation,
IN PSECURITY_DESCRIPTOR  SecurityDescriptor,
IN OUT PULONG  BufferLength,
IN OUT PSECURITY_DESCRIPTOR OldSecurityDescriptor,
IN POOL_TYPE  PoolType,
IN OUT PGENERIC_MAPPING  GenericMapping,
IN KPROCESSOR_MODE  AccessMode 
)

Definition at line 1651 of file file.c.

1660{
1662 PIO_STACK_LOCATION StackPtr;
1665 PIRP Irp;
1666 BOOLEAN LocalEvent = FALSE;
1667 KEVENT Event;
1669 PAGED_CODE();
1670 IOTRACE(IO_FILE_DEBUG, "ObjectBody: %p\n", ObjectBody);
1671
1672 /* Check if this is a device or file */
1673 if (((PFILE_OBJECT)ObjectBody)->Type == IO_TYPE_DEVICE)
1674 {
1675 /* It's a device */
1676 DeviceObject = (PDEVICE_OBJECT)ObjectBody;
1677 FileObject = NULL;
1678 }
1679 else
1680 {
1681 /* It's a file */
1682 FileObject = (PFILE_OBJECT)ObjectBody;
1683
1684 /* Check if this is a direct open */
1685 if (FileObject->Flags & FO_DIRECT_DEVICE_OPEN)
1686 {
1687 /* Get the Device Object */
1689 }
1690 else
1691 {
1692 /* Otherwise, use the direct device*/
1693 DeviceObject = FileObject->DeviceObject;
1694 }
1695 }
1696
1697 /* Check if the request was for a device object */
1698 if (!(FileObject) ||
1699 (!(FileObject->FileName.Length) && !(FileObject->RelatedFileObject)) ||
1701 {
1702 /* Check what kind of request this was */
1703 if (OperationCode == QuerySecurityDescriptor)
1704 {
1708 &DeviceObject->SecurityDescriptor);
1709 }
1710 else if (OperationCode == DeleteSecurityDescriptor)
1711 {
1712 /* Simply return success */
1713 return STATUS_SUCCESS;
1714 }
1715 else if (OperationCode == AssignSecurityDescriptor)
1716 {
1718
1719 /* Make absolutely sure this is a device object */
1720 if (!(FileObject) || !(FileObject->Flags & FO_STREAM_FILE))
1721 {
1722 PSECURITY_DESCRIPTOR CachedSecurityDescriptor;
1723
1724 /* Add the security descriptor in cache */
1725 Status = ObLogSecurityDescriptor(SecurityDescriptor, &CachedSecurityDescriptor, 1);
1726 if (NT_SUCCESS(Status))
1727 {
1730
1731 /* Assign the Security Descriptor */
1732 DeviceObject->SecurityDescriptor = CachedSecurityDescriptor;
1733
1736 }
1737 }
1738
1739 /* Return status */
1740 return Status;
1741 }
1742 else if (OperationCode == SetSecurityDescriptor)
1743 {
1744 /* Get the Physical Device Object if any */
1746
1747 if (PDO != NULL)
1748 {
1749 /* Apply the new SD to any DO in the path from PDO to current DO */
1755 }
1756 else
1757 {
1758 /* Otherwise, just set for ourselves */
1763 }
1764
1765 return STATUS_SUCCESS;
1766 }
1767
1768 /* Shouldn't happen */
1769 return STATUS_SUCCESS;
1770 }
1771 else if (OperationCode == DeleteSecurityDescriptor)
1772 {
1773 /* Same as for devices, do nothing */
1774 return STATUS_SUCCESS;
1775 }
1776
1777 /* At this point, we know we're a file. Reference it */
1779
1780 /* Check if we should use Sync IO or not */
1781 if (FileObject->Flags & FO_SYNCHRONOUS_IO)
1782 {
1783 /* Lock the file object */
1785 if (Status != STATUS_SUCCESS)
1786 {
1788 return Status;
1789 }
1790 }
1791 else
1792 {
1793 /* Use local event */
1795 LocalEvent = TRUE;
1796 }
1797
1798 /* Clear the File Object event */
1799 KeClearEvent(&FileObject->Event);
1800
1801 /* Get the device object */
1803
1804 /* Allocate the IRP */
1805 Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
1806 if (!Irp) return IopCleanupFailedIrp(FileObject, NULL, NULL);
1807
1808 /* Set the IRP */
1809 Irp->Tail.Overlay.OriginalFileObject = FileObject;
1810 Irp->Tail.Overlay.Thread = PsGetCurrentThread();
1811 Irp->RequestorMode = ExGetPreviousMode();
1812 Irp->UserIosb = &IoStatusBlock;
1813 Irp->UserEvent = (LocalEvent) ? &Event : NULL;
1814 Irp->Flags = (LocalEvent) ? IRP_SYNCHRONOUS_API : 0;
1815 Irp->Overlay.AsynchronousParameters.UserApcRoutine = NULL;
1816
1817 /* Set Stack Parameters */
1818 StackPtr = IoGetNextIrpStackLocation(Irp);
1819 StackPtr->FileObject = FileObject;
1820
1821 /* Check if this is a query or set */
1822 if (OperationCode == QuerySecurityDescriptor)
1823 {
1824 /* Set the major function and parameters */
1826 StackPtr->Parameters.QuerySecurity.SecurityInformation =
1828 StackPtr->Parameters.QuerySecurity.Length = *BufferLength;
1829 Irp->UserBuffer = SecurityDescriptor;
1830 }
1831 else
1832 {
1833 /* Set the major function and parameters for a set */
1835 StackPtr->Parameters.SetSecurity.SecurityInformation =
1837 StackPtr->Parameters.SetSecurity.SecurityDescriptor =
1839 }
1840
1841 /* Queue the IRP */
1843
1844 /* Update operation counts */
1846
1847 /* Call the Driver */
1849
1850 /* Check if this was async I/O */
1851 if (LocalEvent)
1852 {
1853 /* Check if the IRP is pending completion */
1854 if (Status == STATUS_PENDING)
1855 {
1856 /* Wait on the local event */
1858 Executive,
1859 KernelMode,
1860 FALSE,
1861 NULL);
1863 }
1864 }
1865 else
1866 {
1867 /* Check if the IRP is pending completion */
1868 if (Status == STATUS_PENDING)
1869 {
1870 /* Wait on the file object */
1872 Executive,
1873 KernelMode,
1874 FALSE,
1875 NULL);
1876 Status = FileObject->FinalStatus;
1877 }
1878
1879 /* Release the lock */
1881 }
1882
1883 /* This Driver doesn't implement Security, so try to give it a default */
1885 {
1886 /* Was this a query? */
1887 if (OperationCode == QuerySecurityDescriptor)
1888 {
1889 /* Set a World Security Descriptor */
1892 BufferLength);
1893 }
1894 else
1895 {
1896 /* It wasn't a query, so just fake success */
1898 }
1899 }
1900 else if (OperationCode == QuerySecurityDescriptor)
1901 {
1902 /* Callers usually expect the normalized form */
1904
1905 _SEH2_TRY
1906 {
1907 /* Return length */
1909 }
1911 {
1912 /* Get the exception code */
1914 }
1915 _SEH2_END;
1916 }
1917
1918 /* Return Status */
1919 return Status;
1920}
static GENERIC_MAPPING GenericMapping
Definition: SeInheritance.c:11
Type
Definition: Type.h:7
struct _DEVICE_OBJECT * PDEVICE_OBJECT
#define ExAcquireResourceExclusiveLite(res, wait)
Definition: env_spec_w32.h:615
_Must_inspect_result_ _In_ PFILE_OBJECT _In_ SECURITY_INFORMATION SecurityInformation
Definition: fltkernel.h:1340
#define KeLeaveCriticalRegion()
Definition: ke_x.h:119
#define KeEnterCriticalRegion()
Definition: ke_x.h:88
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
Definition: resource.c:1822
NTSTATUS NTAPI IopCleanupFailedIrp(IN PFILE_OBJECT FileObject, IN PKEVENT EventObject, IN PVOID Buffer OPTIONAL)
Definition: irp.c:45
NTSTATUS NTAPI SeSetWorldSecurityDescriptor(_In_ SECURITY_INFORMATION SecurityInformation, _In_ PISECURITY_DESCRIPTOR SecurityDescriptor, _In_ PULONG BufferLength)
Sets a "World" security descriptor.
Definition: sd.c:155
NTSTATUS NTAPI IopSetDeviceSecurityDescriptor(IN PDEVICE_OBJECT DeviceObject, IN PSECURITY_INFORMATION SecurityInformation, IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN POOL_TYPE PoolType, IN PGENERIC_MAPPING GenericMapping)
Definition: file.c:1522
ERESOURCE IopSecurityResource
Definition: iomgr.c:61
PDEVICE_OBJECT NTAPI IopGetDevicePDO(IN PDEVICE_OBJECT DeviceObject)
Definition: file.c:1496
NTSTATUS NTAPI IopSetDeviceSecurityDescriptors(IN PDEVICE_OBJECT UpperDeviceObject, IN PDEVICE_OBJECT PhysicalDeviceObject, IN PSECURITY_INFORMATION SecurityInformation, IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN POOL_TYPE PoolType, IN PGENERIC_MAPPING GenericMapping)
Definition: file.c:1603
PIRP NTAPI IoAllocateIrp(IN CCHAR StackSize, IN BOOLEAN ChargeQuota)
Definition: irp.c:647
NTSTATUS NTAPI ObLogSecurityDescriptor(IN PSECURITY_DESCRIPTOR InputSecurityDescriptor, OUT PSECURITY_DESCRIPTOR *OutputSecurityDescriptor, IN ULONG RefBias)
Definition: obsdcach.c:364
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:66
struct _IO_STACK_LOCATION::@4481::@4500 SetSecurity
union _IO_STACK_LOCATION::@1709 Parameters
struct _IO_STACK_LOCATION::@4481::@4499 QuerySecurity
#define STATUS_INVALID_DEVICE_REQUEST
Definition: udferr_usr.h:138
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ _Strict_type_match_ POOL_TYPE PoolType
Definition: wdfdevice.h:3821
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
Definition: wdfdevice.h:3777
_In_ USHORT _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR _Reserved_ ULONG _In_opt_ PVOID _In_opt_ const WSK_CLIENT_CONNECTION_DISPATCH _In_opt_ PEPROCESS _In_opt_ PETHREAD _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor
Definition: wsk.h:191
#define IO_TYPE_DEVICE
#define IRP_MJ_QUERY_SECURITY
#define IRP_MJ_SET_SECURITY
NTKERNELAPI NTSTATUS NTAPI SeQuerySecurityDescriptorInfo(_In_ PSECURITY_INFORMATION SecurityInformation, _Out_writes_bytes_(*Length) PSECURITY_DESCRIPTOR SecurityDescriptor, _Inout_ PULONG Length, _Inout_ PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor)

◆ IopParseDevice()

NTSTATUS NTAPI IopParseDevice ( IN PVOID  ParseObject,
IN PVOID  ObjectType,
IN OUT PACCESS_STATE  AccessState,
IN KPROCESSOR_MODE  AccessMode,
IN ULONG  Attributes,
IN OUT PUNICODE_STRING  CompleteName,
IN OUT PUNICODE_STRING  RemainingName,
IN OUT PVOID  Context,
IN PSECURITY_QUALITY_OF_SERVICE SecurityQos  OPTIONAL,
OUT PVOID Object 
)

Definition at line 321 of file file.c.

331{
332 POPEN_PACKET OpenPacket = (POPEN_PACKET)Context;
333 PDEVICE_OBJECT OriginalDeviceObject = (PDEVICE_OBJECT)ParseObject;
334 PDEVICE_OBJECT DeviceObject, OwnerDevice;
337 PVPB Vpb = NULL;
338 PIRP Irp;
339 PIO_STACK_LOCATION StackLoc;
340 IO_SECURITY_CONTEXT SecurityContext;
342 BOOLEAN DirectOpen = FALSE, OpenCancelled, UseDummyFile;
345 PDUMMY_FILE_OBJECT LocalFileObject;
348 KPROCESSOR_MODE CheckMode;
349 BOOLEAN VolumeOpen = FALSE;
351 BOOLEAN AccessGranted, LockHeld = FALSE;
353 UNICODE_STRING FileString;
354 USHORT Attempt;
355 IOTRACE(IO_FILE_DEBUG, "ParseObject: %p. RemainingName: %wZ\n",
356 ParseObject, RemainingName);
357
358 for (Attempt = 0; Attempt < IOP_MAX_REPARSE_TRAVERSAL; ++Attempt)
359 {
360 /* Assume failure */
361 *Object = NULL;
362
363 /* Validate the open packet */
364 if (!IopValidateOpenPacket(OpenPacket)) return STATUS_OBJECT_TYPE_MISMATCH;
365
366 /* Valide reparse point in case we traversed a mountpoint */
367 if (OpenPacket->TraversedMountPoint)
368 {
369 /* This is a reparse point we understand */
371
372 /* Make sure we're dealing with correct DO */
373 if (OriginalDeviceObject->DeviceType != FILE_DEVICE_DISK &&
374 OriginalDeviceObject->DeviceType != FILE_DEVICE_CD_ROM &&
375 OriginalDeviceObject->DeviceType != FILE_DEVICE_VIRTUAL_DISK &&
376 OriginalDeviceObject->DeviceType != FILE_DEVICE_TAPE)
377 {
380 }
381 }
382
383 /* Check if we have a related file object */
384 if (OpenPacket->RelatedFileObject)
385 {
386 /* Use the related file object's device object */
387 OriginalDeviceObject = OpenPacket->RelatedFileObject->DeviceObject;
388 }
389
390 /* Validate device status */
391 Status = IopCheckDeviceAndDriver(OpenPacket, OriginalDeviceObject);
392 if (!NT_SUCCESS(Status))
393 {
394 /* We failed, return status */
395 OpenPacket->FinalStatus = Status;
396 return Status;
397 }
398
399 /* Map the generic mask and set the new mapping in the access state */
400 RtlMapGenericMask(&AccessState->RemainingDesiredAccess,
402 RtlMapGenericMask(&AccessState->OriginalDesiredAccess,
406 DesiredAccess = AccessState->RemainingDesiredAccess;
407
408 /* Check what kind of access checks to do */
409 if ((AccessMode != KernelMode) ||
410 (OpenPacket->Options & IO_FORCE_ACCESS_CHECK))
411 {
412 /* Call is from user-mode or kernel is forcing checks */
413 CheckMode = UserMode;
414 }
415 else
416 {
417 /* Call is from the kernel */
418 CheckMode = KernelMode;
419 }
420
421 /* Check privilege for backup or restore operation */
423 &OpenPacket->CreateOptions,
424 CheckMode,
425 OpenPacket->Disposition);
426
427 /* Check if we are re-parsing */
428 if (((OpenPacket->Override) && !(RemainingName->Length)) ||
430 {
431 /* Get granted access from the last call */
432 DesiredAccess |= AccessState->PreviouslyGrantedAccess;
433 }
434
435 /* Check if this is a volume open */
436 if ((OpenPacket->RelatedFileObject) &&
437 (OpenPacket->RelatedFileObject->Flags & FO_VOLUME_OPEN) &&
438 !(RemainingName->Length))
439 {
440 /* It is */
441 VolumeOpen = TRUE;
442 }
443
444 /* Now check if we need access checks */
445 if (((AccessMode != KernelMode) ||
446 (OpenPacket->Options & IO_FORCE_ACCESS_CHECK)) &&
447 (!(OpenPacket->RelatedFileObject) || (VolumeOpen)) &&
448 !(OpenPacket->Override))
449 {
452
453 /* Check if a device object is being parsed */
454 if (!RemainingName->Length)
455 {
456 /* Lock the subject context */
457 SeLockSubjectContext(&AccessState->SubjectSecurityContext);
458 LockHeld = TRUE;
459
460 /* Do access check */
461 AccessGranted = SeAccessCheck(OriginalDeviceObject->
463 &AccessState->SubjectSecurityContext,
464 LockHeld,
466 0,
467 &Privileges,
469 TypeInfo.GenericMapping,
470 UserMode,
472 &Status);
473 if (Privileges)
474 {
475 /* Append and free the privileges */
478 }
479
480 /* Check if we got access */
481 if (AccessGranted)
482 {
483 /* Update access state */
484 AccessState->PreviouslyGrantedAccess |= GrantedAccess;
485 AccessState->RemainingDesiredAccess &= ~(GrantedAccess |
487 OpenPacket->Override= TRUE;
488 }
489
490 FileString.Length = 8;
491 FileString.MaximumLength = 8;
492 FileString.Buffer = L"File";
493
494 /* Do Audit/Alarm for open operation */
495 SeOpenObjectAuditAlarm(&FileString,
496 OriginalDeviceObject,
497 CompleteName,
498 OriginalDeviceObject->SecurityDescriptor,
500 FALSE,
502 UserMode,
503 &AccessState->GenerateOnClose);
504 }
505 else
506 {
507 /* Check if we need to do traverse validation */
509 ((OriginalDeviceObject->DeviceType == FILE_DEVICE_DISK) ||
510 (OriginalDeviceObject->DeviceType == FILE_DEVICE_CD_ROM)))
511 {
512 /* Check if this is a restricted token */
513 if (!(AccessState->Flags & TOKEN_IS_RESTRICTED))
514 {
515 /* Do the FAST traverse check */
516 AccessGranted = SeFastTraverseCheck(OriginalDeviceObject->SecurityDescriptor,
519 UserMode);
520 }
521 else
522 {
523 /* Fail */
525 }
526
527 /* Check if we failed to get access */
528 if (!AccessGranted)
529 {
530 /* Lock the subject context */
531 SeLockSubjectContext(&AccessState->SubjectSecurityContext);
532 LockHeld = TRUE;
533
534 /* Do access check */
535 AccessGranted = SeAccessCheck(OriginalDeviceObject->
537 &AccessState->SubjectSecurityContext,
538 LockHeld,
540 0,
541 &Privileges,
543 TypeInfo.GenericMapping,
544 UserMode,
546 &Status);
547 if (Privileges)
548 {
549 /* Append and free the privileges */
552 }
553 }
554
555 /* FIXME: Do Audit/Alarm for traverse check */
556 }
557 else
558 {
559 /* Access automatically granted */
561 }
562 }
563
566
567 /* Check if we hold the lock */
568 if (LockHeld)
569 {
570 /* Release it */
571 SeUnlockSubjectContext(&AccessState->SubjectSecurityContext);
572 }
573
574 /* Check if access failed */
575 if (!AccessGranted)
576 {
577 /* Dereference the device and fail */
578 DPRINT1("Traverse access failed!\n");
579 IopDereferenceDeviceObject(OriginalDeviceObject, FALSE);
581 }
582 }
583
584 /* Check if we can simply use a dummy file */
585 UseDummyFile = ((OpenPacket->QueryOnly) || (OpenPacket->DeleteOnly));
586
587 /* Check if this is a direct open */
588 if (!(RemainingName->Length) &&
589 !(OpenPacket->RelatedFileObject) &&
595 WRITE_DAC)) == 0) &&
596 !(UseDummyFile))
597 {
598 /* Remember this for later */
599 DirectOpen = TRUE;
600 }
601
602 /* Check if we have a related FO that wasn't a direct open */
603 if ((OpenPacket->RelatedFileObject) &&
604 !(OpenPacket->RelatedFileObject->Flags & FO_DIRECT_DEVICE_OPEN))
605 {
606 /* The device object is the one we were given */
607 DeviceObject = ParseObject;
608
609 /* Check if the related FO had a VPB */
610 if (OpenPacket->RelatedFileObject->Vpb)
611 {
612 /* Yes, remember it */
613 Vpb = OpenPacket->RelatedFileObject->Vpb;
614
615 /* Reference it */
616 InterlockedIncrement((PLONG)&Vpb->ReferenceCount);
617
618 /* Check if we were given a specific top level device to use */
620 {
621 DeviceObject = Vpb->DeviceObject;
622 }
623 }
624 }
625 else
626 {
627 /* Check if it has a VPB */
628 if ((OriginalDeviceObject->Vpb) && !(DirectOpen))
629 {
630 /* Check if the VPB is mounted, and mount it */
631 Vpb = IopCheckVpbMounted(OpenPacket,
632 OriginalDeviceObject,
634 &Status);
635 if (!Vpb) return Status;
636
637 /* Get the VPB's device object */
638 DeviceObject = Vpb->DeviceObject;
639 }
640 else
641 {
642 /* The device object is the one we were given */
643 DeviceObject = OriginalDeviceObject;
644 }
645
646 /* If we weren't given a specific top level device, look for an attached device */
647 if (!(OpenPacket->InternalFlags & IOP_USE_TOP_LEVEL_DEVICE_HINT) &&
648 DeviceObject->AttachedDevice)
649 {
650 /* Get the attached device */
652 }
653 }
654
655 /* If we have a top level device hint, verify it */
657 {
658 Status = IopCheckTopDeviceHint(&DeviceObject, OpenPacket, DirectOpen);
659 if (!NT_SUCCESS(Status))
660 {
661 IopDereferenceDeviceObject(OriginalDeviceObject, FALSE);
663 return Status;
664 }
665 }
666
667 /* If we traversed a mount point, reset the information */
668 if (OpenPacket->TraversedMountPoint)
669 {
670 OpenPacket->TraversedMountPoint = FALSE;
671 }
672
673 /* Check if this is a secure FSD */
674 if ((DeviceObject->Characteristics & FILE_DEVICE_SECURE_OPEN) &&
675 ((OpenPacket->RelatedFileObject) || (RemainingName->Length)) &&
676 (!VolumeOpen))
677 {
679 GrantedAccess = 0;
680
683
684 /* Lock the subject context */
685 SeLockSubjectContext(&AccessState->SubjectSecurityContext);
686
687 /* Do access check */
688 AccessGranted = SeAccessCheck(OriginalDeviceObject->SecurityDescriptor,
689 &AccessState->SubjectSecurityContext,
690 TRUE,
692 0,
693 &Privileges,
695 UserMode,
697 &Status);
698 if (Privileges != NULL)
699 {
700 /* Append and free the privileges */
703 }
704
705 /* Check if we got access */
706 if (GrantedAccess)
707 {
708 AccessState->PreviouslyGrantedAccess |= GrantedAccess;
709 AccessState->RemainingDesiredAccess &= ~(GrantedAccess | MAXIMUM_ALLOWED);
710 }
711
712 FileString.Length = 8;
713 FileString.MaximumLength = 8;
714 FileString.Buffer = L"File";
715
716 /* Do Audit/Alarm for open operation
717 * NOTA: we audit target device object
718 */
719 SeOpenObjectAuditAlarm(&FileString,
721 CompleteName,
722 OriginalDeviceObject->SecurityDescriptor,
724 FALSE,
726 UserMode,
727 &AccessState->GenerateOnClose);
728
729 SeUnlockSubjectContext(&AccessState->SubjectSecurityContext);
730
733
734 /* Check if access failed */
735 if (!AccessGranted)
736 {
737 /* Dereference the device and fail */
738 IopDereferenceDeviceObject(OriginalDeviceObject, FALSE);
741 }
742 }
743
744 /* Allocate the IRP */
745 Irp = IoAllocateIrp(DeviceObject->StackSize, TRUE);
746 if (!Irp)
747 {
748 /* Dereference the device and VPB, then fail */
749 IopDereferenceDeviceObject(OriginalDeviceObject, FALSE);
752 }
753
754 /* Now set the IRP data */
755 Irp->RequestorMode = AccessMode;
757 Irp->Tail.Overlay.Thread = PsGetCurrentThread();
758 Irp->UserIosb = &IoStatusBlock;
759 Irp->MdlAddress = NULL;
760 Irp->PendingReturned = FALSE;
761 Irp->UserEvent = NULL;
762 Irp->Cancel = FALSE;
763 Irp->CancelRoutine = NULL;
764 Irp->Tail.Overlay.AuxiliaryBuffer = NULL;
765
766 /* Setup the security context */
767 SecurityContext.SecurityQos = SecurityQos;
768 SecurityContext.AccessState = AccessState;
769 SecurityContext.DesiredAccess = AccessState->RemainingDesiredAccess;
770 SecurityContext.FullCreateOptions = OpenPacket->CreateOptions;
771
772 /* Get the I/O Stack location */
773 StackLoc = IoGetNextIrpStackLocation(Irp);
774 StackLoc->Control = 0;
775
776 /* Check what kind of file this is */
777 switch (OpenPacket->CreateFileType)
778 {
779 /* Normal file */
781
782 /* Set the major function and EA Length */
783 StackLoc->MajorFunction = IRP_MJ_CREATE;
784 StackLoc->Parameters.Create.EaLength = OpenPacket->EaLength;
785
786 /* Set the flags */
787 StackLoc->Flags = (UCHAR)OpenPacket->Options;
789 break;
790
791 /* Named pipe */
793
794 /* Set the named pipe MJ and set the parameters */
796 StackLoc->Parameters.CreatePipe.Parameters = OpenPacket->ExtraCreateParameters;
797 break;
798
799 /* Mailslot */
801
802 /* Set the mailslot MJ and set the parameters */
804 StackLoc->Parameters.CreateMailslot.Parameters = OpenPacket->ExtraCreateParameters;
805 break;
806 }
807
808 /* Set the common data */
809 Irp->Overlay.AllocationSize = OpenPacket->AllocationSize;
810 Irp->AssociatedIrp.SystemBuffer = OpenPacket->EaBuffer;
811 StackLoc->Parameters.Create.Options = (OpenPacket->Disposition << 24) |
812 (OpenPacket->CreateOptions &
813 0xFFFFFF);
814 StackLoc->Parameters.Create.FileAttributes = OpenPacket->FileAttributes;
815 StackLoc->Parameters.Create.ShareAccess = OpenPacket->ShareAccess;
816 StackLoc->Parameters.Create.SecurityContext = &SecurityContext;
817
818 /* Check if we really need to create an object */
819 if (!UseDummyFile)
820 {
821 ULONG ObjectSize = sizeof(FILE_OBJECT);
822
823 /* Tag on space for a file object extension */
825 ObjectSize += sizeof(FILE_OBJECT_EXTENSION);
826
827 /* Create the actual file object */
829 NULL,
831 NULL,
832 NULL);
837 NULL,
838 ObjectSize,
839 0,
840 0,
841 (PVOID*)&FileObject);
842 if (!NT_SUCCESS(Status))
843 {
844 /* Create failed, free the IRP */
845 IoFreeIrp(Irp);
846
847 /* Dereference the device and VPB */
848 IopDereferenceDeviceObject(OriginalDeviceObject, FALSE);
850
851 /* We failed, return status */
852 OpenPacket->FinalStatus = Status;
853 return Status;
854 }
855
856 /* Clear the file object */
857 RtlZeroMemory(FileObject, ObjectSize);
858
859 /* Check if this is Synch I/O */
860 if (OpenPacket->CreateOptions &
862 {
863 /* Set the synch flag */
865
866 /* Check if it's also alertable */
868 {
869 /* It is, set the alertable flag */
870 FileObject->Flags |= FO_ALERTABLE_IO;
871 }
872 }
873
874 /* Check if this is synch I/O */
875 if (FileObject->Flags & FO_SYNCHRONOUS_IO)
876 {
877 /* Initialize the event */
879 }
880
881 /* Check if the caller requested no intermediate buffering */
883 {
884 /* Set the correct flag for the FSD to read */
886 }
887
888 /* Check if the caller requested write through support */
889 if (OpenPacket->CreateOptions & FILE_WRITE_THROUGH)
890 {
891 /* Set the correct flag for the FSD to read */
893 }
894
895 /* Check if the caller says the file will be only read sequentially */
896 if (OpenPacket->CreateOptions & FILE_SEQUENTIAL_ONLY)
897 {
898 /* Set the correct flag for the FSD to read */
900 }
901
902 /* Check if the caller believes the file will be only read randomly */
903 if (OpenPacket->CreateOptions & FILE_RANDOM_ACCESS)
904 {
905 /* Set the correct flag for the FSD to read */
907 }
908
909 /* Check if we were asked to setup a file object extension */
911 {
912 PFILE_OBJECT_EXTENSION FileObjectExtension;
913
914 /* Make sure the file object knows it has an extension */
916
917 /* Initialize file object extension */
918 FileObjectExtension = (PFILE_OBJECT_EXTENSION)(FileObject + 1);
919 FileObject->FileObjectExtension = FileObjectExtension;
920
921 /* Add the top level device which we'll send the request to */
923 {
924 FileObjectExtension->TopDeviceObjectHint = DeviceObject;
925 }
926 }
927 }
928 else
929 {
930 /* Use the dummy object instead */
931 LocalFileObject = OpenPacket->LocalFileObject;
932 RtlZeroMemory(LocalFileObject, sizeof(DUMMY_FILE_OBJECT));
933
934 /* Set it up */
935 FileObject = (PFILE_OBJECT)&LocalFileObject->ObjectHeader.Body;
936 LocalFileObject->ObjectHeader.Type = IoFileObjectType;
937 LocalFileObject->ObjectHeader.PointerCount = 1;
938 }
939
940 /* Setup the file header */
941 FileObject->Type = IO_TYPE_FILE;
942 FileObject->Size = sizeof(FILE_OBJECT);
943 FileObject->RelatedFileObject = OpenPacket->RelatedFileObject;
944 FileObject->DeviceObject = OriginalDeviceObject;
945
946 /* Check if this is a direct device open */
947 if (DirectOpen) FileObject->Flags |= FO_DIRECT_DEVICE_OPEN;
948
949 /* Check if the caller wants case sensitivity */
951 {
952 /* Tell the driver about it */
954 }
955
956 /* Now set the file object */
957 Irp->Tail.Overlay.OriginalFileObject = FileObject;
958 StackLoc->FileObject = FileObject;
959
960 /* Check if the file object has a name */
961 if (RemainingName->Length)
962 {
963 /* Setup the unicode string */
964 FileObject->FileName.MaximumLength = RemainingName->Length + sizeof(WCHAR);
965 FileObject->FileName.Buffer = ExAllocatePoolWithTag(PagedPool,
966 FileObject->FileName.MaximumLength,
968 if (!FileObject->FileName.Buffer)
969 {
970 /* Failed to allocate the name, free the IRP */
971 IoFreeIrp(Irp);
972
973 /* Dereference the device object and VPB */
974 IopDereferenceDeviceObject(OriginalDeviceObject, FALSE);
976
977 /* Clear the FO and dereference it */
978 FileObject->DeviceObject = NULL;
979 if (!UseDummyFile) ObDereferenceObject(FileObject);
980
981 /* Fail */
983 }
984 }
985
986 /* Copy the name */
988
989 /* Initialize the File Object event and set the FO */
991 OpenPacket->FileObject = FileObject;
992
993 /* Queue the IRP and call the driver */
996 if (Status == STATUS_PENDING)
997 {
998 /* Wait for the driver to complete the create */
1000 Executive,
1001 KernelMode,
1002 FALSE,
1003 NULL);
1004
1005 /* Get the new status */
1007 }
1008 else
1009 {
1010 /* We'll have to complete it ourselves */
1011 ASSERT(!Irp->PendingReturned);
1012 ASSERT(!Irp->MdlAddress);
1013
1014 /* Handle name change if required */
1015 if (Status == STATUS_REPARSE)
1016 {
1017 /* Check this is a mount point */
1018 if (Irp->IoStatus.Information == IO_REPARSE_TAG_MOUNT_POINT)
1019 {
1020 PREPARSE_DATA_BUFFER ReparseData;
1021
1022 /* Reparse point attributes were passed by the driver in the auxiliary buffer */
1023 ASSERT(Irp->Tail.Overlay.AuxiliaryBuffer != NULL);
1024 ReparseData = (PREPARSE_DATA_BUFFER)Irp->Tail.Overlay.AuxiliaryBuffer;
1025
1029
1030 IopDoNameTransmogrify(Irp, FileObject, ReparseData);
1031 }
1032 }
1033
1034 /* Completion happens at APC_LEVEL */
1036
1037 /* Get the new I/O Status block ourselves */
1038 IoStatusBlock = Irp->IoStatus;
1040
1041 /* Manually signal the even, we can't have any waiters */
1042 FileObject->Event.Header.SignalState = 1;
1043
1044 /* Now that we've signaled the events, de-associate the IRP */
1046
1047 /* Check if the IRP had an input buffer */
1048 if ((Irp->Flags & IRP_BUFFERED_IO) &&
1049 (Irp->Flags & IRP_DEALLOCATE_BUFFER))
1050 {
1051 /* Free it. A driver might've tacked one on */
1052 ExFreePool(Irp->AssociatedIrp.SystemBuffer);
1053 }
1054
1055 /* Free the IRP and bring the IRQL back down */
1056 IoFreeIrp(Irp);
1058 }
1059
1060 /* Copy the I/O Status */
1062
1063 /* The driver failed to create the file */
1064 if (!NT_SUCCESS(Status))
1065 {
1066 /* Check if we have a name and if so, free it */
1067 if (FileObject->FileName.Length)
1068 {
1069 /*
1070 * Don't use TAG_IO_NAME since the FileObject's FileName
1071 * may have been re-allocated using a different tag
1072 * by a filesystem.
1073 */
1074 ExFreePoolWithTag(FileObject->FileName.Buffer, 0);
1075 FileObject->FileName.Buffer = NULL;
1076 FileObject->FileName.Length = 0;
1077 }
1078
1079 /* Clear its device object */
1080 FileObject->DeviceObject = NULL;
1081
1082 /* Save this now because the FO might go away */
1083 OpenCancelled = FileObject->Flags & FO_FILE_OPEN_CANCELLED ?
1084 TRUE : FALSE;
1085
1086 /* Clear the file object in the open packet */
1087 OpenPacket->FileObject = NULL;
1088
1089 /* Dereference the file object */
1090 if (!UseDummyFile) ObDereferenceObject(FileObject);
1091
1092 /* Dereference the device object */
1093 IopDereferenceDeviceObject(OriginalDeviceObject, FALSE);
1094
1095 /* Unless the driver cancelled the open, dereference the VPB */
1096 if (!(OpenCancelled) && (Vpb)) IopDereferenceVpbAndFree(Vpb);
1097
1098 /* Set the status and return */
1099 OpenPacket->FinalStatus = Status;
1100 return Status;
1101 }
1102 else if (Status == STATUS_REPARSE)
1103 {
1104 if (OpenPacket->Information == IO_REPARSE ||
1106 {
1107 /* Update CompleteName with reparse info which got updated in IopDoNameTransmogrify() */
1108 if (CompleteName->MaximumLength < FileObject->FileName.Length)
1109 {
1110 PWSTR NewCompleteName;
1111
1112 /* Allocate a new buffer for the string */
1113 NewCompleteName = ExAllocatePoolWithTag(PagedPool, FileObject->FileName.Length, TAG_IO_NAME);
1114 if (NewCompleteName == NULL)
1115 {
1118 }
1119
1120 /* Release the old one */
1121 if (CompleteName->Buffer != NULL)
1122 {
1123 /*
1124 * Don't use TAG_IO_NAME since the FileObject's FileName
1125 * may have been re-allocated using a different tag
1126 * by a filesystem.
1127 */
1128 ExFreePoolWithTag(CompleteName->Buffer, 0);
1129 }
1130
1131 /* And setup the new one */
1132 CompleteName->Buffer = NewCompleteName;
1133 CompleteName->MaximumLength = FileObject->FileName.Length;
1134 }
1135
1136 /* Copy our new complete name */
1137 RtlCopyUnicodeString(CompleteName, &FileObject->FileName);
1138
1139 if (OpenPacket->Information == IO_REPARSE_TAG_MOUNT_POINT)
1140 {
1141 OpenPacket->RelatedFileObject = NULL;
1142 }
1143 }
1144
1145 /* Check if we have a name and if so, free it */
1146 if (FileObject->FileName.Length)
1147 {
1148 /*
1149 * Don't use TAG_IO_NAME since the FileObject's FileName
1150 * may have been re-allocated using a different tag
1151 * by a filesystem.
1152 */
1153 ExFreePoolWithTag(FileObject->FileName.Buffer, 0);
1154 FileObject->FileName.Buffer = NULL;
1155 FileObject->FileName.Length = 0;
1156 }
1157
1158 /* Clear its device object */
1159 FileObject->DeviceObject = NULL;
1160
1161 /* Clear the file object in the open packet */
1162 OpenPacket->FileObject = NULL;
1163
1164 /* Dereference the file object */
1165 if (!UseDummyFile) ObDereferenceObject(FileObject);
1166
1167 /* Dereference the device object */
1168 IopDereferenceDeviceObject(OriginalDeviceObject, FALSE);
1169
1170 /* Unless the driver cancelled the open, dereference the VPB */
1172
1173 if (OpenPacket->Information != IO_REMOUNT)
1174 {
1175 OpenPacket->RelatedFileObject = NULL;
1176
1177 /* Inform we traversed a mount point for later attempt */
1178 if (OpenPacket->Information == IO_REPARSE_TAG_MOUNT_POINT)
1179 {
1180 OpenPacket->TraversedMountPoint = 1;
1181 }
1182
1183 /* In case we override checks, but got this on volume open, fail hard */
1184 if (OpenPacket->Override)
1185 {
1186 KeBugCheckEx(DRIVER_RETURNED_STATUS_REPARSE_FOR_VOLUME_OPEN,
1187 (ULONG_PTR)OriginalDeviceObject,
1189 (ULONG_PTR)CompleteName,
1190 OpenPacket->Information);
1191 }
1192
1193 /* Return to IO/OB so that information can be upgraded */
1194 return STATUS_REPARSE;
1195 }
1196
1197 /* Loop again and reattempt an opening */
1198 continue;
1199 }
1200
1201 break;
1202 }
1203
1204 if (Attempt == IOP_MAX_REPARSE_TRAVERSAL)
1205 return STATUS_UNSUCCESSFUL;
1206
1207 /* Get the owner of the File Object */
1208 OwnerDevice = IoGetRelatedDeviceObject(FileObject);
1209
1210 /*
1211 * It's possible that the device to whom we sent the IRP to
1212 * isn't actually the device that ended opening the file object
1213 * internally.
1214 */
1215 if (OwnerDevice != DeviceObject)
1216 {
1217 /* We have to de-reference the VPB we had associated */
1219
1220 /* And re-associate with the actual one */
1221 Vpb = FileObject->Vpb;
1222 if (Vpb) InterlockedIncrement((PLONG)&Vpb->ReferenceCount);
1223 }
1224
1225 /* Make sure we are not using a dummy */
1226 if (!UseDummyFile)
1227 {
1228 /* Check if this was a volume open */
1229 if ((!(FileObject->RelatedFileObject) ||
1230 (FileObject->RelatedFileObject->Flags & FO_VOLUME_OPEN)) &&
1231 !(FileObject->FileName.Length))
1232 {
1233 /* All signs point to it, but make sure it was actually an FSD */
1234 if ((OwnerDevice->DeviceType == FILE_DEVICE_DISK_FILE_SYSTEM) ||
1235 (OwnerDevice->DeviceType == FILE_DEVICE_CD_ROM_FILE_SYSTEM) ||
1236 (OwnerDevice->DeviceType == FILE_DEVICE_TAPE_FILE_SYSTEM) ||
1237 (OwnerDevice->DeviceType == FILE_DEVICE_FILE_SYSTEM))
1238 {
1239 /* The owner device is an FSD, so this is a volume open for real */
1240 FileObject->Flags |= FO_VOLUME_OPEN;
1241 }
1242 }
1243
1244 /* Reference the object and set the parse check */
1246 *Object = FileObject;
1247 OpenPacket->FinalStatus = IoStatusBlock.Status;
1248 OpenPacket->ParseCheck = TRUE;
1249 return OpenPacket->FinalStatus;
1250 }
1251 else
1252 {
1253 /* Check if this was a query */
1254 if (OpenPacket->QueryOnly)
1255 {
1256 /* Check if the caller wants basic info only */
1257 if (!OpenPacket->FullAttributes)
1258 {
1259 /* Allocate the buffer */
1261 sizeof(*FileBasicInfo),
1262 TAG_IO);
1263 if (FileBasicInfo)
1264 {
1265 /* Do the query */
1268 sizeof(*FileBasicInfo),
1270 &ReturnLength);
1271 if (NT_SUCCESS(Status))
1272 {
1273 /* Copy the data */
1274 RtlCopyMemory(OpenPacket->BasicInformation,
1276 ReturnLength);
1277 }
1278
1279 /* Free our buffer */
1281 }
1282 else
1283 {
1284 /* Fail */
1286 }
1287 }
1288 else
1289 {
1290 /* This is a full query */
1292 FileObject,
1295 OpenPacket->NetworkInformation,
1296 &ReturnLength);
1298 }
1299 }
1300
1301 /* Delete the file object */
1303
1304 /* Clear out the file */
1305 OpenPacket->FileObject = NULL;
1306
1307 /* Set and return status */
1308 OpenPacket->FinalStatus = Status;
1309 OpenPacket->ParseCheck = TRUE;
1310 return Status;
1311 }
1312}
_In_ PVOID _In_ ULONG _Out_ PVOID _In_ ULONG _Inout_ PULONG ReturnLength
BOOLEAN NTAPI SeAccessCheck(_In_ PSECURITY_DESCRIPTOR SecurityDescriptor, _In_ PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext, _In_ BOOLEAN SubjectContextLocked, _In_ ACCESS_MASK DesiredAccess, _In_ ACCESS_MASK PreviouslyGrantedAccess, _Out_ PPRIVILEGE_SET *Privileges, _In_ PGENERIC_MAPPING GenericMapping, _In_ KPROCESSOR_MODE AccessMode, _Out_ PACCESS_MASK GrantedAccess, _Out_ PNTSTATUS AccessStatus)
Determines whether security access rights can be given to an object depending on the security descrip...
Definition: accesschk.c:1994
_Inout_ PFCB _Inout_ PUNICODE_STRING RemainingName
Definition: cdprocs.h:802
#define FILE_DEVICE_SECURE_OPEN
Definition: cdrw_usr.h:46
#define L(x)
Definition: resources.c:13
#define ExAcquireResourceSharedLite(res, wait)
Definition: env_spec_w32.h:621
@ FileNetworkOpenInformation
Definition: from_kernel.h:95
@ FileBasicInformation
Definition: from_kernel.h:65
#define FILE_RANDOM_ACCESS
Definition: from_kernel.h:38
#define FILE_SEQUENTIAL_ONLY
Definition: from_kernel.h:27
__in WDFOBJECT __in PCWDF_OBJECT_CONTEXT_TYPE_INFO TypeInfo
Definition: handleapi.cpp:601
static __inline BOOLEAN IopValidateOpenPacket(IN POPEN_PACKET OpenPacket)
Definition: io_x.h:154
NTSTATUS NTAPI IoQueryFileInformation(IN PFILE_OBJECT FileObject, IN FILE_INFORMATION_CLASS FileInformationClass, IN ULONG Length, OUT PVOID FileInformation, OUT PULONG ReturnedLength)
Definition: iofunc.c:1274
@ FileBasicInfo
Definition: minwinbase.h:304
#define UserMode
Definition: asm.h:39
NTSYSAPI VOID NTAPI RtlMapGenericMask(PACCESS_MASK AccessMask, PGENERIC_MAPPING GenericMapping)
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
#define FILE_READ_ATTRIBUTES
Definition: nt_native.h:647
@ NotificationEvent
struct _OPEN_PACKET * POPEN_PACKET
PVPB NTAPI IopCheckVpbMounted(IN POPEN_PACKET OpenPacket, IN PDEVICE_OBJECT DeviceObject, IN PUNICODE_STRING RemainingName, OUT PNTSTATUS Status)
Definition: volume.c:76
struct _FILE_OBJECT_EXTENSION FILE_OBJECT_EXTENSION
#define IOP_MAX_REPARSE_TRAVERSAL
Definition: io.h:91
struct _FILE_OBJECT_EXTENSION * PFILE_OBJECT_EXTENSION
VOID NTAPI IopDereferenceVpbAndFree(IN PVPB Vpb)
Definition: volume.c:186
BOOLEAN NTAPI SeFastTraverseCheck(_In_ PSECURITY_DESCRIPTOR SecurityDescriptor, _In_ PACCESS_STATE AccessState, _In_ ACCESS_MASK DesiredAccess, _In_ KPROCESSOR_MODE AccessMode)
Determines whether security access rights can be given to an object depending on the security descrip...
Definition: accesschk.c:2138
NTSTATUS IopCheckTopDeviceHint(IN OUT PDEVICE_OBJECT *DeviceObject, IN POPEN_PACKET OpenPacket, BOOLEAN DirectOpen)
Definition: file.c:272
VOID NTAPI IopCheckBackupRestorePrivilege(IN PACCESS_STATE AccessState, IN OUT PULONG CreateOptions, IN KPROCESSOR_MODE PreviousMode, IN ULONG Disposition)
Definition: file.c:25
VOID NTAPI IopDoNameTransmogrify(IN PIRP Irp, IN PFILE_OBJECT FileObject, IN PREPARSE_DATA_BUFFER DataBuffer)
Definition: file.c:167
NTSTATUS NTAPI IopCheckDeviceAndDriver(IN POPEN_PACKET OpenPacket, IN PDEVICE_OBJECT DeviceObject)
Definition: file.c:135
VOID NTAPI IopDeleteFile(IN PVOID ObjectBody)
Definition: file.c:1352
VOID NTAPI SeSetAccessStateGenericMapping(_In_ PACCESS_STATE AccessState, _In_ PGENERIC_MAPPING GenericMapping)
Sets a new generic mapping for an allocated access state.
Definition: access.c:193
VOID NTAPI SeOpenObjectAuditAlarm(_In_ PUNICODE_STRING ObjectTypeName, _In_opt_ PVOID Object, _In_opt_ PUNICODE_STRING AbsoluteObjectName, _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, _In_ PACCESS_STATE AccessState, _In_ BOOLEAN ObjectCreated, _In_ BOOLEAN AccessGranted, _In_ KPROCESSOR_MODE AccessMode, _Out_ PBOOLEAN GenerateOnClose)
Creates an audit with alarm notification of an object that is being opened.
Definition: audit.c:1213
VOID NTAPI SeFreePrivileges(_In_ PPRIVILEGE_SET Privileges)
Frees a set of privileges.
Definition: priv.c:669
#define FILE_DEVICE_FILE_SYSTEM
Definition: winioctl.h:54
#define FILE_DEVICE_TAPE
Definition: winioctl.h:76
#define FILE_DEVICE_CD_ROM
Definition: winioctl.h:47
#define FILE_DEVICE_DISK
Definition: winioctl.h:52
#define FILE_DEVICE_VIRTUAL_DISK
Definition: winioctl.h:81
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define IRP_MJ_CREATE
Definition: rdpdr.c:44
struct _REPARSE_DATA_BUFFER * PREPARSE_DATA_BUFFER
_In_ PVOID Context
Definition: storport.h:2269
OBJECT_HEADER ObjectHeader
Definition: io.h:357
ULONG Flags
Definition: pstypes.h:1535
PDEVICE_OBJECT TopDeviceObjectHint
Definition: io.h:102
PACCESS_STATE AccessState
Definition: iotypes.h:2869
PSECURITY_QUALITY_OF_SERVICE SecurityQos
Definition: iotypes.h:2868
ACCESS_MASK DesiredAccess
Definition: iotypes.h:2870
struct _IO_STACK_LOCATION::@4481::@4483 CreatePipe
struct _IO_STACK_LOCATION::@4481::@4484 CreateMailslot
struct _IO_STACK_LOCATION::@4481::@4482 Create
LONG_PTR PointerCount
Definition: obtypes.h:489
POBJECT_TYPE Type
Definition: obtypes.h:495
GENERIC_MAPPING GenericMapping
Definition: obtypes.h:360
OBJECT_TYPE_INITIALIZER TypeInfo
Definition: obtypes.h:392
BOOLEAN Override
Definition: io.h:387
BOOLEAN DeleteOnly
Definition: io.h:389
PFILE_BASIC_INFORMATION BasicInformation
Definition: io.h:383
BOOLEAN TraversedMountPoint
Definition: io.h:392
PFILE_OBJECT RelatedFileObject
Definition: io.h:373
USHORT ReparseDataLength
Definition: shellext.h:166
USHORT MaximumLength
Definition: env_spec_w32.h:370
VOID NTAPI SeLockSubjectContext(_In_ PSECURITY_SUBJECT_CONTEXT SubjectContext)
Locks both the referenced primary and client access tokens of a security subject context.
Definition: subject.c:107
VOID NTAPI SeUnlockSubjectContext(_In_ PSECURITY_SUBJECT_CONTEXT SubjectContext)
Unlocks both the referenced primary and client access tokens of a security subject context.
Definition: subject.c:138
#define TAG_IO
Definition: tag.h:79
unsigned char UCHAR
Definition: typedefs.h:53
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
_Must_inspect_result_ _In_ WDFDMAENABLER _In_ _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes
#define IO_REPARSE
Definition: iotypes.h:543
#define IRP_DEALLOCATE_BUFFER
#define FO_SEQUENTIAL_ONLY
Definition: iotypes.h:1780
#define FO_ALERTABLE_IO
Definition: iotypes.h:1777
#define IRP_MJ_CREATE_NAMED_PIPE
#define IRP_MJ_CREATE_MAILSLOT
#define FO_OPENED_CASE_SENSITIVE
Definition: iotypes.h:1793
#define FO_WRITE_THROUGH
Definition: iotypes.h:1779
#define FO_RANDOM_ACCESS
Definition: iotypes.h:1796
#define FO_VOLUME_OPEN
Definition: iotypes.h:1798
#define IRP_CREATE_OPERATION
#define IRP_DEFER_IO_COMPLETION
#define FO_NO_INTERMEDIATE_BUFFERING
Definition: iotypes.h:1778
@ CreateFileTypeNone
Definition: iotypes.h:535
#define IO_REMOUNT
Definition: iotypes.h:544
#define IRP_BUFFERED_IO
#define SL_CASE_SENSITIVE
Definition: iotypes.h:1820
_In_ PSECURITY_SUBJECT_CONTEXT _In_ BOOLEAN _In_ ACCESS_MASK _In_ ACCESS_MASK _Outptr_opt_ PPRIVILEGE_SET _In_ PGENERIC_MAPPING _In_ KPROCESSOR_MODE _Out_ PACCESS_MASK GrantedAccess
Definition: sefuncs.h:20
#define TOKEN_HAS_TRAVERSE_PRIVILEGE
Definition: setypes.h:1190
#define TOKEN_IS_RESTRICTED
Definition: setypes.h:1195

Referenced by IopCreateObjectTypes(), and IopParseFile().

◆ IopParseFile()

NTSTATUS NTAPI IopParseFile ( IN PVOID  ParseObject,
IN PVOID  ObjectType,
IN OUT PACCESS_STATE  AccessState,
IN KPROCESSOR_MODE  AccessMode,
IN ULONG  Attributes,
IN OUT PUNICODE_STRING  CompleteName,
IN OUT PUNICODE_STRING  RemainingName,
IN OUT PVOID Context  OPTIONAL,
IN PSECURITY_QUALITY_OF_SERVICE SecurityQos  OPTIONAL,
OUT PVOID Object 
)

Definition at line 1316 of file file.c.

1326{
1328 POPEN_PACKET OpenPacket = (POPEN_PACKET)Context;
1329
1330 /* Validate the open packet */
1331 if (!IopValidateOpenPacket(OpenPacket)) return STATUS_OBJECT_TYPE_MISMATCH;
1332
1333 /* Get the device object */
1335 OpenPacket->RelatedFileObject = ParseObject;
1336
1337 /* Call the main routine */
1339 ObjectType,
1341 AccessMode,
1342 Attributes,
1343 CompleteName,
1345 OpenPacket,
1346 SecurityQos,
1347 Object);
1348}
ObjectType
Definition: metafile.c:88
NTSTATUS NTAPI IopParseDevice(IN PVOID ParseObject, IN PVOID ObjectType, IN OUT PACCESS_STATE AccessState, IN KPROCESSOR_MODE AccessMode, IN ULONG Attributes, IN OUT PUNICODE_STRING CompleteName, IN OUT PUNICODE_STRING RemainingName, IN OUT PVOID Context, IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL, OUT PVOID *Object)
Definition: file.c:321

Referenced by IopCreateObjectTypes().

◆ IopQueryAttributesFile()

NTSTATUS NTAPI IopQueryAttributesFile ( IN POBJECT_ATTRIBUTES  ObjectAttributes,
IN FILE_INFORMATION_CLASS  FileInformationClass,
IN ULONG  FileInformationSize,
OUT PVOID  FileInformation 
)

Definition at line 2343 of file file.c.

2347{
2350 DUMMY_FILE_OBJECT LocalFileObject;
2351 FILE_NETWORK_OPEN_INFORMATION NetworkOpenInfo;
2352 HANDLE Handle;
2353 OPEN_PACKET OpenPacket;
2354 BOOLEAN IsBasic;
2355 PAGED_CODE();
2356 IOTRACE(IO_FILE_DEBUG, "Class: %lx\n", FileInformationClass);
2357
2358 /* Check if the caller was user mode */
2359 if (AccessMode != KernelMode)
2360 {
2361 /* Protect probe in SEH */
2362 _SEH2_TRY
2363 {
2364 /* Probe the buffer */
2365 ProbeForWrite(FileInformation, FileInformationSize, sizeof(ULONG));
2366 }
2368 {
2369 /* Return the exception code */
2371 }
2372 _SEH2_END;
2373 }
2374
2375 /* Check if this is a basic or full request */
2376 IsBasic = (FileInformationSize == sizeof(FILE_BASIC_INFORMATION));
2377
2378 /* Setup the Open Packet */
2379 RtlZeroMemory(&OpenPacket, sizeof(OPEN_PACKET));
2380 OpenPacket.Type = IO_TYPE_OPEN_PACKET;
2381 OpenPacket.Size = sizeof(OPEN_PACKET);
2384 OpenPacket.Disposition = FILE_OPEN;
2385 OpenPacket.BasicInformation = IsBasic ? FileInformation : NULL;
2386 OpenPacket.NetworkInformation = IsBasic ? &NetworkOpenInfo :
2387 (AccessMode != KernelMode) ?
2388 &NetworkOpenInfo : FileInformation;
2389 OpenPacket.QueryOnly = TRUE;
2390 OpenPacket.FullAttributes = IsBasic ? FALSE : TRUE;
2391 OpenPacket.LocalFileObject = &LocalFileObject;
2392
2393 /* Update the operation count */
2395
2396 /*
2397 * Attempt opening the file. This will call the I/O Parse Routine for
2398 * the File Object (IopParseDevice) which will use the dummy file obejct
2399 * send the IRP to its device object. Note that we have two statuses
2400 * to worry about: the Object Manager's status (in Status) and the I/O
2401 * status, which is in the Open Packet's Final Status, and determined
2402 * by the Parse Check member.
2403 */
2405 NULL,
2406 AccessMode,
2407 NULL,
2409 &OpenPacket,
2410 &Handle);
2411 if (OpenPacket.ParseCheck == FALSE)
2412 {
2413 /* Parse failed */
2414 DPRINT("IopQueryAttributesFile failed for '%wZ' with 0x%lx\n",
2415 ObjectAttributes->ObjectName, Status);
2416 return Status;
2417 }
2418 else
2419 {
2420 /* Use the Io status */
2421 Status = OpenPacket.FinalStatus;
2422 }
2423
2424 /* Check if we were succesful and this was user mode and a full query */
2425 if ((NT_SUCCESS(Status)) && (AccessMode != KernelMode) && !(IsBasic))
2426 {
2427 /* Enter SEH for copy */
2428 _SEH2_TRY
2429 {
2430 /* Copy the buffer back */
2432 &NetworkOpenInfo,
2433 FileInformationSize);
2434 }
2436 {
2437 /* Get exception code */
2439 }
2440 _SEH2_END;
2441 }
2442
2443 /* Return status */
2444 return Status;
2445}
VOID NTAPI ProbeForWrite(IN PVOID Address, IN SIZE_T Length, IN ULONG Alignment)
Definition: exintrin.c:143
#define FILE_BASIC_INFORMATION
Definition: disk.h:53
static OUT PIO_STATUS_BLOCK OUT PVOID FileInformation
Definition: pipe.c:100
static OUT PIO_STATUS_BLOCK OUT PVOID IN ULONG IN FILE_INFORMATION_CLASS FileInformationClass
Definition: pipe.c:100
#define DPRINT
Definition: sndvol32.h:73

Referenced by NtQueryAttributesFile(), and NtQueryFullAttributesFile().

◆ IopQueryName()

NTSTATUS NTAPI IopQueryName ( IN PVOID  ObjectBody,
IN BOOLEAN  HasName,
OUT POBJECT_NAME_INFORMATION  ObjectNameInfo,
IN ULONG  Length,
OUT PULONG  ReturnLength,
IN KPROCESSOR_MODE  PreviousMode 
)

Definition at line 1924 of file file.c.

1930{
1931 return IopQueryNameInternal(ObjectBody,
1932 HasName,
1933 FALSE,
1934 ObjectNameInfo,
1935 Length,
1937 PreviousMode);
1938}
NTSTATUS NTAPI IopQueryNameInternal(IN PVOID ObjectBody, IN BOOLEAN HasName, IN BOOLEAN QueryDosName, OUT POBJECT_NAME_INFORMATION ObjectNameInfo, IN ULONG Length, OUT PULONG ReturnLength, IN KPROCESSOR_MODE PreviousMode)
Definition: file.c:1942

Referenced by IopCreateObjectTypes().

◆ IopQueryNameInternal()

NTSTATUS NTAPI IopQueryNameInternal ( IN PVOID  ObjectBody,
IN BOOLEAN  HasName,
IN BOOLEAN  QueryDosName,
OUT POBJECT_NAME_INFORMATION  ObjectNameInfo,
IN ULONG  Length,
OUT PULONG  ReturnLength,
IN KPROCESSOR_MODE  PreviousMode 
)

Definition at line 1942 of file file.c.

1949{
1950 POBJECT_NAME_INFORMATION LocalInfo;
1951 PFILE_NAME_INFORMATION LocalFileInfo;
1952 PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
1953 ULONG LocalReturnLength, FileLength;
1954 BOOLEAN LengthMismatch = FALSE;
1956 PWCHAR p;
1958 BOOLEAN NoObCall;
1959
1960 IOTRACE(IO_FILE_DEBUG, "ObjectBody: %p\n", ObjectBody);
1961
1962 /* Validate length */
1963 if (Length < sizeof(OBJECT_NAME_INFORMATION))
1964 {
1965 /* Wrong length, fail */
1968 }
1969
1970 /* Allocate Buffer */
1972 if (!LocalInfo) return STATUS_INSUFFICIENT_RESOURCES;
1973
1974 /* Query DOS name if the caller asked to */
1975 NoObCall = FALSE;
1976 if (QueryDosName)
1977 {
1978 DeviceObject = FileObject->DeviceObject;
1979
1980 /* In case of a network file system, don't call mountmgr */
1982 {
1983 /* We'll store separator and terminator */
1984 LocalReturnLength = sizeof(OBJECT_NAME_INFORMATION) + 2 * sizeof(WCHAR);
1985 if (Length < LocalReturnLength)
1986 {
1988 }
1989 else
1990 {
1991 LocalInfo->Name.Length = sizeof(WCHAR);
1992 LocalInfo->Name.MaximumLength = sizeof(WCHAR);
1993 LocalInfo->Name.Buffer = (PVOID)((ULONG_PTR)LocalInfo + sizeof(OBJECT_NAME_INFORMATION));
1994 LocalInfo->Name.Buffer[0] = OBJ_NAME_PATH_SEPARATOR;
1996 }
1997 }
1998 /* Otherwise, call mountmgr to get DOS name */
1999 else
2000 {
2002 LocalReturnLength = LocalInfo->Name.Length + sizeof(OBJECT_NAME_INFORMATION) + sizeof(WCHAR);
2003 }
2004 }
2005
2006 /* Fall back if querying DOS name failed or if caller never wanted it ;-) */
2007 if (!QueryDosName || !NT_SUCCESS(Status))
2008 {
2009 /* Query the name */
2010 Status = ObQueryNameString(FileObject->DeviceObject,
2011 LocalInfo,
2012 Length,
2013 &LocalReturnLength);
2014 }
2015 else
2016 {
2017 NoObCall = TRUE;
2018 }
2019
2021 {
2022 /* Free the buffer and fail */
2023 ExFreePoolWithTag(LocalInfo, TAG_IO);
2024 return Status;
2025 }
2026
2027 /* Get buffer pointer */
2028 p = (PWCHAR)(ObjectNameInfo + 1);
2029
2030 _SEH2_TRY
2031 {
2032 /* Copy the information */
2033 if (QueryDosName && NoObCall)
2034 {
2036
2037 /* Copy structure first */
2038 RtlCopyMemory(ObjectNameInfo,
2039 LocalInfo,
2040 (Length >= LocalReturnLength ? sizeof(OBJECT_NAME_INFORMATION) : Length));
2041 /* Name then */
2042 RtlCopyMemory(p, LocalInfo->Name.Buffer,
2043 (Length >= LocalReturnLength ? LocalInfo->Name.Length : Length - sizeof(OBJECT_NAME_INFORMATION)));
2044
2045 if (FileObject->DeviceObject->DeviceType != FILE_DEVICE_NETWORK_FILE_SYSTEM)
2046 {
2047 ExFreePool(LocalInfo->Name.Buffer);
2048 }
2049 }
2050 else
2051 {
2052 RtlCopyMemory(ObjectNameInfo,
2053 LocalInfo,
2054 (LocalReturnLength > Length) ?
2055 Length : LocalReturnLength);
2056 }
2057
2058 /* Set buffer pointer */
2059 ObjectNameInfo->Name.Buffer = p;
2060
2061 /* Advance in buffer */
2062 p += (LocalInfo->Name.Length / sizeof(WCHAR));
2063
2064 /* Check if this already filled our buffer */
2065 if (LocalReturnLength > Length)
2066 {
2067 /* Set the length mismatch to true, so that we can return
2068 * the proper buffer size to the caller later
2069 */
2070 LengthMismatch = TRUE;
2071
2072 /* Save the initial buffer length value */
2073 *ReturnLength = LocalReturnLength;
2074 }
2075
2076 /* Now get the file name buffer and check the length needed */
2077 LocalFileInfo = (PFILE_NAME_INFORMATION)LocalInfo;
2078 FileLength = Length -
2079 LocalReturnLength +
2081
2082 /* Query the File name */
2083 if (PreviousMode == KernelMode &&
2085 {
2087 LengthMismatch ? Length : FileLength,
2089 LocalFileInfo,
2090 &LocalReturnLength);
2091 }
2092 else
2093 {
2096 LengthMismatch ? Length : FileLength,
2097 LocalFileInfo,
2098 &LocalReturnLength);
2099 }
2100 if (NT_ERROR(Status))
2101 {
2102 /* Allow status that would mean it's not implemented in the storage stack */
2105 {
2107 }
2108
2109 /* In such case, zero the output and reset the status */
2110 LocalReturnLength = FIELD_OFFSET(FILE_NAME_INFORMATION, FileName);
2111 LocalFileInfo->FileNameLength = 0;
2112 LocalFileInfo->FileName[0] = OBJ_NAME_PATH_SEPARATOR;
2114 }
2115 else
2116 {
2117 /* We'll at least return the name length */
2118 if (LocalReturnLength < FIELD_OFFSET(FILE_NAME_INFORMATION, FileName))
2119 {
2120 LocalReturnLength = FIELD_OFFSET(FILE_NAME_INFORMATION, FileName);
2121 }
2122 }
2123
2124 /* If the provided buffer is too small, return the required size */
2125 if (LengthMismatch)
2126 {
2127 /* Add the required length */
2128 *ReturnLength += LocalFileInfo->FileNameLength;
2129
2130 /* Free the allocated buffer and return failure */
2133 }
2134
2135 /* Now calculate the new lengths left */
2136 FileLength = LocalReturnLength -
2138 LocalReturnLength = (ULONG)((ULONG_PTR)p -
2139 (ULONG_PTR)ObjectNameInfo +
2140 LocalFileInfo->FileNameLength);
2141
2142 /* Don't copy the name if it's not valid */
2143 if (LocalFileInfo->FileName[0] != OBJ_NAME_PATH_SEPARATOR)
2144 {
2145 /* Free the allocated buffer and return failure */
2148 }
2149
2150 /* Write the Name and null-terminate it */
2151 RtlCopyMemory(p, LocalFileInfo->FileName, FileLength);
2152 p += (FileLength / sizeof(WCHAR));
2153 *p = UNICODE_NULL;
2154 LocalReturnLength += sizeof(UNICODE_NULL);
2155
2156 /* Return the length needed */
2157 *ReturnLength = LocalReturnLength;
2158
2159 /* Setup the length and maximum length */
2160 FileLength = (ULONG)((ULONG_PTR)p - (ULONG_PTR)ObjectNameInfo);
2161 ObjectNameInfo->Name.Length = (USHORT)FileLength -
2163 ObjectNameInfo->Name.MaximumLength = (USHORT)ObjectNameInfo->Name.Length +
2164 sizeof(UNICODE_NULL);
2165 }
2167 {
2168 /* Free buffer and return */
2169 ExFreePoolWithTag(LocalInfo, TAG_IO);
2170 } _SEH2_END;
2171
2172 return Status;
2173}
#define OBJ_NAME_PATH_SEPARATOR
Definition: arcname_tests.c:25
@ FileNameInformation
Definition: from_kernel.h:70
GLfloat GLfloat p
Definition: glext.h:8902
_Out_ PNDIS_HANDLE _Out_ PUINT FileLength
Definition: ndis.h:3228
struct _OBJECT_NAME_INFORMATION OBJECT_NAME_INFORMATION
NTSTATUS NTAPI IopGetFileInformation(IN PFILE_OBJECT FileObject, IN ULONG Length, IN FILE_INFORMATION_CLASS FileInfoClass, OUT PVOID Buffer, OUT PULONG ReturnedLength)
Definition: iofunc.c:777
NTSTATUS NTAPI IoVolumeDeviceToDosName(_In_ PVOID VolumeDeviceObject, _Out_ _When_(return==0, _At_(DosName->Buffer, __drv_allocatesMem(Mem))) PUNICODE_STRING DosName)
Definition: volume.c:1272
#define STATUS_OBJECT_PATH_INVALID
Definition: ntstatus.h:387
#define STATUS_INVALID_INFO_CLASS
Definition: ntstatus.h:333
NTSTATUS NTAPI ObQueryNameString(IN PVOID Object, OUT POBJECT_NAME_INFORMATION ObjectNameInfo, IN ULONG Length, OUT PULONG ReturnLength)
Definition: obname.c:1207
#define _SEH2_FINALLY
Definition: pseh2_64.h:153
#define _SEH2_LEAVE
Definition: pseh2_64.h:206
UNICODE_STRING Name
Definition: nt_native.h:1273
void * PVOID
Definition: typedefs.h:50
uint16_t * PWCHAR
Definition: typedefs.h:56
#define STATUS_INFO_LENGTH_MISMATCH
Definition: udferr_usr.h:133
#define NT_ERROR(Status)
Definition: umtypes.h:106
struct _FILE_NAME_INFORMATION * PFILE_NAME_INFORMATION

Referenced by IopQueryName(), and IoQueryFileDosDeviceName().

◆ IopSetDeviceSecurityDescriptor()

NTSTATUS NTAPI IopSetDeviceSecurityDescriptor ( IN PDEVICE_OBJECT  DeviceObject,
IN PSECURITY_INFORMATION  SecurityInformation,
IN PSECURITY_DESCRIPTOR  SecurityDescriptor,
IN POOL_TYPE  PoolType,
IN PGENERIC_MAPPING  GenericMapping 
)

Definition at line 1522 of file file.c.

1527{
1529 PSECURITY_DESCRIPTOR OldSecurityDescriptor, CachedSecurityDescriptor, NewSecurityDescriptor;
1530
1531 PAGED_CODE();
1532
1533 /* Keep attempting till we find our old SD or fail */
1534 while (TRUE)
1535 {
1538
1539 /* Get our old SD and reference it */
1540 OldSecurityDescriptor = DeviceObject->SecurityDescriptor;
1541 if (OldSecurityDescriptor != NULL)
1542 {
1543 ObReferenceSecurityDescriptor(OldSecurityDescriptor, 1);
1544 }
1545
1548
1549 /* Set the SD information */
1550 NewSecurityDescriptor = OldSecurityDescriptor;
1552 SecurityDescriptor, &NewSecurityDescriptor,
1554
1555 if (!NT_SUCCESS(Status))
1556 {
1557 if (OldSecurityDescriptor != NULL)
1558 {
1559 ObDereferenceSecurityDescriptor(OldSecurityDescriptor, 1);
1560 }
1561
1562 break;
1563 }
1564
1565 /* Add the new DS to the internal cache */
1566 Status = ObLogSecurityDescriptor(NewSecurityDescriptor,
1567 &CachedSecurityDescriptor, 1);
1568 ExFreePool(NewSecurityDescriptor);
1569 if (!NT_SUCCESS(Status))
1570 {
1571 ObDereferenceSecurityDescriptor(OldSecurityDescriptor, 1);
1572 break;
1573 }
1574
1577 /* Check if someone changed it in our back */
1578 if (DeviceObject->SecurityDescriptor == OldSecurityDescriptor)
1579 {
1580 /* We're clear, do the swap */
1581 DeviceObject->SecurityDescriptor = CachedSecurityDescriptor;
1584
1585 /* And dereference old SD (twice - us + not in use) */
1586 ObDereferenceSecurityDescriptor(OldSecurityDescriptor, 2);
1587
1588 break;
1589 }
1592
1593 /* If so, try again */
1594 ObDereferenceSecurityDescriptor(OldSecurityDescriptor, 1);
1595 ObDereferenceSecurityDescriptor(CachedSecurityDescriptor, 1);
1596 }
1597
1598 return Status;
1599}
VOID NTAPI ObDereferenceSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN ULONG Count)
Definition: obsdcach.c:287
VOID NTAPI ObReferenceSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN ULONG Count)
Definition: obsdcach.c:256
NTKERNELAPI NTSTATUS NTAPI SeSetSecurityDescriptorInfo(_In_opt_ PVOID Object, _In_ PSECURITY_INFORMATION SecurityInformation, _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, _Inout_ PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor, _In_ POOL_TYPE PoolType, _In_ PGENERIC_MAPPING GenericMapping)

Referenced by IopGetSetSecurityObject(), and IopSetDeviceSecurityDescriptors().

◆ IopSetDeviceSecurityDescriptors()

NTSTATUS NTAPI IopSetDeviceSecurityDescriptors ( IN PDEVICE_OBJECT  UpperDeviceObject,
IN PDEVICE_OBJECT  PhysicalDeviceObject,
IN PSECURITY_INFORMATION  SecurityInformation,
IN PSECURITY_DESCRIPTOR  SecurityDescriptor,
IN POOL_TYPE  PoolType,
IN PGENERIC_MAPPING  GenericMapping 
)

Definition at line 1603 of file file.c.

1609{
1610 PDEVICE_OBJECT CurrentDO = PhysicalDeviceObject, NextDevice;
1611 NTSTATUS Status = STATUS_SUCCESS, TmpStatus;
1612
1613 PAGED_CODE();
1614
1616
1617 /* We always reference the DO we're working on */
1618 ObReferenceObject(CurrentDO);
1619
1620 /* Go up from PDO to latest DO */
1621 do
1622 {
1623 /* Attempt to set the new SD on it */
1627 /* Was our last one? Remember that status then */
1628 if (CurrentDO == UpperDeviceObject)
1629 {
1630 Status = TmpStatus;
1631 }
1632
1633 /* Try to move to the next DO (and thus, reference it) */
1634 NextDevice = CurrentDO->AttachedDevice;
1635 if (NextDevice)
1636 {
1637 ObReferenceObject(NextDevice);
1638 }
1639
1640 /* Dereference current DO and move to the next one */
1641 ObDereferenceObject(CurrentDO);
1642 CurrentDO = NextDevice;
1643 }
1644 while (CurrentDO != NULL);
1645
1646 return Status;
1647}
PDEVICE_OBJECT PhysicalDeviceObject
Definition: btrfs_drv.h:1157

Referenced by IopGetSetSecurityObject().

◆ IoQueryFileDosDeviceName()

NTSTATUS NTAPI IoQueryFileDosDeviceName ( IN PFILE_OBJECT  FileObject,
OUT POBJECT_NAME_INFORMATION ObjectNameInformation 
)

Definition at line 3662 of file file.c.

3664{
3667 POBJECT_NAME_INFORMATION LocalInfo;
3668
3669 /* Start with a buffer length of 200 */
3670 ReturnLength = 200;
3671 /*
3672 * We'll loop until query works.
3673 * We will use returned length for next loop
3674 * iteration, trying to have a big enough buffer.
3675 */
3676 for (Length = 200; ; Length = ReturnLength)
3677 {
3678 /* Allocate our work buffer */
3679 LocalInfo = ExAllocatePoolWithTag(PagedPool, Length, 'nDoI');
3680 if (LocalInfo == NULL)
3681 {
3683 }
3684
3685 /* Query the DOS name */
3687 TRUE,
3688 TRUE,
3689 LocalInfo,
3690 Length,
3691 &ReturnLength,
3692 KernelMode);
3693 /* If it succeed, nothing more to do */
3694 if (Status == STATUS_SUCCESS)
3695 {
3696 break;
3697 }
3698
3699 /* Otherwise, prepare for re-allocation */
3700 ExFreePoolWithTag(LocalInfo, 'nDoI');
3701
3702 /*
3703 * If we failed because of something else
3704 * than memory, simply stop and fail here
3705 */
3707 {
3708 return Status;
3709 }
3710 }
3711
3712 /* Success case here: return our buffer */
3713 *ObjectNameInformation = LocalInfo;
3714 return STATUS_SUCCESS;
3715}
@ ObjectNameInformation
Definition: DriverTester.h:55

Referenced by NtQueryInformationProcess().

◆ IoRemoveShareAccess()

VOID NTAPI IoRemoveShareAccess ( IN PFILE_OBJECT  FileObject,
IN PSHARE_ACCESS  ShareAccess 
)

Definition at line 3477 of file file.c.

3479{
3480 PAGED_CODE();
3481
3482 /* Check if the file has an extension */
3484 {
3485 /* Check if caller specified to ignore access checks */
3486 //if (FileObject->FoExtFlags & IO_IGNORE_SHARE_ACCESS_CHECK)
3487 {
3488 /* Don't update share access */
3489 return;
3490 }
3491 }
3492
3493 /* Otherwise, check if there's any access present */
3494 if ((FileObject->ReadAccess) ||
3495 (FileObject->WriteAccess) ||
3496 (FileObject->DeleteAccess))
3497 {
3498 /* Decrement the open count */
3499 ShareAccess->OpenCount--;
3500
3501 /* Remove share access */
3502 ShareAccess->Readers -= FileObject->ReadAccess;
3503 ShareAccess->Writers -= FileObject->WriteAccess;
3504 ShareAccess->Deleters -= FileObject->DeleteAccess;
3505 ShareAccess->SharedRead -= FileObject->SharedRead;
3506 ShareAccess->SharedWrite -= FileObject->SharedWrite;
3507 ShareAccess->SharedDelete -= FileObject->SharedDelete;
3508 }
3509}

Referenced by _Dispatch_type_(), _Requires_lock_held_(), Ext2Cleanup(), Ext2CreateFile(), MupCleanupVcb(), open_file2(), RawCleanup(), UDFCommonCleanup(), UDFCommonCreate(), and VfatCleanupFile().

◆ IoSetFileOrigin()

NTSTATUS NTAPI IoSetFileOrigin ( IN PFILE_OBJECT  FileObject,
IN BOOLEAN  Remote 
)

Definition at line 3722 of file file.c.

3724{
3726 BOOLEAN FlagSet;
3727
3728 /* Get the flag status */
3729 FlagSet = FileObject->Flags & FO_REMOTE_ORIGIN ? TRUE : FALSE;
3730
3731 /* Don't set the flag if it was set already, and don't remove it if it wasn't set */
3732 if (Remote && !FlagSet)
3733 {
3734 /* Set the flag */
3735 FileObject->Flags |= FO_REMOTE_ORIGIN;
3736 }
3737 else if (!Remote && FlagSet)
3738 {
3739 /* Remove the flag */
3740 FileObject->Flags &= ~FO_REMOTE_ORIGIN;
3741 }
3742 else
3743 {
3744 /* Fail */
3746 }
3747
3748 /* Return status */
3749 return Status;
3750}
#define STATUS_INVALID_PARAMETER_MIX
Definition: ntstatus.h:378

◆ IoSetShareAccess()

VOID NTAPI IoSetShareAccess ( IN ACCESS_MASK  DesiredAccess,
IN ULONG  DesiredShareAccess,
IN PFILE_OBJECT  FileObject,
OUT PSHARE_ACCESS  ShareAccess 
)

Definition at line 3516 of file file.c.

3520{
3523 BOOLEAN DeleteAccess;
3524 BOOLEAN SharedRead;
3525 BOOLEAN SharedWrite;
3526 BOOLEAN SharedDelete;
3528 PAGED_CODE();
3529
3532 DeleteAccess = (DesiredAccess & DELETE) != 0;
3533
3534 /* Check if the file has an extension */
3536 {
3537 /* Check if caller specified to ignore access checks */
3538 //if (FileObject->FoExtFlags & IO_IGNORE_SHARE_ACCESS_CHECK)
3539 {
3540 /* Don't update share access */
3541 Update = FALSE;
3542 }
3543 }
3544
3545 /* Update basic access */
3546 FileObject->ReadAccess = ReadAccess;
3547 FileObject->WriteAccess = WriteAccess;
3548 FileObject->DeleteAccess = DeleteAccess;
3549
3550 /* Check if we have no access as all */
3551 if (!(ReadAccess) && !(WriteAccess) && !(DeleteAccess))
3552 {
3553 /* Check if we need to update the structure */
3554 if (!Update) return;
3555
3556 /* Otherwise, clear data */
3557 ShareAccess->OpenCount = 0;
3558 ShareAccess->Readers = 0;
3559 ShareAccess->Writers = 0;
3560 ShareAccess->Deleters = 0;
3561 ShareAccess->SharedRead = 0;
3562 ShareAccess->SharedWrite = 0;
3563 ShareAccess->SharedDelete = 0;
3564 }
3565 else
3566 {
3567 /* Calculate shared access */
3568 SharedRead = (DesiredShareAccess & FILE_SHARE_READ) != 0;
3569 SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE) != 0;
3570 SharedDelete = (DesiredShareAccess & FILE_SHARE_DELETE) != 0;
3571
3572 /* Set it in the FO */
3573 FileObject->SharedRead = SharedRead;
3574 FileObject->SharedWrite = SharedWrite;
3575 FileObject->SharedDelete = SharedDelete;
3576
3577 /* Check if we need to update the structure */
3578 if (!Update) return;
3579
3580 /* Otherwise, set data */
3581 ShareAccess->OpenCount = 1;
3582 ShareAccess->Readers = ReadAccess;
3583 ShareAccess->Writers = WriteAccess;
3584 ShareAccess->Deleters = DeleteAccess;
3585 ShareAccess->SharedRead = SharedRead;
3586 ShareAccess->SharedWrite = SharedWrite;
3587 ShareAccess->SharedDelete = SharedDelete;
3588 }
3589}

Referenced by Ext2CreateFile(), Ext2CreateVolume(), file_create(), open_file2(), RawCreate(), UDFCheckAccessRights(), and VfatCreateFile().

◆ IoUpdateShareAccess()

VOID NTAPI IoUpdateShareAccess ( IN PFILE_OBJECT  FileObject,
OUT PSHARE_ACCESS  ShareAccess 
)

Definition at line 3350 of file file.c.

3352{
3353 PAGED_CODE();
3354
3355 /* Check if the file has an extension */
3357 {
3358 /* Check if caller specified to ignore access checks */
3359 //if (FileObject->FoExtFlags & IO_IGNORE_SHARE_ACCESS_CHECK)
3360 {
3361 /* Don't update share access */
3362 return;
3363 }
3364 }
3365
3366 /* Otherwise, check if there's any access present */
3367 if ((FileObject->ReadAccess) ||
3368 (FileObject->WriteAccess) ||
3369 (FileObject->DeleteAccess))
3370 {
3371 /* Increase the open count */
3372 ShareAccess->OpenCount++;
3373
3374 /* Add new share access */
3375 ShareAccess->Readers += FileObject->ReadAccess;
3376 ShareAccess->Writers += FileObject->WriteAccess;
3377 ShareAccess->Deleters += FileObject->DeleteAccess;
3378 ShareAccess->SharedRead += FileObject->SharedRead;
3379 ShareAccess->SharedWrite += FileObject->SharedWrite;
3380 ShareAccess->SharedDelete += FileObject->SharedDelete;
3381 }
3382}

Referenced by open_file2(), UDFCheckAccessRights(), and VfatCreateFile().

◆ NtCancelIoFile()

NTSTATUS NTAPI NtCancelIoFile ( IN HANDLE  FileHandle,
OUT PIO_STATUS_BLOCK  IoStatusBlock 
)

Definition at line 4018 of file file.c.

4020{
4023 PIRP Irp;
4024 KIRQL OldIrql;
4025 BOOLEAN OurIrpsInList = FALSE;
4029 PLIST_ENTRY ListHead, NextEntry;
4030 PAGED_CODE();
4031 IOTRACE(IO_API_DEBUG, "FileHandle: %p\n", FileHandle);
4032
4033 /* Check the previous mode */
4034 if (PreviousMode != KernelMode)
4035 {
4036 /* Enter SEH for probing */
4037 _SEH2_TRY
4038 {
4039 /* Probe the I/O Status Block */
4041 }
4043 {
4044 /* Return the exception code */
4046 }
4047 _SEH2_END;
4048 }
4049
4050 /* Reference the file object */
4052 0,
4055 (PVOID*)&FileObject,
4056 NULL);
4057 if (!NT_SUCCESS(Status)) return Status;
4058
4059 /* IRP cancellations are synchronized at APC_LEVEL. */
4061
4062 /* Get the current thread */
4064
4065 /* Update the operation counts */
4067
4068 /* Loop the list */
4069 ListHead = &Thread->IrpList;
4070 NextEntry = ListHead->Flink;
4071 while (ListHead != NextEntry)
4072 {
4073 /* Get the IRP and check if the File Object matches */
4074 Irp = CONTAINING_RECORD(NextEntry, IRP, ThreadListEntry);
4075 if (Irp->Tail.Overlay.OriginalFileObject == FileObject)
4076 {
4077 /* Cancel this IRP and keep looping */
4079 OurIrpsInList = TRUE;
4080 }
4081
4082 /* Go to the next entry */
4083 NextEntry = NextEntry->Flink;
4084 }
4085
4086 /* Lower the IRQL */
4088
4089 /* Check if we had found an IRP */
4090 if (OurIrpsInList)
4091 {
4092 /* Setup a 10ms wait */
4093 Interval.QuadPart = -100000;
4094
4095 /* Start looping */
4096 while (OurIrpsInList)
4097 {
4098 /* Do the wait */
4100 OurIrpsInList = FALSE;
4101
4102 /* Raise IRQL */
4104
4105 /* Now loop the list again */
4106 NextEntry = ListHead->Flink;
4107 while (NextEntry != ListHead)
4108 {
4109 /* Get the IRP and check if the File Object matches */
4110 Irp = CONTAINING_RECORD(NextEntry, IRP, ThreadListEntry);
4111 if (Irp->Tail.Overlay.OriginalFileObject == FileObject)
4112 {
4113 /* Keep looping */
4114 OurIrpsInList = TRUE;
4115 break;
4116 }
4117
4118 /* Go to the next entry */
4119 NextEntry = NextEntry->Flink;
4120 }
4121
4122 /* Lower the IRQL */
4124 }
4125 }
4126
4127 /* Enter SEH for writing back the I/O Status */
4128 _SEH2_TRY
4129 {
4130 /* Write success */
4133 }
4135 {
4136 /* Ignore exception */
4137 }
4138 _SEH2_END;
4139
4140 /* Dereference the file object and return success */
4142 return STATUS_SUCCESS;
4143}
#define KeDelayExecutionThread(mode, foo, t)
Definition: env_spec_w32.h:484
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653
#define KeGetPreviousMode()
Definition: ketypes.h:1115
DWORD Interval
Definition: netstat.c:28
#define IO_API_DEBUG
Definition: io.h:21
BOOLEAN NTAPI IoCancelIrp(IN PIRP Irp)
Definition: irp.c:1133
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
Definition: obref.c:493
LIST_ENTRY IrpList
Definition: pstypes.h:1239
Definition: typedefs.h:120
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260

Referenced by CancelIo(), FlushConsoleInputBuffer(), init_func_ptrs(), rpcrt4_conn_np_close_read(), rpcrt4_conn_np_read(), and WaitForKeyboard().

◆ NtCreateFile()

NTSTATUS NTAPI NtCreateFile ( PHANDLE  FileHandle,
ACCESS_MASK  DesiredAccess,
POBJECT_ATTRIBUTES  ObjectAttributes,
PIO_STATUS_BLOCK  IoStatusBlock,
PLARGE_INTEGER  AllocateSize,
ULONG  FileAttributes,
ULONG  ShareAccess,
ULONG  CreateDisposition,
ULONG  CreateOptions,
PVOID  EaBuffer,
ULONG  EaLength 
)

Definition at line 3757 of file file.c.

3768{
3769 /* Call the I/O Function */
3770 return IoCreateFile(FileHandle,
3774 AllocateSize,
3779 EaBuffer,
3780 EaLength,
3782 NULL,
3783 0);
3784}
NTSTATUS NTAPI IoCreateFile(OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes, IN ULONG ShareAccess, IN ULONG Disposition, IN ULONG CreateOptions, IN PVOID EaBuffer OPTIONAL, IN ULONG EaLength, IN CREATE_FILE_TYPE CreateFileType, IN PVOID ExtraCreateParameters OPTIONAL, IN ULONG Options)
Definition: file.c:3009
_Must_inspect_result_ _In_opt_ WDFKEY _In_ PCUNICODE_STRING _In_ ACCESS_MASK _In_ ULONG _Out_opt_ PULONG CreateDisposition
Definition: wdfregistry.h:120

◆ NtCreateMailslotFile()

NTSTATUS NTAPI NtCreateMailslotFile ( OUT PHANDLE  FileHandle,
IN ACCESS_MASK  DesiredAccess,
IN POBJECT_ATTRIBUTES  ObjectAttributes,
OUT PIO_STATUS_BLOCK  IoStatusBlock,
IN ULONG  CreateOptions,
IN ULONG  MailslotQuota,
IN ULONG  MaxMessageSize,
IN PLARGE_INTEGER  TimeOut 
)

Definition at line 3788 of file file.c.

3796{
3798 PAGED_CODE();
3799
3800 /* Check for Timeout */
3801 if (TimeOut)
3802 {
3803 /* check if the call came from user mode */
3805 {
3806 /* Enter SEH for Probe */
3807 _SEH2_TRY
3808 {
3809 /* Probe the timeout */
3810 Buffer.ReadTimeout = ProbeForReadLargeInteger(TimeOut);
3811 }
3813 {
3814 /* Return the exception code */
3816 }
3817 _SEH2_END;
3818 }
3819 else
3820 {
3821 /* Otherwise, capture directly */
3822 Buffer.ReadTimeout = *TimeOut;
3823 }
3824
3825 /* Set the correct setting */
3826 Buffer.TimeoutSpecified = TRUE;
3827 }
3828 else
3829 {
3830 /* Tell the FSD we don't have a timeout */
3831 Buffer.TimeoutSpecified = FALSE;
3832 }
3833
3834 /* Set Settings */
3835 Buffer.MailslotQuota = MailslotQuota;
3836 Buffer.MaximumMessageSize = MaxMessageSize;
3837
3838 /* Call I/O */
3839 return IoCreateFile(FileHandle,
3843 NULL,
3844 0,
3848 NULL,
3849 0,
3851 (PVOID)&Buffer,
3852 0);
3853}

Referenced by CreateMailslotW(), and mailslot_test().

◆ NtCreateNamedPipeFile()

NTSTATUS NTAPI NtCreateNamedPipeFile ( OUT PHANDLE  FileHandle,
IN ACCESS_MASK  DesiredAccess,
IN POBJECT_ATTRIBUTES  ObjectAttributes,
OUT PIO_STATUS_BLOCK  IoStatusBlock,
IN ULONG  ShareAccess,
IN ULONG  CreateDisposition,
IN ULONG  CreateOptions,
IN ULONG  NamedPipeType,
IN ULONG  ReadMode,
IN ULONG  CompletionMode,
IN ULONG  MaximumInstances,
IN ULONG  InboundQuota,
IN ULONG  OutboundQuota,
IN PLARGE_INTEGER  DefaultTimeout 
)

Definition at line 3857 of file file.c.

3871{
3873 PAGED_CODE();
3874
3875 /* Check for Timeout */
3876 if (DefaultTimeout)
3877 {
3878 /* check if the call came from user mode */
3880 {
3881 /* Enter SEH for Probe */
3882 _SEH2_TRY
3883 {
3884 /* Probe the timeout */
3885 Buffer.DefaultTimeout =
3886 ProbeForReadLargeInteger(DefaultTimeout);
3887 }
3889 {
3890 /* Return the exception code */
3892 }
3893 _SEH2_END;
3894 }
3895 else
3896 {
3897 /* Otherwise, capture directly */
3898 Buffer.DefaultTimeout = *DefaultTimeout;
3899 }
3900
3901 /* Set the correct setting */
3902 Buffer.TimeoutSpecified = TRUE;
3903 }
3904 else
3905 {
3906 /* Tell the FSD we don't have a timeout */
3907 Buffer.TimeoutSpecified = FALSE;
3908 }
3909
3910 /* Set Settings */
3911 Buffer.NamedPipeType = NamedPipeType;
3912 Buffer.ReadMode = ReadMode;
3913 Buffer.CompletionMode = CompletionMode;
3914 Buffer.MaximumInstances = MaximumInstances;
3915 Buffer.InboundQuota = InboundQuota;
3916 Buffer.OutboundQuota = OutboundQuota;
3917
3918 /* Call I/O */
3919 return IoCreateFile(FileHandle,
3923 NULL,
3924 0,
3928 NULL,
3929 0,
3931 (PVOID)&Buffer,
3932 0);
3933}

Referenced by CreateNamedPipeW(), CreatePipe(), and init_func_ptrs().

◆ NtDeleteFile()

NTSTATUS NTAPI NtDeleteFile ( IN POBJECT_ATTRIBUTES  ObjectAttributes)

Definition at line 4150 of file file.c.

4151{
4153 DUMMY_FILE_OBJECT LocalFileObject;
4154 HANDLE Handle;
4156 OPEN_PACKET OpenPacket;
4157 PAGED_CODE();
4158 IOTRACE(IO_API_DEBUG, "FileMame: %wZ\n", ObjectAttributes->ObjectName);
4159
4160 /* Setup the Open Packet */
4161 RtlZeroMemory(&OpenPacket, sizeof(OPEN_PACKET));
4162 OpenPacket.Type = IO_TYPE_OPEN_PACKET;
4163 OpenPacket.Size = sizeof(OPEN_PACKET);
4165 OpenPacket.ShareAccess = FILE_SHARE_READ |
4168 OpenPacket.Disposition = FILE_OPEN;
4169 OpenPacket.DeleteOnly = TRUE;
4170 OpenPacket.LocalFileObject = &LocalFileObject;
4171
4172 /* Update the operation counts */
4174
4175 /*
4176 * Attempt opening the file. This will call the I/O Parse Routine for
4177 * the File Object (IopParseDevice) which will use the dummy file obejct
4178 * send the IRP to its device object. Note that we have two statuses
4179 * to worry about: the Object Manager's status (in Status) and the I/O
4180 * status, which is in the Open Packet's Final Status, and determined
4181 * by the Parse Check member.
4182 */
4184 NULL,
4185 AccessMode,
4186 NULL,
4187 DELETE,
4188 &OpenPacket,
4189 &Handle);
4190 if (OpenPacket.ParseCheck == FALSE) return Status;
4191
4192 /* Retrn the Io status */
4193 return OpenPacket.FinalStatus;
4194}

◆ NtFlushWriteBuffer()

NTSTATUS NTAPI NtFlushWriteBuffer ( VOID  )

Definition at line 3937 of file file.c.

3938{
3939 PAGED_CODE();
3940
3941 /* Call the kernel */
3943 return STATUS_SUCCESS;
3944}
VOID NTAPI KeFlushWriteBuffer(VOID)
Definition: misc.c:39

Referenced by InitSysCalls(), and Test_SyscallPerformance().

◆ NtOpenFile()

NTSTATUS NTAPI NtOpenFile ( OUT PHANDLE  FileHandle,
IN ACCESS_MASK  DesiredAccess,
IN POBJECT_ATTRIBUTES  ObjectAttributes,
OUT PIO_STATUS_BLOCK  IoStatusBlock,
IN ULONG  ShareAccess,
IN ULONG  OpenOptions 
)

Definition at line 3951 of file file.c.

3957{
3958 /* Call the I/O Function */
3959 return IoCreateFile(FileHandle,
3963 NULL,
3964 0,
3966 FILE_OPEN,
3968 NULL,
3969 0,
3971 NULL,
3972 0);
3973}

Referenced by AccpOpenNamedObject(), BtrfsDeviceAdd::AddDevice(), AddVolumeToList(), AllocConsole(), BasepMapFile(), BasepNotifyTrackingService(), BasepOpenFileForMove(), CabinetOpen(), CallCacheControl(), clean_main(), CommandDumpSector(), CommandPartInfo(), CreateDirectoryExW(), CreateDisk(), CreateHardLinkW(), CreatePartitionList(), CreatePipe(), CreateProcessInternalW(), DeleteFileW(), DismountVolume(), DoesPathExist_UStr(), DumpDisk(), DumpPartition(), find_devices(), FindFirstChangeNotificationW(), FindFirstFileExW(), FindNTOSInstallations(), FormatEx2(), GetCompressedFileSizeW(), GetDiskFreeSpaceExW(), GetDiskFreeSpaceW(), GetDriveTypeW(), GetFileSecurityW(), GetFileSystemName_UStr(), GetMountMgrHandle(), GetSourcePaths(), GetVolumeInformationW(), GetVolumeNameForRoot(), GetVolumePathNameW(), InferFileSystem(), InfOpenFile(), InfWriteFile(), IniCacheLoad(), InstallBootCodeToDisk(), InstallBootCodeToFile(), InstallSetupInfFile(), is_mounted_multi_device(), IsValidNTOSInstallation(), KsecOpenDevice(), LdrpCheckForLoadedDll(), LdrpCreateDllSection(), lookup_winsxs(), main(), MapFile(), mountmgr::mountmgr(), MoveFileWithProgressW(), MyDeleteFile(), NtOpenObject(), open_device_root(), open_file_test(), open_nt_file(), OpenAndMapFile(), OpenBootStore_UStr(), OpenDirectoryByHandleOrPath(), OpenFile(), OpenKeyboard(), OpenMountManager(), openTcpFile(), pOpenDeviceEx_UStr(), BtrfsDeviceAdd::populate_device_tree(), QueryDeviceInformation(), ReadBootCodeFromFile(), RegisterUncProvider(), RegRestoreKeyW(), RemoveDirectoryW(), ReplaceFileW(), resolve_symlink(), RtlSetCurrentDirectory_U(), SdbpOpenMemMappedFile(), SetFileAttributesW(), SetFileSecurityW(), SetupCopyFile(), SetupDeleteFile(), SetupMoveFile(), SetVolumeLabelW(), SmpCreateVolumeDescriptors(), SmpDeletePagingFile(), SmpGetPagingFileSize(), SmpGetVolumeFreeSpace(), SmpInitializeKnownDllsInternal(), SmpProcessFileRenames(), START_TEST(), Test_Device_StorDeviceNumber(), Test_ImageSection(), Test_ImageSection2(), Test_Other(), VfatFormat(), VfatxFormat(), WaitNamedPipeW(), WriteGptPartitions(), WriteMbrPartitions(), WritePartitions(), and xOpenFile().

◆ NtQueryAttributesFile()

NTSTATUS NTAPI NtQueryAttributesFile ( IN POBJECT_ATTRIBUTES  ObjectAttributes,
OUT PFILE_BASIC_INFORMATION  FileInformation 
)

Definition at line 3977 of file file.c.

3979{
3980 /* Call the internal helper API */
3983 sizeof(FILE_BASIC_INFORMATION),
3985}
NTSTATUS NTAPI IopQueryAttributesFile(IN POBJECT_ATTRIBUTES ObjectAttributes, IN FILE_INFORMATION_CLASS FileInformationClass, IN ULONG FileInformationSize, OUT PVOID FileInformation)
Definition: file.c:2343

Referenced by GetFileAttributesW(), GetVolumePathNameW(), and ReplaceFileW().

◆ NtQueryFullAttributesFile()

NTSTATUS NTAPI NtQueryFullAttributesFile ( IN POBJECT_ATTRIBUTES  ObjectAttributes,
OUT PFILE_NETWORK_OPEN_INFORMATION  FileInformation 
)

Definition at line 3989 of file file.c.

3991{
3992 /* Call the internal helper API */
3997}

Referenced by GetFileAttributesExW().

Variable Documentation

◆ IopSecurityResource

ERESOURCE IopSecurityResource
extern