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.
 
 
 
 
 
 

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;
}