167 lines
4.2 KiB
C
167 lines
4.2 KiB
C
#include "pch.h"
|
||
|
||
NTSTATUS
|
||
PptPdoQueryInformation(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine is used to query the end of file information on
|
||
the opened parallel port. Any other file information request
|
||
is retured with an invalid parameter.
|
||
|
||
This routine always returns an end of file of 0.
|
||
|
||
Arguments:
|
||
|
||
DeviceObject - Supplies the device object.
|
||
|
||
Irp - Supplies the I/O request packet.
|
||
|
||
Return Value:
|
||
|
||
STATUS_SUCCESS - Success.
|
||
STATUS_INVALID_PARAMETER - Invalid file information request.
|
||
STATUS_BUFFER_TOO_SMALL - Buffer too small.
|
||
|
||
--*/
|
||
|
||
{
|
||
NTSTATUS Status;
|
||
PIO_STACK_LOCATION IrpSp;
|
||
PFILE_STANDARD_INFORMATION StdInfo;
|
||
PFILE_POSITION_INFORMATION PosInfo;
|
||
PPDO_EXTENSION Extension = DeviceObject->DeviceExtension;
|
||
|
||
UNREFERENCED_PARAMETER(DeviceObject);
|
||
|
||
//
|
||
// bail out if device has been removed
|
||
//
|
||
if(Extension->DeviceStateFlags & (PPT_DEVICE_REMOVED|PPT_DEVICE_SURPRISE_REMOVED) ) {
|
||
P4CompleteRequest( Irp, STATUS_DEVICE_REMOVED, Irp->IoStatus.Information );
|
||
return STATUS_DEVICE_REMOVED;
|
||
}
|
||
|
||
Irp->IoStatus.Information = 0;
|
||
|
||
IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
||
|
||
switch (IrpSp->Parameters.QueryFile.FileInformationClass) {
|
||
|
||
case FileStandardInformation:
|
||
|
||
if (IrpSp->Parameters.QueryFile.Length < sizeof(FILE_STANDARD_INFORMATION)) {
|
||
|
||
Status = STATUS_BUFFER_TOO_SMALL;
|
||
|
||
} else {
|
||
|
||
StdInfo = Irp->AssociatedIrp.SystemBuffer;
|
||
StdInfo->AllocationSize.QuadPart = 0;
|
||
StdInfo->EndOfFile = StdInfo->AllocationSize;
|
||
StdInfo->NumberOfLinks = 0;
|
||
StdInfo->DeletePending = FALSE;
|
||
StdInfo->Directory = FALSE;
|
||
|
||
Irp->IoStatus.Information = sizeof(FILE_STANDARD_INFORMATION);
|
||
Status = STATUS_SUCCESS;
|
||
|
||
}
|
||
break;
|
||
|
||
case FilePositionInformation:
|
||
|
||
if (IrpSp->Parameters.SetFile.Length < sizeof(FILE_POSITION_INFORMATION)) {
|
||
|
||
Status = STATUS_BUFFER_TOO_SMALL;
|
||
|
||
} else {
|
||
|
||
PosInfo = Irp->AssociatedIrp.SystemBuffer;
|
||
PosInfo->CurrentByteOffset.QuadPart = 0;
|
||
|
||
Irp->IoStatus.Information = sizeof(FILE_POSITION_INFORMATION);
|
||
Status = STATUS_SUCCESS;
|
||
}
|
||
break;
|
||
|
||
default:
|
||
Status = STATUS_INVALID_PARAMETER;
|
||
break;
|
||
|
||
}
|
||
|
||
P4CompleteRequest( Irp, Status, Irp->IoStatus.Information );
|
||
|
||
return Status;
|
||
}
|
||
|
||
NTSTATUS
|
||
PptPdoSetInformation(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine is used to set the end of file information on
|
||
the opened parallel port. Any other file information request
|
||
is retured with an invalid parameter.
|
||
|
||
This routine always ignores the actual end of file since
|
||
the query information code always returns an end of file of 0.
|
||
|
||
Arguments:
|
||
|
||
DeviceObject - Supplies the device object.
|
||
|
||
Irp - Supplies the I/O request packet.
|
||
|
||
Return Value:
|
||
|
||
STATUS_SUCCESS - Success.
|
||
STATUS_INVALID_PARAMETER - Invalid file information request.
|
||
|
||
--*/
|
||
|
||
{
|
||
NTSTATUS Status;
|
||
FILE_INFORMATION_CLASS fileInfoClass;
|
||
PPDO_EXTENSION Extension = DeviceObject->DeviceExtension;
|
||
|
||
UNREFERENCED_PARAMETER(DeviceObject);
|
||
|
||
//
|
||
// bail out if device has been removed
|
||
//
|
||
if(Extension->DeviceStateFlags & (PPT_DEVICE_REMOVED|PPT_DEVICE_SURPRISE_REMOVED) ) {
|
||
|
||
return P4CompleteRequest( Irp, STATUS_DEVICE_REMOVED, Irp->IoStatus.Information );
|
||
|
||
}
|
||
|
||
|
||
Irp->IoStatus.Information = 0;
|
||
|
||
fileInfoClass = IoGetCurrentIrpStackLocation(Irp)->Parameters.SetFile.FileInformationClass;
|
||
|
||
if (fileInfoClass == FileEndOfFileInformation) {
|
||
|
||
Status = STATUS_SUCCESS;
|
||
|
||
} else {
|
||
|
||
Status = STATUS_INVALID_PARAMETER;
|
||
|
||
}
|
||
|
||
return P4CompleteRequest( Irp, Status, Irp->IoStatus.Information );
|
||
}
|