windows-nt/Source/XPSP1/NT/drivers/storage/drivearb/dll/internal.h
2020-09-26 16:20:57 +08:00

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;