2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: drivers/filesystems/msfs/finfo.c
5 * PURPOSE: Mailslot filesystem
6 * PROGRAMMER: Eric Kohl
9 /* INCLUDES ******************************************************************/
16 #undef MAILSLOT_NO_MESSAGE
17 #undef MAILSLOT_WAIT_FOREVER
18 #define MAILSLOT_NO_MESSAGE MAXULONG
19 #define MAILSLOT_WAIT_FOREVER MAXULONG
22 /* FUNCTIONS *****************************************************************/
25 MsfsQueryMailslotInformation(PMSFS_FCB Fcb
,
26 PFILE_MAILSLOT_QUERY_INFORMATION Buffer
,
31 if (*BufferLength
< sizeof(FILE_MAILSLOT_QUERY_INFORMATION
))
32 return STATUS_BUFFER_OVERFLOW
;
34 Buffer
->MaximumMessageSize
= Fcb
->MaxMessageSize
;
35 Buffer
->ReadTimeout
= Fcb
->TimeOut
;
37 KeAcquireSpinLock(&Fcb
->MessageListLock
, &oldIrql
);
38 Buffer
->MessagesAvailable
= Fcb
->MessageCount
;
39 if (Fcb
->MessageCount
== 0)
41 Buffer
->NextMessageSize
= MAILSLOT_NO_MESSAGE
;
45 PMSFS_MESSAGE Message
= CONTAINING_RECORD(Fcb
->MessageListHead
.Flink
,
48 Buffer
->NextMessageSize
= Message
->Size
;
50 KeReleaseSpinLock(&Fcb
->MessageListLock
, oldIrql
);
52 *BufferLength
-= sizeof(FILE_MAILSLOT_QUERY_INFORMATION
);
54 return STATUS_SUCCESS
;
59 MsfsSetMailslotInformation(PMSFS_FCB Fcb
,
60 PFILE_MAILSLOT_SET_INFORMATION Buffer
,
63 if (*BufferLength
< sizeof(FILE_MAILSLOT_SET_INFORMATION
))
64 return STATUS_BUFFER_OVERFLOW
;
66 Fcb
->TimeOut
= *Buffer
->ReadTimeout
;
68 return STATUS_SUCCESS
;
73 MsfsQueryInformation(PDEVICE_OBJECT DeviceObject
,
76 PIO_STACK_LOCATION IoStack
;
77 FILE_INFORMATION_CLASS FileInformationClass
;
78 PFILE_OBJECT FileObject
;
85 DPRINT("MsfsQueryInformation(DeviceObject %p Irp %p)\n",
88 IoStack
= IoGetCurrentIrpStackLocation (Irp
);
89 FileInformationClass
= IoStack
->Parameters
.QueryFile
.FileInformationClass
;
90 FileObject
= IoStack
->FileObject
;
91 Fcb
= (PMSFS_FCB
)FileObject
->FsContext
;
92 Ccb
= (PMSFS_CCB
)FileObject
->FsContext2
;
94 DPRINT("Mailslot name: %wZ\n", &Fcb
->Name
);
96 /* querying information is not permitted on client side */
97 if (Fcb
->ServerCcb
!= Ccb
)
99 Status
= STATUS_ACCESS_DENIED
;
101 Irp
->IoStatus
.Status
= Status
;
102 Irp
->IoStatus
.Information
= 0;
104 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
109 SystemBuffer
= Irp
->AssociatedIrp
.SystemBuffer
;
110 BufferLength
= IoStack
->Parameters
.QueryFile
.Length
;
112 switch (FileInformationClass
)
114 case FileMailslotQueryInformation
:
115 Status
= MsfsQueryMailslotInformation(Fcb
,
121 Status
= STATUS_NOT_IMPLEMENTED
;
124 Irp
->IoStatus
.Status
= Status
;
125 if (NT_SUCCESS(Status
))
126 Irp
->IoStatus
.Information
=
127 IoStack
->Parameters
.QueryFile
.Length
- BufferLength
;
129 Irp
->IoStatus
.Information
= 0;
130 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
137 MsfsSetInformation(PDEVICE_OBJECT DeviceObject
,
140 PIO_STACK_LOCATION IoStack
;
141 FILE_INFORMATION_CLASS FileInformationClass
;
142 PFILE_OBJECT FileObject
;
149 DPRINT("MsfsSetInformation(DeviceObject %p Irp %p)\n", DeviceObject
, Irp
);
151 IoStack
= IoGetCurrentIrpStackLocation (Irp
);
152 FileInformationClass
= IoStack
->Parameters
.QueryFile
.FileInformationClass
;
153 FileObject
= IoStack
->FileObject
;
154 Fcb
= (PMSFS_FCB
)FileObject
->FsContext
;
155 Ccb
= (PMSFS_CCB
)FileObject
->FsContext2
;
157 DPRINT("Mailslot name: %wZ\n", &Fcb
->Name
);
159 /* setting information is not permitted on client side */
160 if (Fcb
->ServerCcb
!= Ccb
)
162 Status
= STATUS_ACCESS_DENIED
;
164 Irp
->IoStatus
.Status
= Status
;
165 Irp
->IoStatus
.Information
= 0;
167 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
172 SystemBuffer
= Irp
->AssociatedIrp
.SystemBuffer
;
173 BufferLength
= IoStack
->Parameters
.QueryFile
.Length
;
175 DPRINT("FileInformationClass %d\n", FileInformationClass
);
176 DPRINT("SystemBuffer %p\n", SystemBuffer
);
178 switch (FileInformationClass
)
180 case FileMailslotSetInformation
:
181 Status
= MsfsSetMailslotInformation(Fcb
,
187 Status
= STATUS_NOT_IMPLEMENTED
;
190 Irp
->IoStatus
.Status
= Status
;
191 Irp
->IoStatus
.Information
= 0;
192 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);