mirror of
https://github.com/winfsp/winfsp.git
synced 2025-06-08 04:52:10 -05:00
sys: renamed "main stream" to "main file"
This commit is contained in:
parent
5c3a82a074
commit
03df0a9c26
@ -168,7 +168,7 @@ static VOID FspFsvolCleanupRequestFini(FSP_FSCTL_TRANSACT_REQ *Request, PVOID Co
|
|||||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
FSP_FILE_NODE *FileNode = FileObject->FsContext;
|
FSP_FILE_NODE *FileNode = FileObject->FsContext;
|
||||||
FSP_FILE_DESC *FileDesc = FileObject->FsContext2;
|
FSP_FILE_DESC *FileDesc = FileObject->FsContext2;
|
||||||
HANDLE MainStreamHandle;
|
HANDLE MainFileHandle;
|
||||||
|
|
||||||
ASSERT(FileNode == FileDesc->FileNode);
|
ASSERT(FileNode == FileDesc->FileNode);
|
||||||
|
|
||||||
@ -176,12 +176,12 @@ static VOID FspFsvolCleanupRequestFini(FSP_FSCTL_TRANSACT_REQ *Request, PVOID Co
|
|||||||
|
|
||||||
FspFileNodeCleanupComplete(FileNode, FileObject);
|
FspFileNodeCleanupComplete(FileNode, FileObject);
|
||||||
|
|
||||||
MainStreamHandle = FileDesc->MainStreamHandle;
|
MainFileHandle = FileDesc->MainFileHandle;
|
||||||
FileDesc->MainStreamHandle = 0;
|
FileDesc->MainFileHandle = 0;
|
||||||
|
|
||||||
FspFileNodeReleaseOwner(FileNode, Main, Request);
|
FspFileNodeReleaseOwner(FileNode, Main, Request);
|
||||||
|
|
||||||
FspMainStreamClose(MainStreamHandle, 0);
|
FspMainFileClose(MainFileHandle, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS FspCleanup(
|
NTSTATUS FspCleanup(
|
||||||
|
@ -77,7 +77,7 @@ static NTSTATUS FspFsvolClose(
|
|||||||
FspFileNodeClose(FileNode, FileObject);
|
FspFileNodeClose(FileNode, FileObject);
|
||||||
|
|
||||||
/* delete the FileDesc and deref the FileNode; order is important (FileDesc has FileNode ref) */
|
/* delete the FileDesc and deref the FileNode; order is important (FileDesc has FileNode ref) */
|
||||||
FspFileDescDelete(FileDesc); /* this will also close the MainStreamObject if any */
|
FspFileDescDelete(FileDesc); /* this will also close the MainFileObject if any */
|
||||||
FspFileNodeDereference(FileNode);
|
FspFileNodeDereference(FileNode);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -147,7 +147,7 @@ static NTSTATUS FspFsvolCreateNoLock(
|
|||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
UNICODE_STRING MainStreamName = { 0 }, StreamPart = { 0 };
|
UNICODE_STRING MainFileName = { 0 }, StreamPart = { 0 };
|
||||||
PACCESS_STATE AccessState = IrpSp->Parameters.Create.SecurityContext->AccessState;
|
PACCESS_STATE AccessState = IrpSp->Parameters.Create.SecurityContext->AccessState;
|
||||||
ULONG CreateDisposition = (IrpSp->Parameters.Create.Options >> 24) & 0xff;
|
ULONG CreateDisposition = (IrpSp->Parameters.Create.Options >> 24) & 0xff;
|
||||||
ULONG CreateOptions = IrpSp->Parameters.Create.Options;
|
ULONG CreateOptions = IrpSp->Parameters.Create.Options;
|
||||||
@ -232,9 +232,9 @@ static NTSTATUS FspFsvolCreateNoLock(
|
|||||||
(((PUINT8)StreamPart.Buffer + StreamPart.Length / sizeof(WCHAR)) -
|
(((PUINT8)StreamPart.Buffer + StreamPart.Length / sizeof(WCHAR)) -
|
||||||
(PUINT8)FileName.Buffer - 1);
|
(PUINT8)FileName.Buffer - 1);
|
||||||
|
|
||||||
MainStreamName.Length = MainStreamName.MaximumLength = (USHORT)
|
MainFileName.Length = MainFileName.MaximumLength = (USHORT)
|
||||||
((PUINT8)StreamPart.Buffer - (PUINT8)FileName.Buffer - 1);
|
((PUINT8)StreamPart.Buffer - (PUINT8)FileName.Buffer - 1);
|
||||||
MainStreamName.Buffer = FileName.Buffer;
|
MainFileName.Buffer = FileName.Buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* is this a relative or absolute open? */
|
/* is this a relative or absolute open? */
|
||||||
@ -351,19 +351,19 @@ static NTSTATUS FspFsvolCreateNoLock(
|
|||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if we have a non-empty stream part, open the main stream */
|
/* if we have a non-empty stream part, open the main file */
|
||||||
if (0 != StreamPart.Buffer)
|
if (0 != StreamPart.Buffer)
|
||||||
{
|
{
|
||||||
Result = FspMainStreamOpen(FsvolDeviceObject,
|
Result = FspMainFileOpen(FsvolDeviceObject,
|
||||||
&MainStreamName, CaseSensitive,
|
&MainFileName, CaseSensitive,
|
||||||
CreateDisposition,
|
CreateDisposition,
|
||||||
&FileDesc->MainStreamHandle,
|
&FileDesc->MainFileHandle,
|
||||||
&FileDesc->MainStreamObject);
|
&FileDesc->MainFileObject);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
goto main_stream_exit;
|
goto main_stream_exit;
|
||||||
|
|
||||||
/* check that the main stream is one we recognize */
|
/* check that the main file is one we recognize */
|
||||||
if (!FspFileNodeIsValid(FileDesc->MainStreamObject->FsContext))
|
if (!FspFileNodeIsValid(FileDesc->MainFileObject->FsContext))
|
||||||
{
|
{
|
||||||
Result = STATUS_OBJECT_NAME_NOT_FOUND;
|
Result = STATUS_OBJECT_NAME_NOT_FOUND;
|
||||||
goto main_stream_exit;
|
goto main_stream_exit;
|
||||||
@ -383,8 +383,8 @@ static NTSTATUS FspFsvolCreateNoLock(
|
|||||||
goto main_stream_exit;
|
goto main_stream_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* remember the the main stream node */
|
/* remember the main file node */
|
||||||
FileNode->MainStreamFileNode = FileDesc->MainStreamObject->FsContext;
|
FileNode->MainFileNode = FileDesc->MainFileObject->FsContext;
|
||||||
|
|
||||||
Result = STATUS_SUCCESS;
|
Result = STATUS_SUCCESS;
|
||||||
|
|
||||||
|
@ -431,15 +431,15 @@ VOID FspUnicodePathSuffix(PUNICODE_STRING Path, PUNICODE_STRING Remain, PUNICODE
|
|||||||
NTSTATUS FspCreateGuid(GUID *Guid);
|
NTSTATUS FspCreateGuid(GUID *Guid);
|
||||||
NTSTATUS FspGetDeviceObjectPointer(PUNICODE_STRING ObjectName, ACCESS_MASK DesiredAccess,
|
NTSTATUS FspGetDeviceObjectPointer(PUNICODE_STRING ObjectName, ACCESS_MASK DesiredAccess,
|
||||||
PULONG PFileNameIndex, PFILE_OBJECT *PFileObject, PDEVICE_OBJECT *PDeviceObject);
|
PULONG PFileNameIndex, PFILE_OBJECT *PFileObject, PDEVICE_OBJECT *PDeviceObject);
|
||||||
NTSTATUS FspMainStreamOpen(
|
NTSTATUS FspMainFileOpen(
|
||||||
PDEVICE_OBJECT DeviceObject,
|
PDEVICE_OBJECT DeviceObject,
|
||||||
PUNICODE_STRING MainStreamName, BOOLEAN CaseSensitive,
|
PUNICODE_STRING MainFileName, BOOLEAN CaseSensitive,
|
||||||
ULONG Disposition,
|
ULONG Disposition,
|
||||||
PHANDLE PMainStreamHandle,
|
PHANDLE PMainFileHandle,
|
||||||
PFILE_OBJECT *PMainStreamObject);
|
PFILE_OBJECT *PMainFileObject);
|
||||||
NTSTATUS FspMainStreamClose(
|
NTSTATUS FspMainFileClose(
|
||||||
HANDLE MainStreamHandle,
|
HANDLE MainFileHandle,
|
||||||
PFILE_OBJECT MainStreamObject);
|
PFILE_OBJECT MainFileObject);
|
||||||
NTSTATUS FspSendSetInformationIrp(PDEVICE_OBJECT DeviceObject, PFILE_OBJECT FileObject,
|
NTSTATUS FspSendSetInformationIrp(PDEVICE_OBJECT DeviceObject, PFILE_OBJECT FileObject,
|
||||||
FILE_INFORMATION_CLASS FileInformationClass, PVOID FileInformation, ULONG Length);
|
FILE_INFORMATION_CLASS FileInformationClass, PVOID FileInformation, ULONG Length);
|
||||||
NTSTATUS FspBufferUserBuffer(PIRP Irp, ULONG Length, LOCK_OPERATION Operation);
|
NTSTATUS FspBufferUserBuffer(PIRP Irp, ULONG Length, LOCK_OPERATION Operation);
|
||||||
@ -916,8 +916,8 @@ typedef struct FSP_FILE_NODE
|
|||||||
LONG OpenCount; /* ContextTable ref count */
|
LONG OpenCount; /* ContextTable ref count */
|
||||||
LONG HandleCount; /* HANDLE count (CREATE/CLEANUP) */
|
LONG HandleCount; /* HANDLE count (CREATE/CLEANUP) */
|
||||||
SHARE_ACCESS ShareAccess;
|
SHARE_ACCESS ShareAccess;
|
||||||
ULONG MainStreamDenyDeleteCount; /* number of times main stream is denying delete */
|
ULONG MainFileDenyDeleteCount; /* number of times main file is denying delete */
|
||||||
ULONG StreamDenyDeleteCount; /* number of open streams that are denying delete */
|
ULONG StreamDenyDeleteCount; /* number of times open streams are denying delete */
|
||||||
FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT ContextByNameElementStorage;
|
FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT ContextByNameElementStorage;
|
||||||
/* locked under FSP_FSVOL_DEVICE_EXTENSION::FileRenameResource or Header.Resource */
|
/* locked under FSP_FSVOL_DEVICE_EXTENSION::FileRenameResource or Header.Resource */
|
||||||
UNICODE_STRING FileName;
|
UNICODE_STRING FileName;
|
||||||
@ -952,7 +952,7 @@ typedef struct FSP_FILE_NODE
|
|||||||
UINT64 IndexNumber;
|
UINT64 IndexNumber;
|
||||||
BOOLEAN IsDirectory;
|
BOOLEAN IsDirectory;
|
||||||
BOOLEAN IsRootDirectory;
|
BOOLEAN IsRootDirectory;
|
||||||
struct FSP_FILE_NODE *MainStreamFileNode; /* this becomes invalid after our last desc close */
|
struct FSP_FILE_NODE *MainFileNode; /* this becomes invalid after our last desc close */
|
||||||
WCHAR FileNameBuf[];
|
WCHAR FileNameBuf[];
|
||||||
} FSP_FILE_NODE;
|
} FSP_FILE_NODE;
|
||||||
typedef struct
|
typedef struct
|
||||||
@ -968,8 +968,8 @@ typedef struct
|
|||||||
UINT64 DirInfo;
|
UINT64 DirInfo;
|
||||||
ULONG DirInfoCacheHint;
|
ULONG DirInfoCacheHint;
|
||||||
/* stream support */
|
/* stream support */
|
||||||
HANDLE MainStreamHandle;
|
HANDLE MainFileHandle;
|
||||||
PFILE_OBJECT MainStreamObject;
|
PFILE_OBJECT MainFileObject;
|
||||||
} FSP_FILE_DESC;
|
} FSP_FILE_DESC;
|
||||||
NTSTATUS FspFileNodeCopyList(PDEVICE_OBJECT DeviceObject,
|
NTSTATUS FspFileNodeCopyList(PDEVICE_OBJECT DeviceObject,
|
||||||
FSP_FILE_NODE ***PFileNodes, PULONG PFileNodeCount);
|
FSP_FILE_NODE ***PFileNodes, PULONG PFileNodeCount);
|
||||||
|
@ -427,13 +427,13 @@ FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
|
|||||||
FspFsvolDeviceLockContextTable(FsvolDeviceObject);
|
FspFsvolDeviceLockContextTable(FsvolDeviceObject);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If this is a named stream we must also check with our main stream.
|
* If this is a named stream we must also check with our main file.
|
||||||
* Note that FileNode->MainStreamFileNode and OpenedFileNode->MainStreamFileNode
|
* Note that FileNode->MainFileNode and OpenedFileNode->MainFileNode
|
||||||
* will always be the same.
|
* will always be the same.
|
||||||
*/
|
*/
|
||||||
if (0 != FileNode->MainStreamFileNode)
|
if (0 != FileNode->MainFileNode)
|
||||||
{
|
{
|
||||||
DeletePending = 0 != FileNode->MainStreamFileNode->DeletePending;
|
DeletePending = 0 != FileNode->MainFileNode->DeletePending;
|
||||||
MemoryBarrier();
|
MemoryBarrier();
|
||||||
if (DeletePending)
|
if (DeletePending)
|
||||||
{
|
{
|
||||||
@ -441,7 +441,7 @@ FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 < FileNode->MainStreamFileNode->MainStreamDenyDeleteCount)
|
if (0 < FileNode->MainFileNode->MainFileDenyDeleteCount)
|
||||||
{
|
{
|
||||||
if (FlagOn(GrantedAccess, DELETE))
|
if (FlagOn(GrantedAccess, DELETE))
|
||||||
{
|
{
|
||||||
@ -474,7 +474,7 @@ FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
|
|||||||
* opening a prior FileNode that we found in the table.
|
* opening a prior FileNode that we found in the table.
|
||||||
*/
|
*/
|
||||||
ASSERT(OpenedFileNode != FileNode);
|
ASSERT(OpenedFileNode != FileNode);
|
||||||
ASSERT(OpenedFileNode->MainStreamFileNode == FileNode->MainStreamFileNode);
|
ASSERT(OpenedFileNode->MainFileNode == FileNode->MainFileNode);
|
||||||
|
|
||||||
DeletePending = 0 != OpenedFileNode->DeletePending;
|
DeletePending = 0 != OpenedFileNode->DeletePending;
|
||||||
MemoryBarrier();
|
MemoryBarrier();
|
||||||
@ -484,11 +484,11 @@ FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if this is a main stream check whether there is a named stream that denies delete */
|
/* if this is a main file check whether there is a named stream that denies delete */
|
||||||
if (0 < OpenedFileNode->StreamDenyDeleteCount)
|
if (0 < OpenedFileNode->StreamDenyDeleteCount)
|
||||||
{
|
{
|
||||||
/* we must be the main stream! */
|
/* we must be the main file! */
|
||||||
ASSERT(0 == OpenedFileNode->MainStreamFileNode);
|
ASSERT(0 == OpenedFileNode->MainFileNode);
|
||||||
|
|
||||||
if (FlagOn(GrantedAccess, DELETE))
|
if (FlagOn(GrantedAccess, DELETE))
|
||||||
{
|
{
|
||||||
@ -529,10 +529,10 @@ FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
|
|||||||
|
|
||||||
if (FileObject->DeleteAccess && !FileObject->SharedDelete)
|
if (FileObject->DeleteAccess && !FileObject->SharedDelete)
|
||||||
{
|
{
|
||||||
if (0 == OpenedFileNode->MainStreamFileNode)
|
if (0 == OpenedFileNode->MainFileNode)
|
||||||
OpenedFileNode->MainStreamDenyDeleteCount++;
|
OpenedFileNode->MainFileDenyDeleteCount++;
|
||||||
else
|
else
|
||||||
OpenedFileNode->MainStreamFileNode->StreamDenyDeleteCount++;
|
OpenedFileNode->MainFileNode->StreamDenyDeleteCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
Result = STATUS_SUCCESS;
|
Result = STATUS_SUCCESS;
|
||||||
@ -615,10 +615,10 @@ VOID FspFileNodeCleanupComplete(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject
|
|||||||
|
|
||||||
if (FileObject->DeleteAccess && !FileObject->SharedDelete)
|
if (FileObject->DeleteAccess && !FileObject->SharedDelete)
|
||||||
{
|
{
|
||||||
if (0 == FileNode->MainStreamFileNode)
|
if (0 == FileNode->MainFileNode)
|
||||||
FileNode->MainStreamDenyDeleteCount--;
|
FileNode->MainFileDenyDeleteCount--;
|
||||||
else
|
else
|
||||||
FileNode->MainStreamFileNode->StreamDenyDeleteCount--;
|
FileNode->MainFileNode->StreamDenyDeleteCount--;
|
||||||
}
|
}
|
||||||
|
|
||||||
IoRemoveShareAccess(FileObject, &FileNode->ShareAccess);
|
IoRemoveShareAccess(FileObject, &FileNode->ShareAccess);
|
||||||
@ -1153,7 +1153,7 @@ VOID FspFileDescDelete(FSP_FILE_DESC *FileDesc)
|
|||||||
{
|
{
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
FspMainStreamClose(FileDesc->MainStreamHandle, FileDesc->MainStreamObject);
|
FspMainFileClose(FileDesc->MainFileHandle, FileDesc->MainFileObject);
|
||||||
|
|
||||||
if (0 != FileDesc->DirectoryPattern.Buffer &&
|
if (0 != FileDesc->DirectoryPattern.Buffer &&
|
||||||
FspFileDescDirectoryPatternMatchAll != FileDesc->DirectoryPattern.Buffer)
|
FspFileDescDirectoryPatternMatchAll != FileDesc->DirectoryPattern.Buffer)
|
||||||
|
@ -23,15 +23,15 @@ VOID FspUnicodePathSuffix(PUNICODE_STRING Path, PUNICODE_STRING Remain, PUNICODE
|
|||||||
NTSTATUS FspCreateGuid(GUID *Guid);
|
NTSTATUS FspCreateGuid(GUID *Guid);
|
||||||
NTSTATUS FspGetDeviceObjectPointer(PUNICODE_STRING ObjectName, ACCESS_MASK DesiredAccess,
|
NTSTATUS FspGetDeviceObjectPointer(PUNICODE_STRING ObjectName, ACCESS_MASK DesiredAccess,
|
||||||
PULONG PFileNameIndex, PFILE_OBJECT *PFileObject, PDEVICE_OBJECT *PDeviceObject);
|
PULONG PFileNameIndex, PFILE_OBJECT *PFileObject, PDEVICE_OBJECT *PDeviceObject);
|
||||||
NTSTATUS FspMainStreamOpen(
|
NTSTATUS FspMainFileOpen(
|
||||||
PDEVICE_OBJECT DeviceObject,
|
PDEVICE_OBJECT DeviceObject,
|
||||||
PUNICODE_STRING MainStreamName, BOOLEAN CaseSensitive,
|
PUNICODE_STRING MainFileName, BOOLEAN CaseSensitive,
|
||||||
ULONG Disposition,
|
ULONG Disposition,
|
||||||
PHANDLE PMainStreamHandle,
|
PHANDLE PMainFileHandle,
|
||||||
PFILE_OBJECT *PMainStreamObject);
|
PFILE_OBJECT *PMainFileObject);
|
||||||
NTSTATUS FspMainStreamClose(
|
NTSTATUS FspMainFileClose(
|
||||||
HANDLE MainStreamHandle,
|
HANDLE MainFileHandle,
|
||||||
PFILE_OBJECT MainStreamObject);
|
PFILE_OBJECT MainFileObject);
|
||||||
NTSTATUS FspSendSetInformationIrp(PDEVICE_OBJECT DeviceObject, PFILE_OBJECT FileObject,
|
NTSTATUS FspSendSetInformationIrp(PDEVICE_OBJECT DeviceObject, PFILE_OBJECT FileObject,
|
||||||
FILE_INFORMATION_CLASS FileInformationClass, PVOID FileInformation, ULONG Length);
|
FILE_INFORMATION_CLASS FileInformationClass, PVOID FileInformation, ULONG Length);
|
||||||
static NTSTATUS FspSendSetInformationIrpCompletion(
|
static NTSTATUS FspSendSetInformationIrpCompletion(
|
||||||
@ -102,8 +102,8 @@ NTSTATUS FspIrpHookNext(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context);
|
|||||||
#pragma alloc_text(PAGE, FspUnicodePathSuffix)
|
#pragma alloc_text(PAGE, FspUnicodePathSuffix)
|
||||||
#pragma alloc_text(PAGE, FspCreateGuid)
|
#pragma alloc_text(PAGE, FspCreateGuid)
|
||||||
#pragma alloc_text(PAGE, FspGetDeviceObjectPointer)
|
#pragma alloc_text(PAGE, FspGetDeviceObjectPointer)
|
||||||
#pragma alloc_text(PAGE, FspMainStreamOpen)
|
#pragma alloc_text(PAGE, FspMainFileOpen)
|
||||||
#pragma alloc_text(PAGE, FspMainStreamClose)
|
#pragma alloc_text(PAGE, FspMainFileClose)
|
||||||
#pragma alloc_text(PAGE, FspSendSetInformationIrp)
|
#pragma alloc_text(PAGE, FspSendSetInformationIrp)
|
||||||
#pragma alloc_text(PAGE, FspBufferUserBuffer)
|
#pragma alloc_text(PAGE, FspBufferUserBuffer)
|
||||||
#pragma alloc_text(PAGE, FspLockUserBuffer)
|
#pragma alloc_text(PAGE, FspLockUserBuffer)
|
||||||
@ -384,25 +384,25 @@ NTSTATUS FspGetDeviceObjectPointer(PUNICODE_STRING ObjectName, ACCESS_MASK Desir
|
|||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS FspMainStreamOpen(
|
NTSTATUS FspMainFileOpen(
|
||||||
PDEVICE_OBJECT DeviceObject,
|
PDEVICE_OBJECT DeviceObject,
|
||||||
PUNICODE_STRING MainStreamName, BOOLEAN CaseSensitive,
|
PUNICODE_STRING MainFileName, BOOLEAN CaseSensitive,
|
||||||
ULONG Disposition,
|
ULONG Disposition,
|
||||||
PHANDLE PMainStreamHandle,
|
PHANDLE PMainFileHandle,
|
||||||
PFILE_OBJECT *PMainStreamObject)
|
PFILE_OBJECT *PMainFileObject)
|
||||||
{
|
{
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||||
IO_STATUS_BLOCK IoStatus;
|
IO_STATUS_BLOCK IoStatus;
|
||||||
HANDLE MainStreamHandle;
|
HANDLE MainFileHandle;
|
||||||
PFILE_OBJECT MainStreamObject;
|
PFILE_OBJECT MainFileObject;
|
||||||
|
|
||||||
/* assert that the supplied name is actually a main stream name */
|
/* assert that the supplied name is actually a main file name */
|
||||||
ASSERT(FspUnicodePathIsValid(MainStreamName, 0));
|
ASSERT(FspUnicodePathIsValid(MainFileName, 0));
|
||||||
|
|
||||||
*PMainStreamHandle = 0;
|
*PMainFileHandle = 0;
|
||||||
*PMainStreamObject = 0;
|
*PMainFileObject = 0;
|
||||||
|
|
||||||
switch (Disposition)
|
switch (Disposition)
|
||||||
{
|
{
|
||||||
@ -422,13 +422,13 @@ NTSTATUS FspMainStreamOpen(
|
|||||||
|
|
||||||
InitializeObjectAttributes(
|
InitializeObjectAttributes(
|
||||||
&ObjectAttributes,
|
&ObjectAttributes,
|
||||||
MainStreamName,
|
MainFileName,
|
||||||
OBJ_KERNEL_HANDLE | OBJ_FORCE_ACCESS_CHECK | (CaseSensitive ? 0 : OBJ_CASE_INSENSITIVE),
|
OBJ_KERNEL_HANDLE | OBJ_FORCE_ACCESS_CHECK | (CaseSensitive ? 0 : OBJ_CASE_INSENSITIVE),
|
||||||
0/*RootDirectory*/,
|
0/*RootDirectory*/,
|
||||||
0/*SecurityDescriptor*/);
|
0/*SecurityDescriptor*/);
|
||||||
|
|
||||||
IoStatus.Status = IoCreateFileSpecifyDeviceObjectHint(
|
IoStatus.Status = IoCreateFileSpecifyDeviceObjectHint(
|
||||||
&MainStreamHandle,
|
&MainFileHandle,
|
||||||
FILE_READ_ATTRIBUTES,
|
FILE_READ_ATTRIBUTES,
|
||||||
&ObjectAttributes,
|
&ObjectAttributes,
|
||||||
&IoStatus,
|
&IoStatus,
|
||||||
@ -447,38 +447,38 @@ NTSTATUS FspMainStreamOpen(
|
|||||||
return IoStatus.Status;
|
return IoStatus.Status;
|
||||||
|
|
||||||
IoStatus.Status = ObReferenceObjectByHandle(
|
IoStatus.Status = ObReferenceObjectByHandle(
|
||||||
MainStreamHandle,
|
MainFileHandle,
|
||||||
0/*DesiredAccess*/,
|
0/*DesiredAccess*/,
|
||||||
*IoFileObjectType,
|
*IoFileObjectType,
|
||||||
KernelMode,
|
KernelMode,
|
||||||
&MainStreamObject,
|
&MainFileObject,
|
||||||
0/*HandleInformation*/);
|
0/*HandleInformation*/);
|
||||||
if (!NT_SUCCESS(IoStatus.Status))
|
if (!NT_SUCCESS(IoStatus.Status))
|
||||||
{
|
{
|
||||||
ObCloseHandle(MainStreamHandle, KernelMode);
|
ObCloseHandle(MainFileHandle, KernelMode);
|
||||||
return IoStatus.Status;
|
return IoStatus.Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
*PMainStreamHandle = MainStreamHandle;
|
*PMainFileHandle = MainFileHandle;
|
||||||
*PMainStreamObject = MainStreamObject;
|
*PMainFileObject = MainFileObject;
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS FspMainStreamClose(
|
NTSTATUS FspMainFileClose(
|
||||||
HANDLE MainStreamHandle,
|
HANDLE MainFileHandle,
|
||||||
PFILE_OBJECT MainStreamObject)
|
PFILE_OBJECT MainFileObject)
|
||||||
{
|
{
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
NTSTATUS Result = STATUS_SUCCESS;
|
NTSTATUS Result = STATUS_SUCCESS;
|
||||||
|
|
||||||
if (0 != MainStreamObject)
|
if (0 != MainFileObject)
|
||||||
ObDereferenceObject(MainStreamObject);
|
ObDereferenceObject(MainFileObject);
|
||||||
|
|
||||||
if (0 != MainStreamHandle)
|
if (0 != MainFileHandle)
|
||||||
{
|
{
|
||||||
Result = ObCloseHandle(MainStreamHandle, KernelMode);
|
Result = ObCloseHandle(MainFileHandle, KernelMode);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
DEBUGLOG("ObCloseHandle() = %s", NtStatusSym(Result));
|
DEBUGLOG("ObCloseHandle() = %s", NtStatusSym(Result));
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user