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
21 /* FUNCTIONS *****************************************************************/
24 MsfsQueryMailslotInformation(PMSFS_FCB Fcb
,
25 PFILE_MAILSLOT_QUERY_INFORMATION Buffer
,
30 if (*BufferLength
< sizeof(FILE_MAILSLOT_QUERY_INFORMATION
))
31 return STATUS_BUFFER_OVERFLOW
;
33 Buffer
->MaximumMessageSize
= Fcb
->MaxMessageSize
;
34 Buffer
->ReadTimeout
= Fcb
->TimeOut
;
36 KeAcquireSpinLock(&Fcb
->MessageListLock
, &oldIrql
);
37 Buffer
->MessagesAvailable
= Fcb
->MessageCount
;
38 if (Fcb
->MessageCount
== 0)
40 Buffer
->NextMessageSize
= MAILSLOT_NO_MESSAGE
;
44 PMSFS_MESSAGE Message
= CONTAINING_RECORD(Fcb
->MessageListHead
.Flink
,
47 Buffer
->NextMessageSize
= Message
->Size
;
49 KeReleaseSpinLock(&Fcb
->MessageListLock
, oldIrql
);
51 *BufferLength
-= sizeof(FILE_MAILSLOT_QUERY_INFORMATION
);
53 return STATUS_SUCCESS
;
58 MsfsSetMailslotInformation(PMSFS_FCB Fcb
,
59 PFILE_MAILSLOT_SET_INFORMATION Buffer
,
62 if (*BufferLength
< sizeof(FILE_MAILSLOT_SET_INFORMATION
))
63 return STATUS_BUFFER_OVERFLOW
;
65 Fcb
->TimeOut
= *Buffer
->ReadTimeout
;
67 return STATUS_SUCCESS
;
72 MsfsQueryInformation(PDEVICE_OBJECT DeviceObject
,
75 PIO_STACK_LOCATION IoStack
;
76 FILE_INFORMATION_CLASS FileInformationClass
;
77 PFILE_OBJECT FileObject
;
84 DPRINT("MsfsQueryInformation(DeviceObject %p Irp %p)\n",
87 IoStack
= IoGetCurrentIrpStackLocation (Irp
);
88 FileInformationClass
= IoStack
->Parameters
.QueryFile
.FileInformationClass
;
89 FileObject
= IoStack
->FileObject
;
90 Fcb
= (PMSFS_FCB
)FileObject
->FsContext
;
91 Ccb
= (PMSFS_CCB
)FileObject
->FsContext2
;
93 DPRINT("Mailslot name: %wZ\n", &Fcb
->Name
);
95 /* querying information is not permitted on client side */
96 if (Fcb
->ServerCcb
!= Ccb
)
98 Status
= STATUS_ACCESS_DENIED
;
100 Irp
->IoStatus
.Status
= Status
;
101 Irp
->IoStatus
.Information
= 0;
103 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
108 SystemBuffer
= Irp
->AssociatedIrp
.SystemBuffer
;
109 BufferLength
= IoStack
->Parameters
.QueryFile
.Length
;
111 switch (FileInformationClass
)
113 case FileMailslotQueryInformation
:
114 Status
= MsfsQueryMailslotInformation(Fcb
,
120 Status
= STATUS_NOT_IMPLEMENTED
;
123 Irp
->IoStatus
.Status
= Status
;
124 if (NT_SUCCESS(Status
))
125 Irp
->IoStatus
.Information
=
126 IoStack
->Parameters
.QueryFile
.Length
- BufferLength
;
128 Irp
->IoStatus
.Information
= 0;
129 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
136 MsfsSetInformation(PDEVICE_OBJECT DeviceObject
,
139 PIO_STACK_LOCATION IoStack
;
140 FILE_INFORMATION_CLASS FileInformationClass
;
141 PFILE_OBJECT FileObject
;
148 DPRINT("MsfsSetInformation(DeviceObject %p Irp %p)\n", DeviceObject
, Irp
);
150 IoStack
= IoGetCurrentIrpStackLocation (Irp
);
151 FileInformationClass
= IoStack
->Parameters
.QueryFile
.FileInformationClass
;
152 FileObject
= IoStack
->FileObject
;
153 Fcb
= (PMSFS_FCB
)FileObject
->FsContext
;
154 Ccb
= (PMSFS_CCB
)FileObject
->FsContext2
;
156 DPRINT("Mailslot name: %wZ\n", &Fcb
->Name
);
158 /* setting information is not permitted on client side */
159 if (Fcb
->ServerCcb
!= Ccb
)
161 Status
= STATUS_ACCESS_DENIED
;
163 Irp
->IoStatus
.Status
= Status
;
164 Irp
->IoStatus
.Information
= 0;
166 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
171 SystemBuffer
= Irp
->AssociatedIrp
.SystemBuffer
;
172 BufferLength
= IoStack
->Parameters
.QueryFile
.Length
;
174 DPRINT("FileInformationClass %d\n", FileInformationClass
);
175 DPRINT("SystemBuffer %p\n", SystemBuffer
);
177 switch (FileInformationClass
)
179 case FileMailslotSetInformation
:
180 Status
= MsfsSetMailslotInformation(Fcb
,
186 Status
= STATUS_NOT_IMPLEMENTED
;
189 Irp
->IoStatus
.Status
= Status
;
190 Irp
->IoStatus
.Information
= 0;
191 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);