windows-nt/Source/XPSP1/NT/drivers/wdm/audio/sysaudio/cinstanc.h
2020-09-26 16:20:57 +08:00

210 lines
4.3 KiB
C++

//---------------------------------------------------------------------------
//
// Module: ins.h
//
// Description: KS Instance base class definition
//
//
//@@BEGIN_MSINTERNAL
// Development Team:
// Mike McLaughlin
//
// History: Date Author Comment
//
//@@END_MSINTERNAL
//---------------------------------------------------------------------------
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
// PURPOSE.
//
// Copyright (c) 1996-1999 Microsoft Corporation. All Rights Reserved.
//
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// Globals
//---------------------------------------------------------------------------
extern "C" const KSDISPATCH_TABLE DispatchTable;
//---------------------------------------------------------------------------
// Classes
//---------------------------------------------------------------------------
typedef class CInstance
{
friend class ListDoubleField<CInstance>;
public:
CInstance(
IN PPARENT_INSTANCE pParentInstance
);
~CInstance(
);
static NTSTATUS
DispatchClose(
IN PDEVICE_OBJECT pDeviceObject,
IN PIRP pIrp
);
static NTSTATUS
DispatchForwardIrp(
IN PDEVICE_OBJECT pDeviceObject,
IN PIRP pIrp
);
VOID
Invalidate(
);
PFILE_OBJECT
GetNextFileObject(
)
{
return(pNextFileObject);
};
PPIN_INSTANCE
GetParentInstance( // inline body in pins.h
);
NTSTATUS
SetNextFileObject(
HANDLE handle
)
{
return(ObReferenceObjectByHandle(
handle,
GENERIC_READ | GENERIC_WRITE,
NULL,
KernelMode,
(PVOID*)&pNextFileObject,
NULL));
};
NTSTATUS
DispatchCreate(
IN PIRP pIrp,
IN UTIL_PFN pfnDispatchCreate,
IN OUT PVOID pReference,
IN ULONG cCreateItems = 0,
IN PKSOBJECT_CREATE_ITEM pCreateItems = NULL,
IN const KSDISPATCH_TABLE *pDispatchTable = &DispatchTable
);
VOID GrabMutex()
{
ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
AssertStatus(
KeWaitForMutexObject(pMutex, Executive, KernelMode, FALSE, NULL));
};
VOID ReleaseMutex()
{
ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
KeReleaseMutex(pMutex, FALSE);
};
#ifdef DEBUG
ENUMFUNC
Dump(
)
{
dprintf("CINS: %08x OH %08x PFO %08x NFO %08x NDO %08x PI %08x\n",
this,
pObjectHeader,
pParentFileObject,
pNextFileObject,
pNextDeviceObject,
pParentInstance);
return (STATUS_CONTINUE);
};
ENUMFUNC
DumpAddress(
)
{
Assert(this);
dprintf(" %08x", this);
return(STATUS_CONTINUE);
};
#endif
private:
VOID
AddList(
CListDouble *pld
)
{
ldiNext.AddList(pld);
};
VOID
RemoveList(
)
{
ldiNext.RemoveList();
};
//
// This pointer to the dispatch table is used in the common
// dispatch routines to route the IRP to the appropriate
// handlers. This structure is referenced by the device driver
// with IoGetCurrentIrpStackLocation( pIrp ) -> FsContext
//
PVOID pObjectHeader;
PFILE_OBJECT pParentFileObject;
PDEVICE_OBJECT pNextDeviceObject;
PPARENT_INSTANCE pParentInstance;
PFILE_OBJECT pNextFileObject;
CLIST_DOUBLE_ITEM ldiNext;
KMUTEX *pMutex;
public:
DefineSignature(0x534e4943); // CINS
} INSTANCE, *PINSTANCE;
//---------------------------------------------------------------------------
typedef ListDoubleField<INSTANCE> LIST_INSTANCE, *PLIST_INSTANCE;
//---------------------------------------------------------------------------
typedef class CParentInstance
{
friend class CInstance;
public:
VOID
Invalidate(
);
BOOL
IsChildInstance(
)
{
return(lstChildInstance.IsLstEmpty());
};
#ifdef DEBUG
ENUMFUNC
Dump()
{
lstChildInstance.Dump();
return(STATUS_CONTINUE);
};
ENUMFUNC
DumpAddress()
{
lstChildInstance.DumpAddress();
return(STATUS_CONTINUE);
};
#endif
LIST_INSTANCE lstChildInstance;
DefineSignature(0x52415043); // CPAR
} PARENT_INSTANCE, *PPARENT_INSTANCE;
//---------------------------------------------------------------------------