3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: drivers/dd/serial/info.c
6 * PURPOSE: Serial IRP_MJ_QUERY_INFORMATION operations
8 * PROGRAMMERS: Hervé Poussineau (poussine@freesurf.fr)
15 SerialQueryInformation(
16 IN PDEVICE_OBJECT DeviceObject
,
19 PSERIAL_DEVICE_EXTENSION DeviceExtension
;
20 PIO_STACK_LOCATION Stack
;
23 ULONG_PTR Information
= 0;
26 DeviceExtension
= (PSERIAL_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
27 Stack
= IoGetCurrentIrpStackLocation(Irp
);
28 SystemBuffer
= Irp
->AssociatedIrp
.SystemBuffer
;
29 BufferLength
= Stack
->Parameters
.QueryFile
.Length
;
31 switch (Stack
->Parameters
.QueryFile
.FileInformationClass
)
33 case FileStandardInformation
:
35 PFILE_STANDARD_INFORMATION StandardInfo
= (PFILE_STANDARD_INFORMATION
)SystemBuffer
;
37 DPRINT("Serial: IRP_MJ_QUERY_INFORMATION / FileStandardInformation\n");
38 if (BufferLength
< sizeof(FILE_STANDARD_INFORMATION
))
39 Status
= STATUS_BUFFER_OVERFLOW
;
40 else if (!StandardInfo
)
41 Status
= STATUS_INVALID_PARAMETER
;
43 StandardInfo
->AllocationSize
.QuadPart
= 0;
44 StandardInfo
->EndOfFile
.QuadPart
= 0;
45 StandardInfo
->Directory
= FALSE
;
46 StandardInfo
->NumberOfLinks
= 0;
47 StandardInfo
->DeletePending
= FALSE
; /* FIXME: should be TRUE sometimes */
48 Status
= STATUS_SUCCESS
;
52 case FilePositionInformation
:
54 PFILE_POSITION_INFORMATION PositionInfo
= (PFILE_POSITION_INFORMATION
)SystemBuffer
;
58 DPRINT("Serial: IRP_MJ_QUERY_INFORMATION / FilePositionInformation\n");
59 if (BufferLength
< sizeof(PFILE_POSITION_INFORMATION
))
60 Status
= STATUS_BUFFER_OVERFLOW
;
61 else if (!PositionInfo
)
62 Status
= STATUS_INVALID_PARAMETER
;
65 PositionInfo
->CurrentByteOffset
.QuadPart
= 0;
66 Status
= STATUS_SUCCESS
;
72 DPRINT("Serial: IRP_MJ_QUERY_INFORMATION: Unexpected file information class 0x%02x\n", Stack
->Parameters
.QueryFile
.FileInformationClass
);
73 return ForwardIrpAndForget(DeviceObject
, Irp
);
77 Irp
->IoStatus
.Information
= Information
;
78 Irp
->IoStatus
.Status
= Status
;
79 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);