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.
|
|
/*++
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; }
|