402 lines
7.5 KiB
C
402 lines
7.5 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1989 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
mupstruc.h
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module defines the data structures that make up the major internal
|
|||
|
part of the MUP.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Manny Weiser (mannyw) 16-Dec-1991
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#ifndef _MUPSTRUC_
|
|||
|
#define _MUPSTRUC_
|
|||
|
|
|||
|
|
|||
|
|
|||
|
typedef enum _BLOCK_TYPE {
|
|||
|
BlockTypeUndefined,
|
|||
|
BlockTypeVcb,
|
|||
|
BlockTypeUncProvider,
|
|||
|
BlockTypeKnownPrefix,
|
|||
|
BlockTypeFcb,
|
|||
|
BlockTypeCcb,
|
|||
|
BlockTypeMasterIoContext,
|
|||
|
BlockTypeIoContext,
|
|||
|
BlockTypeMasterQueryContext,
|
|||
|
BlockTypeQueryContext,
|
|||
|
BlockTypeBuffer
|
|||
|
} BLOCK_TYPE;
|
|||
|
|
|||
|
typedef enum _BLOCK_STATE {
|
|||
|
BlockStateUnknown,
|
|||
|
BlockStateActive,
|
|||
|
BlockStateClosing
|
|||
|
} BLOCK_STATE;
|
|||
|
|
|||
|
//
|
|||
|
// A block header starts every block
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _BLOCK_HEADER {
|
|||
|
BLOCK_TYPE BlockType;
|
|||
|
BLOCK_STATE BlockState;
|
|||
|
ULONG ReferenceCount;
|
|||
|
ULONG BlockSize;
|
|||
|
} BLOCK_HEADER, *PBLOCK_HEADER;
|
|||
|
|
|||
|
//
|
|||
|
// The MUP volume control block. This structure is used to track access
|
|||
|
// the the MUP device object.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _VCB {
|
|||
|
BLOCK_HEADER BlockHeader;
|
|||
|
|
|||
|
//
|
|||
|
// The IO share access.
|
|||
|
//
|
|||
|
|
|||
|
SHARE_ACCESS ShareAccess;
|
|||
|
|
|||
|
} VCB, *PVCB;
|
|||
|
|
|||
|
//
|
|||
|
// The MUP Device Object is an I/O system device object.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _MUP_DEVICE_OBJECT {
|
|||
|
|
|||
|
DEVICE_OBJECT DeviceObject;
|
|||
|
VCB Vcb;
|
|||
|
|
|||
|
} MUP_DEVICE_OBJECT, *PMUP_DEVICE_OBJECT;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// A UNC provider. A UNC provider block corresponds to a registered UNC
|
|||
|
// provider device.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _UNC_PROVIDER {
|
|||
|
|
|||
|
BLOCK_HEADER BlockHeader;
|
|||
|
LIST_ENTRY ListEntry;
|
|||
|
|
|||
|
//
|
|||
|
// The device name of the provider
|
|||
|
//
|
|||
|
|
|||
|
UNICODE_STRING DeviceName;
|
|||
|
|
|||
|
//
|
|||
|
// Our handle to the UNC device and the associated file and device objects
|
|||
|
//
|
|||
|
|
|||
|
HANDLE Handle;
|
|||
|
|
|||
|
PDEVICE_OBJECT DeviceObject;
|
|||
|
PFILE_OBJECT FileObject;
|
|||
|
|
|||
|
//
|
|||
|
// The priority of the provider.
|
|||
|
//
|
|||
|
|
|||
|
ULONG Priority;
|
|||
|
|
|||
|
//
|
|||
|
// Indicate if the provider supports mailslots.
|
|||
|
//
|
|||
|
|
|||
|
BOOLEAN MailslotsSupported;
|
|||
|
|
|||
|
//
|
|||
|
// Indicate if the provider is currently registered or unregistered
|
|||
|
//
|
|||
|
|
|||
|
BOOLEAN Registered;
|
|||
|
|
|||
|
} UNC_PROVIDER, *PUNC_PROVIDER;
|
|||
|
|
|||
|
//
|
|||
|
// A known prefix. A known prefix is a path prefix (like \\server\share)
|
|||
|
// that is "owned" by a specific UNC provider.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _KNOWN_PREFIX {
|
|||
|
|
|||
|
BLOCK_HEADER BlockHeader;
|
|||
|
|
|||
|
UNICODE_PREFIX_TABLE_ENTRY TableEntry;
|
|||
|
|
|||
|
//
|
|||
|
// The prefix string
|
|||
|
//
|
|||
|
|
|||
|
UNICODE_STRING Prefix;
|
|||
|
|
|||
|
//
|
|||
|
// The time the prefix was last used.
|
|||
|
//
|
|||
|
|
|||
|
LARGE_INTEGER LastUsedTime;
|
|||
|
|
|||
|
//
|
|||
|
// A referenced pointer to the owning UNC Provider
|
|||
|
//
|
|||
|
|
|||
|
PUNC_PROVIDER UncProvider;
|
|||
|
|
|||
|
//
|
|||
|
// If TRUE the Prefix string was allocated separately to this block.
|
|||
|
//
|
|||
|
|
|||
|
BOOLEAN PrefixStringAllocated;
|
|||
|
|
|||
|
//
|
|||
|
// If TRUE the Prefix string has been inserted in the prefix table
|
|||
|
//
|
|||
|
|
|||
|
BOOLEAN InTable;
|
|||
|
|
|||
|
//
|
|||
|
// If Active, the entry either is in the table or had been inserted in the
|
|||
|
// table at some point.
|
|||
|
|
|||
|
BOOLEAN Active;
|
|||
|
//
|
|||
|
// Links for the linked list of entries
|
|||
|
//
|
|||
|
|
|||
|
LIST_ENTRY ListEntry;
|
|||
|
|
|||
|
} KNOWN_PREFIX, *PKNOWN_PREFIX;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// A File Control Block. The FCB corresponds to an open broadcast file,
|
|||
|
// i.e. a mailslot handle. We don't store any information about the FCB,
|
|||
|
// we let the various providers handle all of that.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _FCB {
|
|||
|
|
|||
|
BLOCK_HEADER BlockHeader;
|
|||
|
|
|||
|
//
|
|||
|
// A pointer to the IO system's file object, that references this FCB.
|
|||
|
//
|
|||
|
|
|||
|
PFILE_OBJECT FileObject;
|
|||
|
|
|||
|
//
|
|||
|
// A list of CCBs for this FCB. The list is protected by MupCcbListLock.
|
|||
|
//
|
|||
|
|
|||
|
LIST_ENTRY CcbList;
|
|||
|
|
|||
|
} FCB, *PFCB;
|
|||
|
|
|||
|
//
|
|||
|
// A CCB. The CCB is the per provider version of the FCB, all provider
|
|||
|
// specific information about an FCB is kept here.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _CCB {
|
|||
|
|
|||
|
BLOCK_HEADER BlockHeader;
|
|||
|
|
|||
|
//
|
|||
|
// A referenced pointer to the FCB for this CCB.
|
|||
|
//
|
|||
|
|
|||
|
PFCB Fcb;
|
|||
|
|
|||
|
//
|
|||
|
// A list entry to keep this block on the FCB's CcbList.
|
|||
|
//
|
|||
|
|
|||
|
LIST_ENTRY ListEntry;
|
|||
|
|
|||
|
//
|
|||
|
// The file and device objects for this open file.
|
|||
|
//
|
|||
|
|
|||
|
PDEVICE_OBJECT DeviceObject;
|
|||
|
PFILE_OBJECT FileObject;
|
|||
|
|
|||
|
} CCB, *PCCB;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// The master and slave forward i/o context blocks are used to track
|
|||
|
// forward IRPs. Each forwarded IRP is tracked by the
|
|||
|
// Master Forwarded Io Context (which corresponds to our FCB) and a per
|
|||
|
// provider Io Context (which corresponse to our CCB).
|
|||
|
//
|
|||
|
// Since the Forwarded Io Context is never referenced or dereferenced it
|
|||
|
// doesn't get a block header.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _MASTER_FORWARDED_IO_CONTEXT {
|
|||
|
|
|||
|
BLOCK_HEADER BlockHeader;
|
|||
|
|
|||
|
//
|
|||
|
// The original IRP (i.e. the one sent to the MUP) that is being handled.
|
|||
|
//
|
|||
|
|
|||
|
PIRP OriginalIrp;
|
|||
|
|
|||
|
//
|
|||
|
// The status that will be used to complete the Irp. If all the mailslot
|
|||
|
// writes fail (eg. a portable not in its docking station) then the status
|
|||
|
// from the last write will be returned. If one works then STATUS_SUCCESS.
|
|||
|
//
|
|||
|
//
|
|||
|
|
|||
|
NTSTATUS SuccessStatus;
|
|||
|
NTSTATUS ErrorStatus;
|
|||
|
|
|||
|
//
|
|||
|
// A referenced pointer to the FCB for this i/o.
|
|||
|
//
|
|||
|
|
|||
|
PFCB Fcb;
|
|||
|
|
|||
|
} MASTER_FORWARDED_IO_CONTEXT, *PMASTER_FORWARDED_IO_CONTEXT;
|
|||
|
|
|||
|
typedef struct _FORWARDED_IO_CONTEXT {
|
|||
|
|
|||
|
//
|
|||
|
// A referenced pointer to the CCB.
|
|||
|
//
|
|||
|
|
|||
|
PCCB Ccb;
|
|||
|
|
|||
|
//
|
|||
|
// A referenced pointer to the Master Context.
|
|||
|
//
|
|||
|
|
|||
|
PMASTER_FORWARDED_IO_CONTEXT MasterContext;
|
|||
|
|
|||
|
//
|
|||
|
// These structures are used for posting to the Ex worker threads.
|
|||
|
//
|
|||
|
|
|||
|
WORK_QUEUE_ITEM WorkQueueItem;
|
|||
|
PDEVICE_OBJECT DeviceObject;
|
|||
|
PIRP pIrp;
|
|||
|
|
|||
|
} FORWARDED_IO_CONTEXT, *PFORWARDED_IO_CONTEXT;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// The master and slave query path context blocks are used to track
|
|||
|
// create IRPs. Each forwarded IRP is tracked by the
|
|||
|
// Master query Path Context (which corresponds to our FCB) and a per
|
|||
|
// provider query path (which corresponse to our CCB).
|
|||
|
//
|
|||
|
// Since the query path context is never referenced or dereferenced it
|
|||
|
// doesn't get a block header.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _MASTER_QUERY_PATH_CONTEXT {
|
|||
|
|
|||
|
BLOCK_HEADER BlockHeader;
|
|||
|
|
|||
|
//
|
|||
|
// A pointer to the original create IRP.
|
|||
|
//
|
|||
|
|
|||
|
PIRP OriginalIrp;
|
|||
|
|
|||
|
//
|
|||
|
// A pointer to the FileObject in the original create IRP.
|
|||
|
//
|
|||
|
|
|||
|
PFILE_OBJECT FileObject;
|
|||
|
|
|||
|
//
|
|||
|
// This is used to track the identity of the provider that will
|
|||
|
// receive the Create IRP.
|
|||
|
//
|
|||
|
|
|||
|
PUNC_PROVIDER Provider;
|
|||
|
|
|||
|
//
|
|||
|
// A lock to protect access to Provider
|
|||
|
//
|
|||
|
|
|||
|
MUP_LOCK Lock;
|
|||
|
|
|||
|
//
|
|||
|
// An unreferenced pointer to the newly allocated known prefix block.
|
|||
|
//
|
|||
|
|
|||
|
PKNOWN_PREFIX KnownPrefix;
|
|||
|
|
|||
|
//
|
|||
|
// The status code to be returned from this operation
|
|||
|
//
|
|||
|
NTSTATUS ErrorStatus;
|
|||
|
|
|||
|
//
|
|||
|
// A list of QUERY_PATH_CONTEXTs outstadning for this MasterContext
|
|||
|
//
|
|||
|
LIST_ENTRY QueryList;
|
|||
|
|
|||
|
//
|
|||
|
// The entry for this master context in the global list MupMasterQueryList
|
|||
|
//
|
|||
|
LIST_ENTRY MasterQueryList;
|
|||
|
|
|||
|
} MASTER_QUERY_PATH_CONTEXT, *PMASTER_QUERY_PATH_CONTEXT;
|
|||
|
|
|||
|
typedef struct _QUERY_PATH_CONTEXT {
|
|||
|
|
|||
|
//
|
|||
|
// A referenced poitner to the master query path context block.
|
|||
|
//
|
|||
|
|
|||
|
PMASTER_QUERY_PATH_CONTEXT MasterContext;
|
|||
|
|
|||
|
//
|
|||
|
// A referenced pointer to the UNC provider we are querying.
|
|||
|
//
|
|||
|
|
|||
|
PUNC_PROVIDER Provider;
|
|||
|
|
|||
|
//
|
|||
|
// A pointer to the Device Io Control buffer we allocated to query
|
|||
|
// the above provider.
|
|||
|
//
|
|||
|
|
|||
|
PVOID Buffer;
|
|||
|
|
|||
|
//
|
|||
|
// The entry for this context in the MasterContext's QueryList
|
|||
|
//
|
|||
|
LIST_ENTRY QueryList;
|
|||
|
|
|||
|
//
|
|||
|
// The IRP associated with this query context (i.e., the IRP sent to the UNC_PROVIDER)
|
|||
|
//
|
|||
|
PIRP QueryIrp;
|
|||
|
|
|||
|
} QUERY_PATH_CONTEXT, *PQUERY_PATH_CONTEXT;
|
|||
|
|
|||
|
#endif // _MUPSTRUC_
|
|||
|
|
|||
|
|