mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 09:25:10 +00:00
[NTOS]
- Implement IoCreateFileSpecifyDeviceObjectHint - will be needed for fltmgr - Rename IoCreateFile to IopCreateFile and forward both IoCreateFile and IoCreateFileSpecifyDeviceObjectHint to that routine - Add support to IopParseDevice to check for a top level device hint and use that instead of the real device. - Create a file object extension in IopParseDevice and use that to store our top level device hint data - Update IoGetRelatedDeviceObject to check for file object extensions and return the 'fake' top level device if we have one svn path=/trunk/; revision=71862
This commit is contained in:
parent
5095fb9b9e
commit
7a8d83b7ea
3 changed files with 182 additions and 56 deletions
|
@ -85,6 +85,21 @@
|
|||
//
|
||||
#define IOP_MAX_REPARSE_TRAVERSAL 0x20
|
||||
|
||||
//
|
||||
// Private flags for IoCreateFile / IoParseDevice
|
||||
//
|
||||
#define IOP_USE_TOP_LEVEL_DEVICE_HINT 0x01
|
||||
#define IOP_CREATE_FILE_OBJECT_EXTENSION 0x02
|
||||
|
||||
|
||||
typedef struct _FILE_OBJECT_EXTENSION
|
||||
{
|
||||
PDEVICE_OBJECT TopDeviceObjectHint;
|
||||
|
||||
} FILE_OBJECT_EXTENSION, *PFILE_OBJECT_EXTENSION;
|
||||
|
||||
|
||||
|
||||
//
|
||||
// We can call the Ob Inlined API, it's the same thing
|
||||
//
|
||||
|
|
|
@ -1349,9 +1349,18 @@ IoGetRelatedDeviceObject(IN PFILE_OBJECT FileObject)
|
|||
/* Check if the extension is really present */
|
||||
if (FileObject->FileObjectExtension)
|
||||
{
|
||||
/* FIXME: Unhandled yet */
|
||||
DPRINT1("FOEs not supported\n");
|
||||
PFILE_OBJECT_EXTENSION FileObjectExtension;
|
||||
ASSERT(FALSE);
|
||||
|
||||
/* The extension buffer comes directly after the file object */
|
||||
FileObjectExtension = (PFILE_OBJECT_EXTENSION)(FileObject + 1);
|
||||
|
||||
/* Check if have a replacement top level device */
|
||||
if (FileObjectExtension->TopDeviceObjectHint)
|
||||
{
|
||||
/* Use this instead of returning the top level device */
|
||||
return FileObjectExtension->TopDeviceObjectHint;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -586,13 +586,16 @@ IopParseDevice(IN PVOID ParseObject,
|
|||
|
||||
/* Reference it */
|
||||
InterlockedIncrement((PLONG)&Vpb->ReferenceCount);
|
||||
|
||||
/* Check if we were given a specific top level device to use */
|
||||
if (OpenPacket->InternalFlags & IOP_USE_TOP_LEVEL_DEVICE_HINT)
|
||||
{
|
||||
DeviceObject = Vpb->DeviceObject;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* The device object is the one we were given */
|
||||
DeviceObject = OriginalDeviceObject;
|
||||
|
||||
/* Check if it has a VPB */
|
||||
if ((OriginalDeviceObject->Vpb) && !(DirectOpen))
|
||||
{
|
||||
|
@ -606,15 +609,27 @@ IopParseDevice(IN PVOID ParseObject,
|
|||
/* Get the VPB's device object */
|
||||
DeviceObject = Vpb->DeviceObject;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* The device object is the one we were given */
|
||||
DeviceObject = OriginalDeviceObject;
|
||||
}
|
||||
|
||||
/* Check if there's an attached device */
|
||||
if (DeviceObject->AttachedDevice)
|
||||
/* If we weren't given a specific top level device, look for an attached device */
|
||||
if (!(OpenPacket->InternalFlags & IOP_USE_TOP_LEVEL_DEVICE_HINT) &&
|
||||
DeviceObject->AttachedDevice)
|
||||
{
|
||||
/* Get the attached device */
|
||||
DeviceObject = IoGetAttachedDevice(DeviceObject);
|
||||
}
|
||||
}
|
||||
|
||||
if (OpenPacket->InternalFlags & IOP_USE_TOP_LEVEL_DEVICE_HINT)
|
||||
{
|
||||
// FIXME: Verify our device object is good to use
|
||||
ASSERT(DirectOpen == FALSE);
|
||||
}
|
||||
|
||||
/* If we traversed a mount point, reset the information */
|
||||
if (OpenPacket->TraversedMountPoint)
|
||||
{
|
||||
|
@ -706,6 +721,12 @@ IopParseDevice(IN PVOID ParseObject,
|
|||
/* Check if we really need to create an object */
|
||||
if (!UseDummyFile)
|
||||
{
|
||||
ULONG ObjectSize = sizeof(FILE_OBJECT);
|
||||
|
||||
/* Tag on space for a file object extension */
|
||||
if (OpenPacket->InternalFlags & IOP_CREATE_FILE_OBJECT_EXTENSION)
|
||||
ObjectSize += sizeof(FILE_OBJECT_EXTENSION);
|
||||
|
||||
/* Create the actual file object */
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
NULL,
|
||||
|
@ -717,7 +738,7 @@ IopParseDevice(IN PVOID ParseObject,
|
|||
&ObjectAttributes,
|
||||
AccessMode,
|
||||
NULL,
|
||||
sizeof(FILE_OBJECT),
|
||||
ObjectSize,
|
||||
0,
|
||||
0,
|
||||
(PVOID*)&FileObject);
|
||||
|
@ -787,6 +808,23 @@ IopParseDevice(IN PVOID ParseObject,
|
|||
/* Set the correct flag for the FSD to read */
|
||||
FileObject->Flags |= FO_RANDOM_ACCESS;
|
||||
}
|
||||
|
||||
/* Check if we were asked to setup a file object extension */
|
||||
if (OpenPacket->InternalFlags & IOP_CREATE_FILE_OBJECT_EXTENSION)
|
||||
{
|
||||
PFILE_OBJECT_EXTENSION FileObjectExtension;
|
||||
|
||||
/* Make sure the file object knows it has an extension */
|
||||
FileObject->Flags |= FO_FILE_OBJECT_HAS_EXTENSION;
|
||||
|
||||
FileObjectExtension = (PFILE_OBJECT_EXTENSION)(FileObject + 1);
|
||||
|
||||
/* Add the top level device which we'll send the request to */
|
||||
if (OpenPacket->InternalFlags & IOP_USE_TOP_LEVEL_DEVICE_HINT)
|
||||
{
|
||||
FileObjectExtension->TopDeviceObjectHint = DeviceObject;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -2116,53 +2154,24 @@ IoChangeFileObjectFilterContext(IN PFILE_OBJECT FileObject,
|
|||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IoCheckQuerySetFileInformation(IN FILE_INFORMATION_CLASS FileInformationClass,
|
||||
IN ULONG Length,
|
||||
IN BOOLEAN SetOperation)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IoCheckQuotaBufferValidity(IN PFILE_QUOTA_INFORMATION QuotaBuffer,
|
||||
IN ULONG QuotaLength,
|
||||
OUT PULONG ErrorOffset)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
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)
|
||||
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)
|
||||
{
|
||||
KPROCESSOR_MODE AccessMode;
|
||||
HANDLE LocalHandle = 0;
|
||||
|
@ -2171,7 +2180,7 @@ IoCreateFile(OUT PHANDLE FileHandle,
|
|||
PNAMED_PIPE_CREATE_PARAMETERS NamedPipeCreateParameters;
|
||||
POPEN_PACKET OpenPacket;
|
||||
ULONG EaErrorOffset;
|
||||
PAGED_CODE();
|
||||
|
||||
IOTRACE(IO_FILE_DEBUG, "FileName: %wZ\n", ObjectAttributes->ObjectName);
|
||||
|
||||
|
||||
|
@ -2451,6 +2460,8 @@ IoCreateFile(OUT PHANDLE FileHandle,
|
|||
OpenPacket->Disposition = Disposition;
|
||||
OpenPacket->CreateFileType = CreateFileType;
|
||||
OpenPacket->ExtraCreateParameters = ExtraCreateParameters;
|
||||
OpenPacket->InternalFlags = Flags;
|
||||
OpenPacket->TopDeviceObjectHint = DeviceObject;
|
||||
|
||||
/* Update the operation count */
|
||||
IopUpdateOperationCount(IopOtherTransfer);
|
||||
|
@ -2567,6 +2578,74 @@ IoCreateFile(OUT PHANDLE FileHandle,
|
|||
return Status;
|
||||
}
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IoCheckQuerySetFileInformation(IN FILE_INFORMATION_CLASS FileInformationClass,
|
||||
IN ULONG Length,
|
||||
IN BOOLEAN SetOperation)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IoCheckQuotaBufferValidity(IN PFILE_QUOTA_INFORMATION QuotaBuffer,
|
||||
IN ULONG QuotaLength,
|
||||
OUT PULONG ErrorOffset)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
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)
|
||||
{
|
||||
PAGED_CODE();
|
||||
|
||||
return IopCreateFile(FileHandle,
|
||||
DesiredAccess,
|
||||
ObjectAttributes,
|
||||
IoStatusBlock,
|
||||
AllocationSize,
|
||||
FileAttributes,
|
||||
ShareAccess,
|
||||
Disposition,
|
||||
CreateOptions,
|
||||
EaBuffer,
|
||||
EaLength,
|
||||
CreateFileType,
|
||||
ExtraCreateParameters,
|
||||
Options,
|
||||
0,
|
||||
NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
|
@ -2588,8 +2667,31 @@ IoCreateFileSpecifyDeviceObjectHint(OUT PHANDLE FileHandle,
|
|||
IN ULONG Options,
|
||||
IN PVOID DeviceObject)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
ULONG Flags = 0;
|
||||
|
||||
/* Check if we were passed a device to send the create request to*/
|
||||
if (DeviceObject)
|
||||
{
|
||||
/* We'll tag this request into a file object extension */
|
||||
Flags = (IOP_CREATE_FILE_OBJECT_EXTENSION | IOP_USE_TOP_LEVEL_DEVICE_HINT);
|
||||
}
|
||||
|
||||
return IopCreateFile(FileHandle,
|
||||
DesiredAccess,
|
||||
ObjectAttributes,
|
||||
IoStatusBlock,
|
||||
AllocationSize,
|
||||
FileAttributes,
|
||||
ShareAccess,
|
||||
Disposition,
|
||||
CreateOptions,
|
||||
EaBuffer,
|
||||
EaLength,
|
||||
CreateFileType,
|
||||
ExtraCreateParameters,
|
||||
Options | IO_NO_PARAMETER_CHECKING,
|
||||
Flags,
|
||||
DeviceObject);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue