//---------------------------------------------------------------------------
//
//  Module:   		fni.h
//
//  Description:	Filter Node Instance Class
//
//
//@@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.
//
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// Constants and Macros
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// Classes
//---------------------------------------------------------------------------

typedef class CFilterNodeInstance : public CListDoubleItem
{
public:
    ~CFilterNodeInstance(
    );

    static NTSTATUS
    Create(
	PFILTER_NODE_INSTANCE *ppFilterNodeInstance,
	PLOGICAL_FILTER_NODE pLogicalFilterNode,
	PDEVICE_NODE pDeviceNode,
	BOOL fReuseInstance
    );

    static NTSTATUS
    Create(
	PFILTER_NODE_INSTANCE *ppFilterNodeInstance,
	PFILTER_NODE pFilterNode
    );

    VOID 
    AddRef(
    )
    {
	Assert(this);
	++cReference;
    };

    ENUMFUNC 
    Destroy()
    {
	if(this != NULL) {
	    Assert(this);
	    DPF1(95, "CFilterNodeInstance::Destroy: %08x", this);
	    ASSERT(cReference > 0);

	    if(--cReference == 0) {
		delete this;
	    }
	}
	return(STATUS_CONTINUE);
    };

    NTSTATUS
    RegisterTargetDeviceChangeNotification(
    );

    VOID
    UnregisterTargetDeviceChangeNotification(
    );

    static NTSTATUS
    CFilterNodeInstance::DeviceQueryRemove(
    );

    static NTSTATUS
    TargetDeviceChangeNotification(
	IN PTARGET_DEVICE_REMOVAL_NOTIFICATION pNotification,
	IN PFILTER_NODE_INSTANCE pFilterNodeInstance
    );

#ifdef DEBUG
    ENUMFUNC Dump();
#endif

private:
    LONG cReference;
public:
    PFILTER_NODE pFilterNode;
    PDEVICE_NODE pDeviceNode;
    PFILE_OBJECT pFileObject;
    HANDLE hFilter;
    HANDLE pNotificationHandle;
    DefineSignature(0x20494E46);			// FNI

} FILTER_NODE_INSTANCE, *PFILTER_NODE_INSTANCE;

//---------------------------------------------------------------------------

typedef ListDoubleDestroy<FILTER_NODE_INSTANCE> LIST_FILTER_NODE_INSTANCE;

//---------------------------------------------------------------------------