[USB-BRINGUP-TRUNK]
[reactos.git] / drivers / serial / serial / info.c
1 /*
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
6 *
7 * PROGRAMMERS: Hervé Poussineau (hpoussin@reactos.org)
8 */
9
10 #include "serial.h"
11
12 NTSTATUS NTAPI
13 SerialQueryInformation(
14 IN PDEVICE_OBJECT DeviceObject,
15 IN PIRP Irp)
16 {
17 PIO_STACK_LOCATION Stack;
18 PVOID SystemBuffer;
19 ULONG BufferLength;
20 ULONG_PTR Information = 0;
21 NTSTATUS Status;
22
23 Stack = IoGetCurrentIrpStackLocation(Irp);
24 SystemBuffer = Irp->AssociatedIrp.SystemBuffer;
25 BufferLength = Stack->Parameters.QueryFile.Length;
26
27 switch (Stack->Parameters.QueryFile.FileInformationClass)
28 {
29 case FileStandardInformation:
30 {
31 PFILE_STANDARD_INFORMATION StandardInfo = (PFILE_STANDARD_INFORMATION)SystemBuffer;
32
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;
38 else
39 {
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;
47 }
48 break;
49 }
50 case FilePositionInformation:
51 {
52 PFILE_POSITION_INFORMATION PositionInfo = (PFILE_POSITION_INFORMATION)SystemBuffer;
53
54 ASSERT(PositionInfo);
55
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;
61 else
62 {
63 PositionInfo->CurrentByteOffset.QuadPart = 0;
64 Information = sizeof(FILE_POSITION_INFORMATION);
65 Status = STATUS_SUCCESS;
66 }
67 break;
68 }
69 default:
70 {
71 TRACE_(SERIAL, "IRP_MJ_QUERY_INFORMATION: Unexpected file information class 0x%02x\n", Stack->Parameters.QueryFile.FileInformationClass);
72 return ForwardIrpAndForget(DeviceObject, Irp);
73 }
74 }
75
76 Irp->IoStatus.Information = Information;
77 Irp->IoStatus.Status = Status;
78 IoCompleteRequest(Irp, IO_NO_INCREMENT);
79 return Status;
80 }