Windows2000/private/ntos/w32/ntcon/server/share.c
2020-09-30 17:12:32 +02:00

175 lines
3.9 KiB
C

/*++
Copyright (c) 1985 - 1999, Microsoft Corporation
Module Name:
share.c
Abstract:
Implements sharing for input and output handles
Author:
Therese Stowell (thereses) 11-Nov-1990
Revision History:
--*/
#include "precomp.h"
#pragma hdrstop
NTSTATUS
ConsoleAddShare(
IN ACCESS_MASK DesiredAccess,
IN ULONG DesiredShareAccess,
IN OUT PCONSOLE_SHARE_ACCESS ShareAccess,
IN OUT PHANDLE_DATA HandleData
)
{
ULONG Ocount;
ULONG ReadAccess;
ULONG WriteAccess;
ULONG SharedRead;
ULONG SharedWrite;
// Set the access type in the file object for the current accessor.
ReadAccess = (DesiredAccess & GENERIC_READ) != 0;
WriteAccess = (DesiredAccess & GENERIC_WRITE) != 0;
SharedRead = (DesiredShareAccess & FILE_SHARE_READ) != 0;
SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE) != 0;
// Now check to see whether or not the desired accesses are compatible
// with the way that the file is currently open.
Ocount = ShareAccess->OpenCount;
if ( (ReadAccess && (ShareAccess->SharedRead < Ocount))
||
(WriteAccess && (ShareAccess->SharedWrite < Ocount))
||
((ShareAccess->Readers != 0) && !SharedRead)
||
((ShareAccess->Writers != 0) && !SharedWrite)
) {
// The check failed. Simply return to the caller indicating that the
// current open cannot access the file.
return STATUS_SHARING_VIOLATION;
} else {
// The check was successful. Update the counter information in the
// shared access structure for this open request if the caller
// specified that it should be updated.
ShareAccess->OpenCount++;
ShareAccess->Readers += ReadAccess;
ShareAccess->Writers += WriteAccess;
ShareAccess->SharedRead += SharedRead;
ShareAccess->SharedWrite += SharedWrite;
HandleData->Access = DesiredAccess;
HandleData->ShareAccess = DesiredShareAccess;
return STATUS_SUCCESS;
}
}
NTSTATUS
ConsoleDupShare(
IN ACCESS_MASK DesiredAccess,
IN ULONG DesiredShareAccess,
IN OUT PCONSOLE_SHARE_ACCESS ShareAccess,
IN OUT PHANDLE_DATA TargetHandleData
)
{
ULONG ReadAccess;
ULONG WriteAccess;
ULONG SharedRead;
ULONG SharedWrite;
// Set the access type in the file object for the current accessor.
ReadAccess = (DesiredAccess & GENERIC_READ) != 0;
WriteAccess = (DesiredAccess & GENERIC_WRITE) != 0;
SharedRead = (DesiredShareAccess & FILE_SHARE_READ) != 0;
SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE) != 0;
if (ShareAccess->OpenCount == 0) {
ASSERT (FALSE);
return STATUS_SHARING_VIOLATION;
}
ShareAccess->OpenCount++;
ShareAccess->Readers += ReadAccess;
ShareAccess->Writers += WriteAccess;
ShareAccess->SharedRead += SharedRead;
ShareAccess->SharedWrite += SharedWrite;
TargetHandleData->Access = DesiredAccess;
TargetHandleData->ShareAccess = DesiredShareAccess;
return STATUS_SUCCESS;
}
NTSTATUS
ConsoleRemoveShare(
IN ULONG DesiredAccess,
IN ULONG DesiredShareAccess,
IN OUT PCONSOLE_SHARE_ACCESS ShareAccess
)
{
ULONG ReadAccess;
ULONG WriteAccess;
ULONG SharedRead;
ULONG SharedWrite;
// Set the access type in the file object for the current accessor.
ReadAccess = (DesiredAccess & GENERIC_READ) != 0;
WriteAccess = (DesiredAccess & GENERIC_WRITE) != 0;
SharedRead = (DesiredShareAccess & FILE_SHARE_READ) != 0;
SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE) != 0;
if (ShareAccess->OpenCount == 0) {
ASSERT (FALSE);
return STATUS_UNSUCCESSFUL;
}
ShareAccess->OpenCount--;
ShareAccess->Readers -= ReadAccess;
ShareAccess->Writers -= WriteAccess;
ShareAccess->SharedRead -= SharedRead;
ShareAccess->SharedWrite -= SharedWrite;
return STATUS_SUCCESS;
}