2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: Serial port driver
4 * FILE: drivers/dd/serial/info.c
5 * PURPOSE: Serial IRP_MJ_QUERY_INFORMATION operations
7 * PROGRAMMERS: Hervé Poussineau (hpoussin@reactos.org)
13 SerialQueryInformation(
14 IN PDEVICE_OBJECT DeviceObject
,
17 PIO_STACK_LOCATION Stack
;
20 ULONG_PTR Information
= 0;
23 Stack
= IoGetCurrentIrpStackLocation(Irp
);
24 SystemBuffer
= Irp
->AssociatedIrp
.SystemBuffer
;
25 BufferLength
= Stack
->Parameters
.QueryFile
.Length
;
27 switch (Stack
->Parameters
.QueryFile
.FileInformationClass
)
29 case FileStandardInformation
:
31 PFILE_STANDARD_INFORMATION StandardInfo
= (PFILE_STANDARD_INFORMATION
)SystemBuffer
;
33 TRACE_(SERIAL
, "IRP_MJ_QUERY_INFORMATION / FileStandardInformation\n");
34 if (BufferLength
< sizeof(FILE_STANDARD_INFORMATION
))
35 Status
= STATUS_BUFFER_OVERFLOW
;
36 else if (!StandardInfo
)
37 Status
= STATUS_INVALID_PARAMETER
;
40 StandardInfo
->AllocationSize
.QuadPart
= 0;
41 StandardInfo
->EndOfFile
.QuadPart
= 0;
42 StandardInfo
->Directory
= FALSE
;
43 StandardInfo
->NumberOfLinks
= 0;
44 StandardInfo
->DeletePending
= FALSE
; /* FIXME: should be TRUE sometimes */
45 Information
= sizeof(FILE_STANDARD_INFORMATION
);
46 Status
= STATUS_SUCCESS
;
50 case FilePositionInformation
:
52 PFILE_POSITION_INFORMATION PositionInfo
= (PFILE_POSITION_INFORMATION
)SystemBuffer
;
56 TRACE_(SERIAL
, "IRP_MJ_QUERY_INFORMATION / FilePositionInformation\n");
57 if (BufferLength
< sizeof(FILE_POSITION_INFORMATION
))
58 Status
= STATUS_BUFFER_OVERFLOW
;
59 else if (!PositionInfo
)
60 Status
= STATUS_INVALID_PARAMETER
;
63 PositionInfo
->CurrentByteOffset
.QuadPart
= 0;
64 Information
= sizeof(FILE_POSITION_INFORMATION
);
65 Status
= STATUS_SUCCESS
;
71 TRACE_(SERIAL
, "IRP_MJ_QUERY_INFORMATION: Unexpected file information class 0x%02x\n", Stack
->Parameters
.QueryFile
.FileInformationClass
);
72 return ForwardIrpAndForget(DeviceObject
, Irp
);
76 Irp
->IoStatus
.Information
= Information
;
77 Irp
->IoStatus
.Status
= Status
;
78 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);