You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
310 lines
5.8 KiB
310 lines
5.8 KiB
/*++
|
|
|
|
Copyright (c) 1997 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
conn.h
|
|
|
|
Abstract:
|
|
|
|
Handling connection for applications, which open STI devices
|
|
|
|
|
|
Author:
|
|
|
|
Vlad Sadovsky (vlads) 10-Feb-1997
|
|
|
|
|
|
Environment:
|
|
|
|
User Mode - Win32
|
|
|
|
Revision History:
|
|
|
|
26-Feb-1997 VladS created
|
|
|
|
--*/
|
|
|
|
#ifndef _STI_CONN_H_
|
|
#define _STI_CONN_H_
|
|
|
|
#include <base.h>
|
|
#include <buffer.h>
|
|
|
|
#include "device.h"
|
|
#include "stirpc.h"
|
|
|
|
/***********************************************************
|
|
* Type Definitions
|
|
************************************************************/
|
|
|
|
#define CONN_SIGNATURE (DWORD)'CONN'
|
|
#define CONN_SIGNATURE_FREE (DWORD)'CONf'
|
|
|
|
#define NOTIFY_SIGNATURE (DWORD)'NOTI'
|
|
#define NOTIFY_SIGNATURE_FREE (DWORD)'NOTf'
|
|
|
|
class STI_NOTIFICATION {
|
|
|
|
public:
|
|
|
|
STI_NOTIFICATION::STI_NOTIFICATION(IN LPSTINOTIFY pNotify)
|
|
{
|
|
Reset();
|
|
|
|
if (pNotify) {
|
|
m_uiAllocSize = pNotify->dwSize;
|
|
m_pNotifyData = new BYTE[m_uiAllocSize];
|
|
|
|
// ASSERT(m_pNotifyData);
|
|
if (m_pNotifyData) {
|
|
memcpy(m_pNotifyData,(LPBYTE)pNotify,m_uiAllocSize);
|
|
m_dwSignature = NOTIFY_SIGNATURE;
|
|
m_fValid = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
STI_NOTIFICATION::~STI_NOTIFICATION()
|
|
{
|
|
if (IsValid()) {
|
|
if (m_pNotifyData) {
|
|
delete [] m_pNotifyData;
|
|
}
|
|
Reset();
|
|
}
|
|
}
|
|
|
|
inline BOOL
|
|
IsValid(
|
|
VOID
|
|
)
|
|
{
|
|
return (m_fValid) && (m_dwSignature == NOTIFY_SIGNATURE);
|
|
}
|
|
|
|
inline VOID
|
|
Reset(
|
|
VOID
|
|
)
|
|
{
|
|
m_ListEntry.Flink = m_ListEntry.Blink = NULL;
|
|
m_uiAllocSize = 0;
|
|
m_dwSignature = NOTIFY_SIGNATURE_FREE;
|
|
m_fValid = FALSE;
|
|
}
|
|
|
|
inline UINT
|
|
QueryAllocSize(
|
|
VOID
|
|
)
|
|
{
|
|
return m_uiAllocSize;
|
|
}
|
|
|
|
inline LPBYTE
|
|
QueryNotifyData(
|
|
VOID
|
|
)
|
|
{
|
|
return m_pNotifyData;
|
|
}
|
|
|
|
LIST_ENTRY m_ListEntry;
|
|
|
|
private:
|
|
|
|
DWORD m_dwSignature;
|
|
BOOL m_fValid;
|
|
UINT m_uiAllocSize;
|
|
LPBYTE m_pNotifyData;
|
|
};
|
|
|
|
//
|
|
// Flags for connection object
|
|
//
|
|
#define CONN_FLAG_SHUTDOWN 0x0001
|
|
|
|
class STI_CONN : public BASE {
|
|
|
|
friend class TAKE_STI_CONN;
|
|
|
|
public:
|
|
// *** IUnknown methods ***
|
|
STDMETHODIMP QueryInterface( REFIID riid, LPVOID * ppvObj);
|
|
STDMETHODIMP_(ULONG) AddRef( void);
|
|
STDMETHODIMP_(ULONG) Release( void);
|
|
|
|
STI_CONN::STI_CONN(
|
|
IN LPCTSTR lpszDeviceName,
|
|
IN DWORD dwMode,
|
|
IN DWORD dwProcessId
|
|
);
|
|
|
|
STI_CONN::~STI_CONN() ;
|
|
|
|
inline BOOL
|
|
IsValid(
|
|
VOID
|
|
)
|
|
{
|
|
return (m_fValid) && (m_dwSignature == CONN_SIGNATURE);
|
|
}
|
|
|
|
inline void
|
|
EnterCrit(VOID)
|
|
{
|
|
_try {
|
|
EnterCriticalSection(&m_CritSec);
|
|
}
|
|
_except (EXCEPTION_EXECUTE_HANDLER) {
|
|
// What do we do now?
|
|
}
|
|
}
|
|
|
|
inline void
|
|
LeaveCrit(VOID)
|
|
{
|
|
LeaveCriticalSection(&m_CritSec);
|
|
}
|
|
|
|
inline DWORD
|
|
SetFlags(
|
|
DWORD dwNewFlags
|
|
)
|
|
{
|
|
DWORD dwTemp = m_dwFlags;
|
|
m_dwFlags = dwNewFlags;
|
|
return dwTemp;
|
|
}
|
|
|
|
inline DWORD
|
|
QueryFlags(
|
|
VOID
|
|
)
|
|
{
|
|
return m_dwFlags;
|
|
}
|
|
|
|
inline HANDLE
|
|
QueryID(
|
|
VOID
|
|
)
|
|
{
|
|
return m_hUniqueId;
|
|
}
|
|
|
|
inline DWORD
|
|
QueryOpenMode(
|
|
VOID
|
|
)
|
|
{
|
|
return m_dwOpenMode;
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
SetSubscribeInfo(
|
|
PLOCAL_SUBSCRIBE_CONTAINER pSubscribe
|
|
);
|
|
|
|
BOOL
|
|
QueueNotificationToProcess(
|
|
LPSTINOTIFY pStiNotification
|
|
);
|
|
|
|
DWORD
|
|
GetNotification(
|
|
PVOID pBuffer,
|
|
DWORD *pdwSize
|
|
);
|
|
|
|
VOID DumpObject(VOID)
|
|
{
|
|
/* The cast (char*) m_dwSignature will cause problems in 64bit land.
|
|
DPRINTF(DM_TRACE,TEXT("Connection: Dumping itself:this(%X) Sign(%4c) DeviceListEntry(%X,%X,%X) \n \
|
|
GlocalListEntry(%X,%X,%X) Ser#(%d)"), \
|
|
this,(char *)m_dwSignature,
|
|
&m_DeviceListEntry,m_DeviceListEntry.Flink,m_DeviceListEntry.Blink,
|
|
&m_GlocalListEntry,m_GlocalListEntry.Flink,m_GlocalListEntry.Blink,
|
|
m_dwUniqueId);
|
|
*/
|
|
}
|
|
|
|
|
|
LIST_ENTRY m_GlocalListEntry;
|
|
LIST_ENTRY m_DeviceListEntry;
|
|
LIST_ENTRY m_NotificationListHead;
|
|
|
|
DWORD m_dwSignature;
|
|
|
|
private:
|
|
|
|
BOOL m_fValid;
|
|
|
|
CRITICAL_SECTION m_CritSec;
|
|
ACTIVE_DEVICE *m_pOpenedDevice;
|
|
|
|
HANDLE m_hUniqueId;
|
|
|
|
StiCString strDeviceName;
|
|
|
|
DWORD m_dwFlags;
|
|
DWORD m_dwSubscribeFlags;
|
|
DWORD m_dwOpenMode;
|
|
DWORD m_dwProcessId;
|
|
|
|
DWORD m_dwNotificationMessage;
|
|
HWND m_hwndProcessWindow;
|
|
HANDLE m_hevProcessEvent;
|
|
UINT m_uiNotificationMessage;
|
|
|
|
};
|
|
|
|
|
|
//
|
|
// Take connection class
|
|
//
|
|
class TAKE_STI_CONN
|
|
{
|
|
private:
|
|
STI_CONN* m_pConn;
|
|
|
|
public:
|
|
void Take(void) {m_pConn->EnterCrit();}
|
|
void Release(void) {m_pConn->LeaveCrit();}
|
|
TAKE_STI_CONN(STI_CONN* pconn) : m_pConn(pconn) { Take(); }
|
|
~TAKE_STI_CONN() { Release(); }
|
|
};
|
|
|
|
BOOL
|
|
CreateDeviceConnection(
|
|
LPCTSTR pwszDeviceName,
|
|
DWORD dwMode,
|
|
DWORD dwProcessId,
|
|
HANDLE *phConnection
|
|
);
|
|
|
|
//
|
|
// Find connection object by given handle
|
|
//
|
|
BOOL
|
|
LookupConnectionByHandle(
|
|
HANDLE hConnection,
|
|
STI_CONN **ppConnectionObject
|
|
);
|
|
|
|
//
|
|
//
|
|
// Remove connection object from the list
|
|
//
|
|
BOOL
|
|
DestroyDeviceConnection(
|
|
HANDLE lUniqueId,
|
|
BOOL fForce
|
|
);
|
|
|
|
#endif // _CONN_H_
|
|
|