Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenfinfo.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS kernel 00004 * FILE: drivers/filesystems/msfs/finfo.c 00005 * PURPOSE: Mailslot filesystem 00006 * PROGRAMMER: Eric Kohl 00007 */ 00008 00009 /* INCLUDES ******************************************************************/ 00010 00011 #include "msfs.h" 00012 00013 #define NDEBUG 00014 #include <debug.h> 00015 00016 #undef MAILSLOT_NO_MESSAGE 00017 #undef MAILSLOT_WAIT_FOREVER 00018 #define MAILSLOT_NO_MESSAGE MAXULONG 00019 #define MAILSLOT_WAIT_FOREVER MAXULONG 00020 00021 00022 /* FUNCTIONS *****************************************************************/ 00023 00024 static NTSTATUS 00025 MsfsQueryMailslotInformation(PMSFS_FCB Fcb, 00026 PFILE_MAILSLOT_QUERY_INFORMATION Buffer, 00027 PULONG BufferLength) 00028 { 00029 KIRQL oldIrql; 00030 00031 if (*BufferLength < sizeof(FILE_MAILSLOT_QUERY_INFORMATION)) 00032 return STATUS_BUFFER_OVERFLOW; 00033 00034 Buffer->MaximumMessageSize = Fcb->MaxMessageSize; 00035 Buffer->ReadTimeout = Fcb->TimeOut; 00036 00037 KeAcquireSpinLock(&Fcb->MessageListLock, &oldIrql); 00038 Buffer->MessagesAvailable = Fcb->MessageCount; 00039 if (Fcb->MessageCount == 0) 00040 { 00041 Buffer->NextMessageSize = MAILSLOT_NO_MESSAGE; 00042 } 00043 else 00044 { 00045 PMSFS_MESSAGE Message = CONTAINING_RECORD(Fcb->MessageListHead.Flink, 00046 MSFS_MESSAGE, 00047 MessageListEntry); 00048 Buffer->NextMessageSize = Message->Size; 00049 } 00050 KeReleaseSpinLock(&Fcb->MessageListLock, oldIrql); 00051 00052 *BufferLength -= sizeof(FILE_MAILSLOT_QUERY_INFORMATION); 00053 00054 return STATUS_SUCCESS; 00055 } 00056 00057 00058 static NTSTATUS 00059 MsfsSetMailslotInformation(PMSFS_FCB Fcb, 00060 PFILE_MAILSLOT_SET_INFORMATION Buffer, 00061 PULONG BufferLength) 00062 { 00063 if (*BufferLength < sizeof(FILE_MAILSLOT_SET_INFORMATION)) 00064 return STATUS_BUFFER_OVERFLOW; 00065 00066 Fcb->TimeOut = *Buffer->ReadTimeout; 00067 00068 return STATUS_SUCCESS; 00069 } 00070 00071 00072 NTSTATUS DEFAULTAPI 00073 MsfsQueryInformation(PDEVICE_OBJECT DeviceObject, 00074 PIRP Irp) 00075 { 00076 PIO_STACK_LOCATION IoStack; 00077 FILE_INFORMATION_CLASS FileInformationClass; 00078 PFILE_OBJECT FileObject; 00079 PMSFS_FCB Fcb; 00080 PMSFS_CCB Ccb; 00081 PVOID SystemBuffer; 00082 ULONG BufferLength; 00083 NTSTATUS Status; 00084 00085 DPRINT("MsfsQueryInformation(DeviceObject %p Irp %p)\n", 00086 DeviceObject, Irp); 00087 00088 IoStack = IoGetCurrentIrpStackLocation (Irp); 00089 FileInformationClass = IoStack->Parameters.QueryFile.FileInformationClass; 00090 FileObject = IoStack->FileObject; 00091 Fcb = (PMSFS_FCB)FileObject->FsContext; 00092 Ccb = (PMSFS_CCB)FileObject->FsContext2; 00093 00094 DPRINT("Mailslot name: %wZ\n", &Fcb->Name); 00095 00096 /* querying information is not permitted on client side */ 00097 if (Fcb->ServerCcb != Ccb) 00098 { 00099 Status = STATUS_ACCESS_DENIED; 00100 00101 Irp->IoStatus.Status = Status; 00102 Irp->IoStatus.Information = 0; 00103 00104 IoCompleteRequest(Irp, IO_NO_INCREMENT); 00105 00106 return Status; 00107 } 00108 00109 SystemBuffer = Irp->AssociatedIrp.SystemBuffer; 00110 BufferLength = IoStack->Parameters.QueryFile.Length; 00111 00112 switch (FileInformationClass) 00113 { 00114 case FileMailslotQueryInformation: 00115 Status = MsfsQueryMailslotInformation(Fcb, 00116 SystemBuffer, 00117 &BufferLength); 00118 break; 00119 00120 default: 00121 Status = STATUS_NOT_IMPLEMENTED; 00122 } 00123 00124 Irp->IoStatus.Status = Status; 00125 if (NT_SUCCESS(Status)) 00126 Irp->IoStatus.Information = 00127 IoStack->Parameters.QueryFile.Length - BufferLength; 00128 else 00129 Irp->IoStatus.Information = 0; 00130 IoCompleteRequest(Irp, IO_NO_INCREMENT); 00131 00132 return Status; 00133 } 00134 00135 00136 NTSTATUS DEFAULTAPI 00137 MsfsSetInformation(PDEVICE_OBJECT DeviceObject, 00138 PIRP Irp) 00139 { 00140 PIO_STACK_LOCATION IoStack; 00141 FILE_INFORMATION_CLASS FileInformationClass; 00142 PFILE_OBJECT FileObject; 00143 PMSFS_FCB Fcb; 00144 PMSFS_CCB Ccb; 00145 PVOID SystemBuffer; 00146 ULONG BufferLength; 00147 NTSTATUS Status; 00148 00149 DPRINT("MsfsSetInformation(DeviceObject %p Irp %p)\n", DeviceObject, Irp); 00150 00151 IoStack = IoGetCurrentIrpStackLocation (Irp); 00152 FileInformationClass = IoStack->Parameters.QueryFile.FileInformationClass; 00153 FileObject = IoStack->FileObject; 00154 Fcb = (PMSFS_FCB)FileObject->FsContext; 00155 Ccb = (PMSFS_CCB)FileObject->FsContext2; 00156 00157 DPRINT("Mailslot name: %wZ\n", &Fcb->Name); 00158 00159 /* setting information is not permitted on client side */ 00160 if (Fcb->ServerCcb != Ccb) 00161 { 00162 Status = STATUS_ACCESS_DENIED; 00163 00164 Irp->IoStatus.Status = Status; 00165 Irp->IoStatus.Information = 0; 00166 00167 IoCompleteRequest(Irp, IO_NO_INCREMENT); 00168 00169 return Status; 00170 } 00171 00172 SystemBuffer = Irp->AssociatedIrp.SystemBuffer; 00173 BufferLength = IoStack->Parameters.QueryFile.Length; 00174 00175 DPRINT("FileInformationClass %d\n", FileInformationClass); 00176 DPRINT("SystemBuffer %p\n", SystemBuffer); 00177 00178 switch (FileInformationClass) 00179 { 00180 case FileMailslotSetInformation: 00181 Status = MsfsSetMailslotInformation(Fcb, 00182 SystemBuffer, 00183 &BufferLength); 00184 break; 00185 00186 default: 00187 Status = STATUS_NOT_IMPLEMENTED; 00188 } 00189 00190 Irp->IoStatus.Status = Status; 00191 Irp->IoStatus.Information = 0; 00192 IoCompleteRequest(Irp, IO_NO_INCREMENT); 00193 00194 return Status; 00195 } 00196 00197 /* EOF */ Generated on Fri May 25 2012 04:25:49 for ReactOS by
1.7.6.1
|