Leaked source code of windows server 2003
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.
|
|
/******************************************************************************
* * (C) COPYRIGHT MICROSOFT CORP., 1999 * * TITLE: LockMgr.h * * VERSION: 1.0 * * AUTHOR: ByronC * * DATE: 15 November, 1999 * * DESCRIPTION: * Definition of Lock Manager Class. * ******************************************************************************/
#pragma once
#ifndef _LOCKMGR_H_
#define _LOCKMGR_H_
#define WIA_LOCK_WAIT_TIME 60000
class StiLockMgr; // defined later in this file
//
// Lock information stored per device
//
typedef struct _LockInfo {
HANDLE hDeviceIsFree; // Auto-Reset event object used to signal
// when device is free.
BOOL bDeviceIsLocked; // Indicates whether device is currently
// locked.
LONG lInUse; // Indicates whether the device is actually
// in use i.e. we are in the middle of a
// request (e.g. a data transfer).
DWORD dwThreadId; // The Id of the Thread which has device
// locked.
LONG lHoldingTime; // The amount of idle time (milliseconds)
// to keep hold of lock.
LONG lTimeLeft; // The amount of idle time remaining.
} LockInfo, *PLockInfo;
//
// Info struct used during enumeration callbacks
//
typedef struct _EnumContext { StiLockMgr *This; // Pointer to the Lock Manager that
// requested the enumeration
LONG lShortestWaitTime; // Value indicating the shortest wait time
// till next unlock.
BOOL bMustSchedule; // Indicates whether the unlock callback
// must be scheduled.
} EnumContext, *PEnumContext;
//
// Class definition for the lock manager. It is used by both STI and WIA.
//
class StiLockMgr : IUnknown {
public:
//
// Constructor, Initialize, Destructor
//
StiLockMgr(); HRESULT Initialize(); ~StiLockMgr();
//
// IUnknown methods
//
HRESULT _stdcall QueryInterface(const IID& iid, void** ppv); ULONG _stdcall AddRef(void); ULONG _stdcall Release(void);
//
// Lock/Unlock Request methods
//
HRESULT _stdcall RequestLock(BSTR pszDeviceName, ULONG ulTimeout, BOOL bInServerProcess, DWORD dwClientThreadId); HRESULT _stdcall RequestLock(ACTIVE_DEVICE *pDevice, ULONG ulTimeOut, BOOL bOpenPort = TRUE); HRESULT _stdcall RequestUnlock(BSTR pszDeviceName, BOOL bInServerProcess, DWORD dwClientThreadId); HRESULT _stdcall RequestUnlock(ACTIVE_DEVICE *pDevice, BOOL bClosePort = TRUE);
HRESULT _stdcall LockDevice(ACTIVE_DEVICE *pDevice); HRESULT _stdcall UnlockDevice(ACTIVE_DEVICE *pDevice);
VOID AutoUnlock(); VOID UpdateLockInfoStatus(ACTIVE_DEVICE *pDevice, LONG *pWaitTime, BOOL *pbMustSchedule); HRESULT ClearLockInfo(LockInfo *pLockInfo); private:
//
// Private helpers
//
HRESULT RequestLockHelper(ACTIVE_DEVICE *pDevice, ULONG ulTimeOut, BOOL bInServerProcess, DWORD dwClientThreadId); HRESULT RequestUnlockHelper(ACTIVE_DEVICE *pDevice, BOOL bInServerProcess, DWORD dwClientThreadId); HRESULT CreateLockInfo(ACTIVE_DEVICE *pDevice); HRESULT CheckDeviceInfo(ACTIVE_DEVICE *pDevice); #ifdef USE_ROT
HRESULT WriteCookieNameToRegistry(CHAR *szCookieName); VOID DeleteCookieFromRegistry(); #endif
//
// Private Data
//
LONG m_cRef; // Ref count
DWORD m_dwCookie; // Cookie identifying location in ROT
BOOL m_bSched; // Indicates whether the UnlockCallback has
// been scheduled
LONG m_lSchedWaitTime; // Amount of time we told Scheduler to wait
// before calling us back
};
#ifdef DECLARE_LOCKMGR
StiLockMgr *g_pStiLockMgr; #else
extern StiLockMgr *g_pStiLockMgr; #endif
//
// Callback functions
//
VOID WINAPI UnlockTimedCallback(VOID *pCallbackInfo); VOID WINAPI EnumDeviceCallback(ACTIVE_DEVICE *pDevice, VOID *pContext);
#endif
|