diff --git a/reactos/include/ddk/iotypes.h b/reactos/include/ddk/iotypes.h index 8f4080633f9..e7fdf6585d6 100644 --- a/reactos/include/ddk/iotypes.h +++ b/reactos/include/ddk/iotypes.h @@ -1,4 +1,4 @@ -/* $Id: iotypes.h,v 1.28 2001/05/01 23:08:17 chorns Exp $ +/* $Id: iotypes.h,v 1.29 2001/05/24 22:18:16 ekohl Exp $ * */ @@ -42,17 +42,21 @@ enum typedef enum _CREATE_FILE_TYPE { - CreateFileTypeNone, - CreateFileTypeNamedPipe, - CreateFileTypeMailslot + CreateFileTypeNone, + CreateFileTypeNamedPipe, + CreateFileTypeMailslot } CREATE_FILE_TYPE; -/* - * FIXME: Definition needed - */ typedef struct _SHARE_ACCESS { + ULONG OpenCount; + ULONG Readers; + ULONG Writers; + ULONG Deleters; + ULONG SharedRead; + ULONG SharedWrite; + ULONG SharedDelete; } SHARE_ACCESS, *PSHARE_ACCESS; /* FUNCTION TYPES ************************************************************/ diff --git a/reactos/include/ntos/ntdef.h b/reactos/include/ntos/ntdef.h index 8b927ca207e..dbc0677ac1b 100644 --- a/reactos/include/ntos/ntdef.h +++ b/reactos/include/ntos/ntdef.h @@ -13,7 +13,8 @@ #define ANYSIZE_ARRAY (1) -#define SYNCHRONIZE (0x100000L) +#define DELETE (0x00010000L) +#define SYNCHRONIZE (0x00100000L) #define DUPLICATE_CLOSE_SOURCE (1) #define DUPLICATE_SAME_ACCESS (2) diff --git a/reactos/ntoskrnl/io/share.c b/reactos/ntoskrnl/io/share.c index e830062ea3d..2beeb7d607f 100644 --- a/reactos/ntoskrnl/io/share.c +++ b/reactos/ntoskrnl/io/share.c @@ -1,4 +1,4 @@ -/* $Id: share.c,v 1.2 2000/03/26 19:38:26 ea Exp $ +/* $Id: share.c,v 1.3 2001/05/24 22:19:25 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -17,89 +17,284 @@ /* FUNCTIONS *****************************************************************/ -VOID -STDCALL -IoUpdateShareAccess(PFILE_OBJECT FileObject, PSHARE_ACCESS ShareAccess) +VOID STDCALL +IoUpdateShareAccess(PFILE_OBJECT FileObject, + PSHARE_ACCESS ShareAccess) { - UNIMPLEMENTED; + if ((FileObject->ReadAccess == FALSE) && + (FileObject->WriteAccess == FALSE) && + (FileObject->DeleteAccess == FALSE)) + { + return; + } + + ShareAccess->OpenCount++; + + if (FileObject->ReadAccess == TRUE) + { + ShareAccess->Readers++; + } + + if (FileObject->WriteAccess == TRUE) + { + ShareAccess->Writers++; + } + + if (FileObject->DeleteAccess == TRUE) + { + ShareAccess->Deleters++; + } + + if (FileObject->SharedRead == TRUE) + { + ShareAccess->SharedRead++; + } + + if (FileObject->SharedWrite == TRUE) + { + ShareAccess->SharedWrite++; + } + + if (FileObject->SharedDelete == TRUE) + { + ShareAccess->SharedDelete++; + } } -VOID -STDCALL -IoCheckDesiredAccess ( - DWORD Unknown0, - DWORD Unknown1 - ) -{ - UNIMPLEMENTED; -} - - -NTSTATUS -STDCALL -IoCheckEaBufferValidity ( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2 - ) -{ - UNIMPLEMENTED; - return (STATUS_NOT_IMPLEMENTED); -} - - -NTSTATUS -STDCALL -IoCheckFunctionAccess ( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2, - DWORD Unknown3, - DWORD Unknown4, - DWORD Unknown5 - ) -{ - UNIMPLEMENTED; - return (STATUS_NOT_IMPLEMENTED); -} - - -NTSTATUS -STDCALL +NTSTATUS STDCALL IoCheckShareAccess(ACCESS_MASK DesiredAccess, - ULONG DesiredShareAccess, - PFILE_OBJECT FileObject, - PSHARE_ACCESS ShareAccess, - BOOLEAN Update) + ULONG DesiredShareAccess, + PFILE_OBJECT FileObject, + PSHARE_ACCESS ShareAccess, + BOOLEAN Update) { - UNIMPLEMENTED; - return (STATUS_NOT_IMPLEMENTED); + BOOLEAN ReadAccess; + BOOLEAN WriteAccess; + BOOLEAN DeleteAccess; + BOOLEAN SharedRead; + BOOLEAN SharedWrite; + BOOLEAN SharedDelete; + + ReadAccess = (DesiredAccess & (FILE_READ_DATA | FILE_EXECUTE)); + WriteAccess = (DesiredAccess & (FILE_READ_DATA | FILE_APPEND_DATA)); + ReadAccess = (DesiredAccess & DELETE); + + FileObject->ReadAccess = ReadAccess; + FileObject->WriteAccess = WriteAccess; + FileObject->DeleteAccess = DeleteAccess; + + if (!ReadAccess && !WriteAccess && !DeleteAccess) + { + return (STATUS_SUCCESS); + } + + SharedRead = (DesiredShareAccess & FILE_SHARE_READ); + SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE); + SharedDelete = (DesiredShareAccess & FILE_SHARE_DELETE); + + FileObject->SharedRead = SharedRead; + FileObject->SharedWrite = SharedWrite; + FileObject->SharedDelete = SharedDelete; + + if (ReadAccess) + { + if (ShareAccess->SharedRead < ShareAccess->OpenCount) + return (STATUS_SHARING_VIOLATION); + } + + if (WriteAccess) + { + if (ShareAccess->SharedWrite < ShareAccess->OpenCount) + return (STATUS_SHARING_VIOLATION); + } + + if (DeleteAccess) + { + if (ShareAccess->SharedDelete < ShareAccess->OpenCount) + return (STATUS_SHARING_VIOLATION); + } + + if (ShareAccess->Readers != 0) + { + if (SharedRead == FALSE) + return (STATUS_SHARING_VIOLATION); + } + + if (ShareAccess->Writers != 0) + { + if (SharedWrite == FALSE) + return (STATUS_SHARING_VIOLATION); + } + + if (ShareAccess->Deleters != 0) + { + if (SharedDelete == FALSE) + return (STATUS_SHARING_VIOLATION); + } + + if (Update == TRUE) + { + ShareAccess->OpenCount++; + + if (ReadAccess == TRUE) + ShareAccess->Readers++; + + if (WriteAccess == TRUE) + ShareAccess->Writers++; + + if (DeleteAccess == TRUE) + ShareAccess->Deleters++; + + if (SharedRead == TRUE) + ShareAccess->SharedRead++; + + if (SharedWrite == TRUE) + ShareAccess->SharedWrite++; + + if (SharedDelete == TRUE) + ShareAccess->SharedDelete++; + } + + return (STATUS_SUCCESS); } -VOID -STDCALL +VOID STDCALL IoRemoveShareAccess(PFILE_OBJECT FileObject, - PSHARE_ACCESS ShareAccess) + PSHARE_ACCESS ShareAccess) { - UNIMPLEMENTED; + if ((FileObject->ReadAccess == FALSE) && + (FileObject->WriteAccess == FALSE) && + (FileObject->DeleteAccess == FALSE)) + { + return; + } + + ShareAccess->OpenCount--; + + if (FileObject->ReadAccess == TRUE) + { + ShareAccess->Readers--; + } + + if (FileObject->WriteAccess == TRUE) + { + ShareAccess->Writers--; + } + + if (FileObject->DeleteAccess == TRUE) + { + ShareAccess->Deleters--; + } + + if (FileObject->SharedRead == TRUE) + { + ShareAccess->SharedRead--; + } + + if (FileObject->SharedWrite == TRUE) + { + ShareAccess->SharedWrite--; + } + + if (FileObject->SharedDelete == TRUE) + { + ShareAccess->SharedDelete--; + } } -VOID -STDCALL +VOID STDCALL IoSetShareAccess(ACCESS_MASK DesiredAccess, - ULONG DesiredShareAccess, - PFILE_OBJECT FileObject, - PSHARE_ACCESS ShareAccess) + ULONG DesiredShareAccess, + PFILE_OBJECT FileObject, + PSHARE_ACCESS ShareAccess) +{ + BOOLEAN ReadAccess; + BOOLEAN WriteAccess; + BOOLEAN DeleteAccess; + BOOLEAN SharedRead; + BOOLEAN SharedWrite; + BOOLEAN SharedDelete; + + ReadAccess = (DesiredAccess & (FILE_READ_DATA | FILE_EXECUTE)); + WriteAccess = (DesiredAccess & (FILE_READ_DATA | FILE_APPEND_DATA)); + ReadAccess = (DesiredAccess & DELETE); + + FileObject->ReadAccess = ReadAccess; + FileObject->WriteAccess = WriteAccess; + FileObject->DeleteAccess = DeleteAccess; + + if (!ReadAccess && !WriteAccess && !DeleteAccess) + { + FileObject->SharedRead = FALSE; + FileObject->SharedWrite = FALSE; + FileObject->SharedDelete = FALSE; + + ShareAccess->OpenCount = 0; + ShareAccess->Readers = 0; + ShareAccess->Writers = 0; + ShareAccess->Deleters = 0; + + ShareAccess->SharedRead = 0; + ShareAccess->SharedWrite = 0; + ShareAccess->SharedDelete = 0; + } + else + { + SharedRead = (DesiredShareAccess & FILE_SHARE_READ); + SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE); + SharedDelete = (DesiredShareAccess & FILE_SHARE_DELETE); + + FileObject->SharedRead = SharedRead; + FileObject->SharedWrite = SharedWrite; + FileObject->SharedDelete = SharedDelete; + + ShareAccess->OpenCount = 1; + ShareAccess->Readers = (ReadAccess) ? 1 : 0; + ShareAccess->Writers = (WriteAccess) ? 1 : 0; + ShareAccess->Deleters = (DeleteAccess) ? 1 : 0; + + ShareAccess->SharedRead = (SharedRead) ? 1 : 0; + ShareAccess->SharedWrite = (SharedWrite) ? 1 : 0; + ShareAccess->SharedDelete = (SharedDelete) ? 1 : 0; + } +} + + +VOID STDCALL +IoCheckDesiredAccess(DWORD Unknown0, + DWORD Unknown1) { UNIMPLEMENTED; } -NTSTATUS -STDCALL +NTSTATUS STDCALL +IoCheckEaBufferValidity(DWORD Unknown0, + DWORD Unknown1, + DWORD Unknown2) +{ + UNIMPLEMENTED; + return (STATUS_NOT_IMPLEMENTED); +} + + +NTSTATUS STDCALL +IoCheckFunctionAccess(DWORD Unknown0, + DWORD Unknown1, + DWORD Unknown2, + DWORD Unknown3, + DWORD Unknown4, + DWORD Unknown5) +{ + UNIMPLEMENTED; + return (STATUS_NOT_IMPLEMENTED); +} + + +NTSTATUS STDCALL IoSetInformation ( IN PFILE_OBJECT FileObject, IN FILE_INFORMATION_CLASS FileInformationClass, @@ -112,8 +307,7 @@ IoSetInformation ( } -VOID -STDCALL +VOID STDCALL IoFastQueryNetworkAttributes ( DWORD Unknown0, DWORD Unknown1,