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/fs/np/finfo.c 00005 * PURPOSE: Named pipe filesystem 00006 * PROGRAMMER: Eric Kohl 00007 */ 00008 00009 /* INCLUDES ******************************************************************/ 00010 00011 #include "npfs.h" 00012 00013 #define NDEBUG 00014 #include <debug.h> 00015 00016 /* FUNCTIONS *****************************************************************/ 00017 00018 static 00019 NTSTATUS 00020 NpfsSetPipeInformation(PDEVICE_OBJECT DeviceObject, 00021 PNPFS_CCB Ccb, 00022 PFILE_PIPE_INFORMATION Info, 00023 PULONG BufferLength) 00024 { 00025 PNPFS_FCB Fcb; 00026 PFILE_PIPE_INFORMATION Request; 00027 DPRINT("NpfsSetPipeInformation()\n"); 00028 00029 if (*BufferLength < sizeof(FILE_PIPE_INFORMATION)) 00030 { 00031 /* Buffer too small */ 00032 return STATUS_INFO_LENGTH_MISMATCH; 00033 } 00034 00035 00036 /* Get the Pipe and data */ 00037 Fcb = Ccb->Fcb; 00038 Request = (PFILE_PIPE_INFORMATION)Info; 00039 00040 if ((Fcb->PipeType == FILE_PIPE_BYTE_STREAM_TYPE) && (Request->ReadMode == FILE_PIPE_MESSAGE_MODE)) 00041 { 00042 DPRINT("Cannot change readmode to message type on a byte type pipe!\n"); 00043 return STATUS_ACCESS_DENIED; 00044 } 00045 00046 /* Set Pipe Data */ 00047 if (Ccb->PipeEnd == FILE_PIPE_CLIENT_END) 00048 { 00049 Fcb->ClientReadMode = Request->ReadMode; 00050 } 00051 else 00052 { 00053 Fcb->ServerReadMode = Request->ReadMode; 00054 } 00055 00056 Fcb->CompletionMode = Request->CompletionMode; 00057 00058 /* Return Success */ 00059 return STATUS_SUCCESS; 00060 } 00061 00062 static 00063 NTSTATUS 00064 NpfsSetPipeRemoteInformation(PDEVICE_OBJECT DeviceObject, 00065 PNPFS_CCB Ccb, 00066 PFILE_PIPE_INFORMATION Info, 00067 PULONG BufferLength) 00068 { 00069 PNPFS_FCB Fcb; 00070 PFILE_PIPE_REMOTE_INFORMATION Request; 00071 DPRINT("NpfsSetPipeRemoteInformation()\n"); 00072 00073 if (*BufferLength < sizeof(FILE_PIPE_REMOTE_INFORMATION)) 00074 { 00075 /* Buffer too small */ 00076 return STATUS_INFO_LENGTH_MISMATCH; 00077 } 00078 00079 /* Get the Pipe and data */ 00080 Fcb = Ccb->Fcb; 00081 Request = (PFILE_PIPE_REMOTE_INFORMATION)Info; 00082 00083 /* Set the Settings */ 00084 Fcb->TimeOut = Request->CollectDataTime; 00085 Fcb->InboundQuota = Request->MaximumCollectionCount; 00086 00087 /* Return Success */ 00088 return STATUS_SUCCESS; 00089 } 00090 00091 static 00092 NTSTATUS 00093 NpfsQueryPipeInformation(PDEVICE_OBJECT DeviceObject, 00094 PNPFS_CCB Ccb, 00095 PFILE_PIPE_INFORMATION Info, 00096 PULONG BufferLength) 00097 { 00098 PNPFS_FCB Fcb; 00099 ULONG ConnectionSideReadMode; 00100 DPRINT("NpfsQueryPipeInformation()\n"); 00101 00102 if (*BufferLength < sizeof(FILE_PIPE_INFORMATION)) 00103 { 00104 /* Buffer too small */ 00105 *BufferLength = sizeof(FILE_PIPE_INFORMATION); 00106 return STATUS_BUFFER_OVERFLOW; 00107 } 00108 00109 /* Get the Pipe */ 00110 Fcb = Ccb->Fcb; 00111 00112 /* Clear Info */ 00113 RtlZeroMemory(Info, sizeof(FILE_PIPE_INFORMATION)); 00114 00115 if (Ccb->PipeEnd == FILE_PIPE_CLIENT_END) ConnectionSideReadMode=Ccb->Fcb->ClientReadMode; 00116 else ConnectionSideReadMode = Ccb->Fcb->ServerReadMode; 00117 00118 /* Return Info */ 00119 Info->CompletionMode = Fcb->CompletionMode; 00120 Info->ReadMode = ConnectionSideReadMode; 00121 00122 /* Return success */ 00123 *BufferLength = sizeof(FILE_PIPE_INFORMATION); 00124 return STATUS_SUCCESS; 00125 } 00126 00127 static 00128 NTSTATUS 00129 NpfsQueryPipeRemoteInformation(PDEVICE_OBJECT DeviceObject, 00130 PNPFS_CCB Ccb, 00131 PFILE_PIPE_REMOTE_INFORMATION Info, 00132 PULONG BufferLength) 00133 { 00134 PNPFS_FCB Fcb; 00135 DPRINT("NpfsQueryPipeRemoteInformation()\n"); 00136 00137 if (*BufferLength < sizeof(FILE_PIPE_REMOTE_INFORMATION)) 00138 { 00139 /* Buffer too small */ 00140 *BufferLength = sizeof(FILE_PIPE_REMOTE_INFORMATION); 00141 return STATUS_BUFFER_OVERFLOW; 00142 } 00143 00144 /* Get the Pipe */ 00145 Fcb = Ccb->Fcb; 00146 00147 /* Clear Info */ 00148 RtlZeroMemory(Info, sizeof(FILE_PIPE_REMOTE_INFORMATION)); 00149 00150 /* Return Info */ 00151 Info->MaximumCollectionCount = Fcb->InboundQuota; 00152 Info->CollectDataTime = Fcb->TimeOut; 00153 00154 /* Return success */ 00155 *BufferLength = sizeof(FILE_PIPE_REMOTE_INFORMATION); 00156 return STATUS_SUCCESS; 00157 } 00158 00159 00160 static NTSTATUS 00161 NpfsQueryLocalPipeInformation(PDEVICE_OBJECT DeviceObject, 00162 PNPFS_CCB Ccb, 00163 PFILE_PIPE_LOCAL_INFORMATION Info, 00164 PULONG BufferLength) 00165 { 00166 PNPFS_FCB Fcb; 00167 00168 DPRINT("NpfsQueryLocalPipeInformation()\n"); 00169 00170 if (*BufferLength < sizeof(FILE_PIPE_REMOTE_INFORMATION)) 00171 { 00172 /* Buffer too small */ 00173 *BufferLength = sizeof(FILE_PIPE_REMOTE_INFORMATION); 00174 return STATUS_BUFFER_OVERFLOW; 00175 } 00176 00177 /* Get the Pipe */ 00178 Fcb = Ccb->Fcb; 00179 00180 /* Clear Info */ 00181 RtlZeroMemory(Info, 00182 sizeof(FILE_PIPE_LOCAL_INFORMATION)); 00183 00184 /* Return Info */ 00185 Info->NamedPipeType = Fcb->PipeType; 00186 Info->NamedPipeConfiguration = Fcb->PipeConfiguration; 00187 Info->MaximumInstances = Fcb->MaximumInstances; 00188 Info->CurrentInstances = Fcb->CurrentInstances; 00189 Info->InboundQuota = Fcb->InboundQuota; 00190 Info->OutboundQuota = Fcb->OutboundQuota; 00191 Info->NamedPipeState = Ccb->PipeState; 00192 Info->NamedPipeEnd = Ccb->PipeEnd; 00193 00194 if (Ccb->PipeEnd == FILE_PIPE_SERVER_END) 00195 { 00196 Info->ReadDataAvailable = Ccb->ReadDataAvailable; 00197 Info->WriteQuotaAvailable = Ccb->WriteQuotaAvailable; 00198 } 00199 else if (Ccb->OtherSide != NULL) 00200 { 00201 Info->ReadDataAvailable = Ccb->OtherSide->ReadDataAvailable; 00202 Info->WriteQuotaAvailable = Ccb->OtherSide->WriteQuotaAvailable; 00203 } 00204 00205 *BufferLength = sizeof(FILE_PIPE_LOCAL_INFORMATION); 00206 return STATUS_SUCCESS; 00207 } 00208 00209 00210 NTSTATUS NTAPI 00211 NpfsQueryInformation(PDEVICE_OBJECT DeviceObject, 00212 PIRP Irp) 00213 { 00214 PIO_STACK_LOCATION IoStack; 00215 FILE_INFORMATION_CLASS FileInformationClass; 00216 PFILE_OBJECT FileObject; 00217 //PNPFS_VCB Vcb; 00218 PNPFS_FCB Fcb; 00219 PNPFS_CCB Ccb; 00220 PVOID SystemBuffer; 00221 ULONG BufferLength; 00222 NTSTATUS Status; 00223 00224 DPRINT("NpfsQueryInformation(DeviceObject %p Irp %p)\n", DeviceObject, Irp); 00225 00226 IoStack = IoGetCurrentIrpStackLocation (Irp); 00227 FileInformationClass = IoStack->Parameters.QueryFile.FileInformationClass; 00228 //Vcb = (PNPFS_VCB)DeviceObject->DeviceExtension; 00229 FileObject = IoStack->FileObject; 00230 Ccb = (PNPFS_CCB)FileObject->FsContext2; 00231 Fcb = Ccb->Fcb; 00232 00233 SystemBuffer = Irp->AssociatedIrp.SystemBuffer; 00234 BufferLength = IoStack->Parameters.QueryFile.Length; 00235 00236 DPRINT("Pipe name: %wZ\n", &Fcb->PipeName); 00237 DPRINT("FileInformationClass %d\n", FileInformationClass); 00238 DPRINT("SystemBuffer %p\n", SystemBuffer); 00239 DPRINT("BufferLength %lu\n", BufferLength); 00240 00241 switch (FileInformationClass) 00242 { 00243 case FilePipeInformation: 00244 Status = NpfsQueryPipeInformation(DeviceObject, 00245 Ccb, 00246 SystemBuffer, 00247 &BufferLength); 00248 break; 00249 00250 case FilePipeLocalInformation: 00251 Status = NpfsQueryLocalPipeInformation(DeviceObject, 00252 Ccb, 00253 SystemBuffer, 00254 &BufferLength); 00255 break; 00256 00257 case FilePipeRemoteInformation: 00258 Status = NpfsQueryPipeRemoteInformation(DeviceObject, 00259 Ccb, 00260 SystemBuffer, 00261 &BufferLength); 00262 break; 00263 00264 default: 00265 Status = STATUS_NOT_SUPPORTED; 00266 BufferLength = 0; 00267 } 00268 00269 Irp->IoStatus.Status = Status; 00270 Irp->IoStatus.Information = BufferLength; 00271 00272 IoCompleteRequest (Irp, IO_NO_INCREMENT); 00273 00274 return Status; 00275 } 00276 00277 00278 NTSTATUS NTAPI 00279 NpfsSetInformation(PDEVICE_OBJECT DeviceObject, 00280 PIRP Irp) 00281 { 00282 PIO_STACK_LOCATION IoStack; 00283 FILE_INFORMATION_CLASS FileInformationClass; 00284 PFILE_OBJECT FileObject; 00285 PNPFS_FCB Fcb; 00286 PNPFS_CCB Ccb; 00287 PVOID SystemBuffer; 00288 ULONG BufferLength; 00289 NTSTATUS Status; 00290 00291 DPRINT("NpfsSetInformation(DeviceObject %p Irp %p)\n", DeviceObject, Irp); 00292 00293 IoStack = IoGetCurrentIrpStackLocation (Irp); 00294 FileInformationClass = IoStack->Parameters.QueryFile.FileInformationClass; 00295 FileObject = IoStack->FileObject; 00296 Ccb = (PNPFS_CCB)FileObject->FsContext2; 00297 Fcb = Ccb->Fcb; 00298 00299 SystemBuffer = Irp->AssociatedIrp.SystemBuffer; 00300 BufferLength = IoStack->Parameters.QueryFile.Length; 00301 00302 DPRINT("Pipe name: %wZ\n", &Fcb->PipeName); 00303 DPRINT("FileInformationClass %d\n", FileInformationClass); 00304 DPRINT("SystemBuffer %p\n", SystemBuffer); 00305 DPRINT("BufferLength %lu\n", BufferLength); 00306 00307 switch (FileInformationClass) 00308 { 00309 case FilePipeInformation: 00310 /* Call the handler */ 00311 Status = NpfsSetPipeInformation(DeviceObject, 00312 Ccb, 00313 SystemBuffer, 00314 &BufferLength); 00315 break; 00316 00317 case FilePipeLocalInformation: 00318 Status = STATUS_NOT_IMPLEMENTED; 00319 break; 00320 00321 case FilePipeRemoteInformation: 00322 /* Call the handler */ 00323 Status = NpfsSetPipeRemoteInformation(DeviceObject, 00324 Ccb, 00325 SystemBuffer, 00326 &BufferLength); 00327 break; 00328 default: 00329 Status = STATUS_NOT_SUPPORTED; 00330 } 00331 00332 Irp->IoStatus.Status = Status; 00333 Irp->IoStatus.Information = 0; 00334 IoCompleteRequest(Irp, IO_NO_INCREMENT); 00335 return Status; 00336 } 00337 00338 /* EOF */ Generated on Fri May 25 2012 04:25:49 for ReactOS by
1.7.6.1
|