201 lines
5.5 KiB
C
201 lines
5.5 KiB
C
/*
|
|
* INTERNAL.H
|
|
*
|
|
* Internal header
|
|
*
|
|
* DRIVEARB.DLL - Shared Drive Aribiter for shared disks and libraries
|
|
* - inter-machine sharing client
|
|
* - inter-app sharing service
|
|
*
|
|
* Author: ErvinP
|
|
*
|
|
* (c) 2000 Microsoft Corporation
|
|
*
|
|
*/
|
|
|
|
|
|
#define DRIVEARB_SIG 'AvrD'
|
|
|
|
enum driveStates {
|
|
|
|
/*
|
|
* Note: this value designates that the driveContext block
|
|
* within the file mapping is FREE
|
|
*/
|
|
DRIVESTATE_NONE = 0,
|
|
|
|
// local node owns drive and no app is using it
|
|
DRIVESTATE_AVAILABLE_LOCALLY,
|
|
|
|
// local node owns drive and some local app is using it
|
|
DRIVESTATE_INUSE_LOCALLY,
|
|
|
|
// local node does NOT own the drive
|
|
DRIVESTATE_UNAVAILABLE_LOCALLY,
|
|
|
|
};
|
|
|
|
enum clientStates {
|
|
|
|
CLIENTSTATE_NONE = 0,
|
|
CLIENTSTATE_INACTIVE, // client session not using nor waiting for drive
|
|
CLIENTSTATE_WAITING, // client session waiting for drive
|
|
CLIENTSTATE_ACTIVE, // client session owns the drive
|
|
};
|
|
|
|
|
|
/*
|
|
* This is our internal context for a drive
|
|
*/
|
|
typedef struct {
|
|
|
|
DWORD sig;
|
|
|
|
enum driveStates state;
|
|
|
|
DWORD numCurrentReaders;
|
|
DWORD numCurrentWriters;
|
|
|
|
BOOL denyRead;
|
|
BOOL denyWrite;
|
|
|
|
/*
|
|
* Drive mutex, mapped to by clients' sessionDriveMutex
|
|
*/
|
|
HANDLE mutex;
|
|
|
|
/*
|
|
* Drive event, mapped to by clients' sessionDriveEvent
|
|
*/
|
|
HANDLE event;
|
|
|
|
/*
|
|
* The number of open sessions on this drive
|
|
*/
|
|
DWORD sessionReferenceCount;
|
|
|
|
/*
|
|
* The number of sessions waiting on this drive
|
|
*/
|
|
DWORD numWaitingSessions;
|
|
|
|
/*
|
|
* The drives filemap has been reallocated.
|
|
* We mark this flag in each driveContext so that
|
|
* each session can see it.
|
|
* Client needs to reopen a handle to its drive when
|
|
* this is set.
|
|
*/
|
|
BOOL isReallocated;
|
|
|
|
|
|
char driveName[MAX_PATH+1];
|
|
|
|
|
|
// BUGBUG - pad the end of this struct for alignment
|
|
|
|
} driveContext;
|
|
|
|
|
|
/*
|
|
* This is our internal context for a single client session's
|
|
* use of a particular drive.
|
|
*/
|
|
typedef struct {
|
|
|
|
DWORD sig;
|
|
|
|
enum clientStates state;
|
|
|
|
DWORD shareFlags;
|
|
|
|
/*
|
|
* This process' local handle for the
|
|
* shared drives file mapping.
|
|
*/
|
|
HANDLE hDrivesFileMap;
|
|
|
|
/*
|
|
* This process' local pointer for its view
|
|
* of its drive's portion of the shared drives file mapping.
|
|
*/
|
|
driveContext *driveViewPtr;
|
|
|
|
/*
|
|
* Index into the shared drives fileMap of this
|
|
* session's drive context
|
|
*/
|
|
DWORD driveIndex;
|
|
|
|
/*
|
|
* Process-local handles to shared synchronization objects
|
|
*/
|
|
HANDLE sessionDriveMutex;
|
|
HANDLE sessionDriveEvent;
|
|
|
|
/*
|
|
* Callback to forcibly invalidate the client's handle.
|
|
* Used only in case of error.
|
|
*/
|
|
INVALIDATE_DRIVE_HANDLE_PROC invalidateHandleProc;
|
|
|
|
/*
|
|
* Process-local Distributed Lock Manager handles
|
|
*/
|
|
dlm_nodeid_t sessionDlmHandle;
|
|
dlm_lockid_t sessionDlmLockHandle;
|
|
|
|
} clientSessionContext;
|
|
|
|
|
|
|
|
#define DRIVES_FILEMAP_NAME "DRIVEARB_DrivesFileMap"
|
|
#define GLOBAL_MUTEX_NAME "DRIVEARB_GlobalMutex"
|
|
#define DRIVE_MUTEX_NAME_PREFIX "DRIVEARB_DriveMutex_"
|
|
#define DRIVE_EVENT_NAME_PREFIX "DRIVEARB_DriveEvent_"
|
|
|
|
#define DRIVES_FILEMAP_INITIAL_SIZE 4
|
|
|
|
|
|
// BUGBUG REMOVE - debug only
|
|
#define DBGMSG(msg, arg) \
|
|
{ \
|
|
char _dbgMsg[100]; \
|
|
wsprintf(_dbgMsg, "%s: %xh=%d.", msg, (arg), (arg)); \
|
|
MessageBox(NULL, (LPSTR)_dbgMsg, "DriveArb debug message", MB_OK); \
|
|
}
|
|
|
|
#define ASSERT(fact) if (!(fact)){ MessageBox(NULL, (LPSTR)#fact, (LPSTR)"DriveArb assertion failed", MB_OK); }
|
|
|
|
|
|
BOOL InitDrivesFileMappingForProcess();
|
|
VOID DestroyDrivesFileMappingForProcess();
|
|
BOOL GrowDrivesFileMapping(DWORD newNumDrives);
|
|
|
|
driveContext *NewDriveContext(LPSTR driveName);
|
|
VOID FreeDriveContext(driveContext *drive);
|
|
DWORD GetDriveIndexByName(LPSTR driveName);
|
|
|
|
clientSessionContext *NewClientSession(LPSTR driveName);
|
|
VOID FreeClientSession(clientSessionContext *session);
|
|
BOOL LOCKDriveForSession(clientSessionContext *session);
|
|
VOID UNLOCKDriveForSession(clientSessionContext *session);
|
|
|
|
BOOL InitializeClientArbitration(clientSessionContext *session);
|
|
VOID ShutDownClientArbitration(clientSessionContext *session);
|
|
|
|
BOOL AcquireNodeLevelOwnership(clientSessionContext *session);
|
|
VOID ReleaseNodeLevelOwnership(clientSessionContext *session);
|
|
|
|
DWORD MyStrNCpy(LPSTR destStr, LPSTR srcStr, DWORD maxChars);
|
|
BOOL MyCompareStringsI(LPSTR s, LPSTR p);
|
|
|
|
|
|
|
|
|
|
extern HANDLE g_hSharedGlobalMutex;
|
|
extern HANDLE g_allDrivesFileMap;
|
|
extern driveContext *g_allDrivesViewPtr;
|
|
extern DWORD g_numDrivesInFileMap;
|
|
|