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.
174 lines
4.1 KiB
174 lines
4.1 KiB
/*++
|
|
|
|
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;
|
|
}
|